1、SCIE, University of Electronic Science and Technology of China,1,第二章 线性结构,线性表 堆栈 队列 串 二维数组,2,2.1线性表,线性表的定义线性表是n个相同类型数据元素的有限线性序列,通常记为(a1, a2,a3,an)。线性表特点: 各元素数据类型必须相同 数据ai可以是数字、字符和记录等例1 (1,1,2,3,5,8,13);例2 (Sun,Mon,The,wed,Thu,Fri,Sat)例3 学生成绩表,SCIE, University of Electronic Science and Technology of
2、China,3,2.1线性表,逻辑结构:元素及元素之间的关系为线性;,(1)有且仅有一个开始节点(该节点只有一个直接后继节点,没有直接前趋节点),(2)有且仅有一个结束节点(该节点只有一个直接前趋节点,没有直接后继节点),(3)其余节点有且仅有一个直接前趋和一个直接后继,SCIE, University of Electronic Science and Technology of China,4,2.1线性表,线性表不同的实现方式:2.1.1顺序表 数组存储顺序表定义顺序表基本操作:遍历、插入、删除顺序表算法分析 2.1.2单链表 2.1.3双向链表 链接存储 2.1.4循环链表,SCIE,
3、 University of Electronic Science and Technology of China,5,2.1.1顺序表,一、定义采用顺序存储结构的线性表通常称为顺序表用一组地址连续的存储单元依次存储线性表的数据元素。,内存,存储地址,元素序号,1 2in,特点: 实现逻辑上相邻物理地址相邻 随机存取,Loc(a1) Loc(a1)+k Loc(a1)+(i-1)*k Loc(a1)+(n-1)*k,SCIE, University of Electronic Science and Technology of China,6,2.1.1顺序表,可以借助于高级程序设计语言中的数
4、组来表示:数组的下标与元素在线性表中的序号相对应。顺序表说明: typedef struct list_typeelemtype data MAXNUM ;int length; list_type; list_type list;问题: 如何获得第i的数据元素?list.datai 0i length,SCIE, University of Electronic Science and Technology of China,7,2.1.1顺序表,二、顺序表的基本操作 遍历(查询) 插入 删除 ,SCIE, University of Electronic Science and Techn
5、ology of China,8,2.1.1顺序表,遍历运算 问题描述 在第1个元素到第length个元素依次取值,a1 a2 ai an,SCIE, University of Electronic Science and Technology of China,9,2.1.1顺序表,for( i = 0; i table.length; i+ ),typedef struct list_typeelemtype data MAXNUM ;int length; list_type; list_type table;,table.data i ,。,SCIE, University of E
6、lectronic Science and Technology of China,10,2.1.1顺序表,插入运算 问题描述 在第i个元素前插入一个新元素new_node。,a1,a2,ai-1,ai,an,a1,a2,ai-1,new node,ai+1,逐个向后挪动,SCIE, University of Electronic Science and Technology of China,11,2.1.1顺序表,从ai开始逐个向后,每个元素向后移动从an开始逐个向前,每个元素向后移一格,a1,a2,ai-1,ai,ai+1,an,ai,ai,ai,ai,a1,a2,ai-1,ai,ai
7、+1,an,an,ai+1,ai,for( j = i; j = table.length; j+)table.data j+1 = table.data j ; ,for( j = table.length; j = i; j-)table.data j+1 = table.data j ; ,new node,SCIE, University of Electronic Science and Technology of China,12,2.1.1顺序表,算法输入: table: 指向线性表的指针 new_node:需要插入的元素 location:插入的位置,在其之前插入 输出 tab
8、le:线性表指针,void insert( table, new_node, location) ;,;,SCIE, University of Electronic Science and Technology of China,13,2.1.1顺序表,算法,搬动节点,腾空位置,在腾空的位置处,放入新的元素,数组长度因为增加了一个新元素而加一,void insert( table, new_node, location),;,SCIE, University of Electronic Science and Technology of China,14,2.1.1顺序表,void inse
9、rt(table, new_node, location),for(j = table-length-1 ; j = location; j-)table-data j+1 = table-data j ; ,table-data location = new_node;,table-length = table-length +1;,if(table-length = MAXNUM)error(1); else,if(locationtable-length)error(2); else,location location 1;,SCIE, University of Electronic
10、Science and Technology of China,15,2.1.1顺序表,void error(int number)switch(number)case 1:printf(“the table is full”);break;case 2:printf(“cant insert at location”);break;default:printf(“unknown error”); ,SCIE, University of Electronic Science and Technology of China,16,2.1.1顺序表,an,ai,删除运算 问题描述:删除第i个元素
11、 算法实现分析,a1,a2,ai,an,ai1,a1,a2,ai1,ai+1,删除算法是否与插入算法一样有个方向和过程的问题?,SCIE, University of Electronic Science and Technology of China,17,2.1.1顺序表,for( j = i; j table.length; j+)table.data j = table.data j+1 ; ,for( j = table.length; j i; j- -)table.data j-1 = table.data j ; ,关键技术分析 从an开始逐个向前,每个元素向前移动从ai1开始
12、逐个向后,每个元素向前移动,a1,a2,ai+1,ai,an,ai-1,an,an,an,for( j = table.length-1; j i; j- -)table.data j-1 = table.data j ; ,a1,a2,ai-1,ai,ai+1,an,for( j = i; j table.length-1; j+)table.data j = table.data j+1 ; ,SCIE, University of Electronic Science and Technology of China,18,2.1.1顺序表,算法输入 table:线性表指针 locatio
13、n:需要删除的节点位置 输出 table:线性表指针,void delete(table, location),SCIE, University of Electronic Science and Technology of China,19,2.1.1顺序表,算法,1、从ai节点开始,向后逐个向前搬动节点, 挤掉第i个元素,2、数组长度因为减少了一个新元素而减一,void delete(table, location),SCIE, University of Electronic Science and Technology of China,20,2.1.1顺序表,void delete(
14、table, location),for(j = location ; j length-1; j+),table-length = table-length -1;,if(table-length 1)error(3); else,if(location table-length)error(4); else,location location 1;,table-data j = table-data j+1 ;,SCIE, University of Electronic Science and Technology of China,21,2.1.1顺序表,void error(int
15、number)switch(number)case 1:printf(“the table is full”);break;case 2:printf(“cant insert at location”);break;case 3:printf(“the table is empty”);break;default:printf(“unknown error”); ,SCIE, University of Electronic Science and Technology of China,22,2.1.1顺序表,编写算法的一般步骤: 1、分析问题描述 输入,输出及模块功能等 2、分析算法实现
16、的总体框架,关键问题的突破方法 3、核心算法的实现 4、算法补充完善, 如:增加算法有效性的保护措施越界判断等,SCIE, University of Electronic Science and Technology of China,23,2.1.1顺序表,数组顺序存储结构的特点 元素随机获取特性。 存取时间短,存取时间与位置无关 算法效率(时间复杂度): 元素更动的搬移性 平均N/2次的搬移算法效率,O(1),O(n),SCIE, University of Electronic Science and Technology of China,24,2.1.1顺序表,例:设线性表的元素个
17、数为N,请计算插入一个节点 需要移动的节点的平均个数?,观察:在表首插入一个节点,需要搬移的节点个数为,在ai处插入一个节点,则需要搬移的节点个数为,a1,a2,ai-1,ai,an,ai+1,在a1后插入一个节点,需要搬移的节点个数为,在各处插入节点的概率为,平均搬移节点个数为,N,1,N,N,1,(N-1),N,1,(N-2),N,1,(N-3),N,1,1,+,N,1,(N,(N-1),(N-2),=,1,),=,N,1,2,N(N+1),.,N/2,N,N-1,N-i,1/N,SCIE, University of Electronic Science and Technology of China,25,2.1.1顺序表,作业:教材P74第9题,