ch2_线性表.ppt
《ch2_线性表.ppt》由会员分享,可在线阅读,更多相关《ch2_线性表.ppt(178页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机软件基础计算机软件基础张新峰张新峰综合楼综合楼802Email:Tel:1587-802课件下载:课件下载:zxf_Key:rjjsjc1Ch2 线性数据结构线性数据结构2.1数据结构产生的背景数据结构产生的背景2.2 基本概念基本概念2.3 线性表线性表2.4 栈和队列栈和队列2.5 串和数组串和数组22.2.1 线性表的定义线性表的定义定定义义2-1 线线性性表表(Linear-list)是是n(n0)个个数数据元素的有限序列。记为:据元素的有限序列。记为:(a1,a2,.,an)其其中中,数数据据元元素素个个数数n称称为为表表的的长长度度,n=0时,称此线性表为空表时,称此线性表为
2、空表。3L=(a1,a2,a3,a4,a5,a6,.,an)ai-1,ai ,ai+1直接前驱直接前驱 直接后继直接后继线性表长度线性表长度线性表的逻辑结构线性表的逻辑结构4线性表的特点线性表的特点同一性:线性表由同类数据元素组成,每同一性:线性表由同类数据元素组成,每一个一个ai必须属于同一数据对象。必须属于同一数据对象。有穷性:线性表由有限个数据元素组成,有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数。表长度就是表中数据元素的个数。有序性:线性表中表中相邻数据元素之间有序性:线性表中表中相邻数据元素之间存在着序偶关系存在着序偶关系。5线性表举例线性表举例例例2-1 26个
3、大写的英文字母表:个大写的英文字母表:(A,B,C,.,Z)例例2-2 某某校校从从1996年年到到2002年年各各种种型型号号计计算算机机拥拥有有量量的的变变化化情情况况,可可以以用用线线性性表表给给出:出:(200,220,250,300,400,700,1200)6姓姓 名名学学 号号性性 别别年年 龄龄 健康情况健康情况王小林王小林790631 男男 18 健康健康陈陈 红红790632 女女 20 一般一般刘建平刘建平790633 男男 21 健康健康张立立张立立790634 男男 17 贫血贫血.例例2-3 学生健康情况登记表学生健康情况登记表7线性表的基本操作线性表的基本操作(1
4、)INITIATE(L)初始化操作,设定一个空的线性表初始化操作,设定一个空的线性表L。(2)LENGTH(L)求表长,求出线性表求表长,求出线性表L中数据元素个数。中数据元素个数。(3)GET(L,i)取元素函数,若取元素函数,若1iLENGTH(L),则函数值为给定线性则函数值为给定线性表表L中第中第i个数据元素,否则为空元素个数据元素,否则为空元素NULL。(4)PRIOR(L,elm)。求前趋函数,若求前趋函数,若elm的位序大于的位序大于1,则函数值为,则函数值为elm的前趋,的前趋,否则为空元素。否则为空元素。8线性表的基本操作线性表的基本操作(5)NEXT(L,elm)。求后继函
5、数,若求后继函数,若elm的位序小于的位序小于LENGTH(L),则函数值为,则函数值为elm的后继,否则为空元素。的后继,否则为空元素。(6)LOCATE(L,x)。定位函数,返回元素定位函数,返回元素x在线性表在线性表L中的位置。若中的位置。若L中有多个中有多个x,则只返回第一个,则只返回第一个x的位置,若在的位置,若在L中不存在中不存在x,则返回,则返回0。(7)INSERT(L,i,x)。插入操作,在线性表插入操作,在线性表L中的第中的第i个位置上插入元素个位置上插入元素x,运算结,运算结果使得线性表的长度增加果使得线性表的长度增加1。9线性表的基本操作线性表的基本操作(8)DELET
6、E(L,i)。删除操作,若删除操作,若1iLENGTH(L),删除给定线性表,删除给定线性表L中的第中的第i个数据元素,使得线性表的长度减个数据元素,使得线性表的长度减1。(9)EMPTY(L)。判空表函数,若判空表函数,若L为空表,则返回布尔值为空表,则返回布尔值“true”,否则返回布尔值,否则返回布尔值“false”。其他的操作:合并,排序。其他的操作:合并,排序。10线性表的顺序存储结构线性表的顺序存储结构将线性表的元素按其逻辑次序依次存将线性表的元素按其逻辑次序依次存放在一组地址连续的存储单元里。放在一组地址连续的存储单元里。采用顺序存储结构的线性表通常称为采用顺序存储结构的线性表通
7、常称为顺序表顺序表。11bb+lenb+(i-1)*lenb+(n-1)*lenb+(maxlen-1)*lena1a2aian空闲空闲Loc(ai)=Loc(a1)+(i-1)*len随随机机存存取取结结构构 线线性性表表的的顺顺序序存存储储结结构构12顺序存储结构的顺序存储结构的C语言实现语言实现 typedef int datatype;/*datatype可为任何类型,这里假设为可为任何类型,这里假设为int*/#define maxlen 1024 /*线性表可能的最大长度,这里假设为线性表可能的最大长度,这里假设为1024*/typedef struct datatype data
8、maxlen;int last;/最后一个元素在数组中位置(逻辑位置),最后一个元素在数组中位置(逻辑位置),即线性表的长度。即线性表的长度。sequenlist;13表的初始化表的初始化算法算法1 void InitList(sequenlist*L)/分配顺序表的动态存储空间,将表的长度置为分配顺序表的动态存储空间,将表的长度置为0 L=(sequenlist*)malloc(sizeof(sequenlist);L-last=0;14表的初始化表的初始化 算法算法2 sequenlist*initList()sequenlist*L=(sequenlist*)malloc(sizeof(
9、sequenlist);L-last=0;return L;15线线性性表表的的插插入入a1:ai1aiai+1:an:a1:ai1aiai+1:an:aix插入插入x注意插入元素后:表长注意插入元素后:表长+116算法设计:算法设计:q命名命名:Insertq入口参数入口参数Lixq出口参数出口参数:L及插入是否成功标志及插入是否成功标志插入算法参数设置插入算法参数设置17需要考虑的问题:需要考虑的问题:q插入位置是否合理插入位置是否合理?q是否有空间是否有空间?q插入动作插入动作移动移动插入插入修改长度修改长度插入算法步骤插入算法步骤18int insert(sequenlist*L,in
10、t x,int i)int j;if(L-last=maxsize)print(“表已满表已满”);return 0;else if(i L-last+1)print(“非法插入位置非法插入位置”);return 0;else for(j=L-last-1 ;j=i-1;j-)L-dataj+1=L-dataj;/结点后移结点后移 L-datai1=x;/插入到插入到L-datai中中 L-last+;/表长度加表长度加1 return 1;19插入算法分析插入算法分析思考:数据元素合法的插入位置有多少个?思考:数据元素合法的插入位置有多少个?假假设设在在表表的的任任一一合合法法位位置置插插入
11、入新新元元素素的的概概率率p均均等等,则则 p 1/(n+1)则插入操作中元素的平均移动次数则插入操作中元素的平均移动次数20a1:ai1aiai+1:an:a1:ai1ai+1:an:删除删除注意删除元素后:表长注意删除元素后:表长1线线性性表表的的删删除除21算法设计算法设计q命名命名:deleteq入口参数入口参数Liq出口参数出口参数:L及删除是否成功标志及删除是否成功标志删除算法参数设置删除算法参数设置22需要考虑的问题需要考虑的问题:删除位置是否合理删除位置是否合理?表是否为空表是否为空?删除操作删除操作保存被删除的元素内容保存被删除的元素内容保存被删除的元素内容保存被删除的元素内
12、容移动移动移动移动修改长度修改长度修改长度修改长度删除算法的步骤删除算法的步骤23int delete(sequenlist*L,int i)int j;if(iL-last)print(“非法删除位置非法删除位置”);return 0;else for(j=i;j last-1;j+)L-dataj-1=L-dataj;/结点前移结点前移 L-last-;/表长度减表长度减1 return 1;24删除算法分析删除算法分析思考:合法的删除位置个数?思考:合法的删除位置个数?假假设设在在表表的的任任一一合合法法删删除除位位置置删删除除元元素素的的概概率率p均等,则均等,则 p1/n 则插入操作
13、中元素的平均移动次数则插入操作中元素的平均移动次数25线性表的顺序存储结构特点线性表的顺序存储结构特点优点优点元素的逻辑关系相邻,物理位置上也相邻。元素的逻辑关系相邻,物理位置上也相邻。随机存取随机存取缺点缺点在作插入或删除操作时,需移动大量元素;在作插入或删除操作时,需移动大量元素;长长度度变变化化较较大大的的线线性性表表预预先先分分配配空空间间时时,须须按按最大空间分配,存储空间不能得到充分利用;最大空间分配,存储空间不能得到充分利用;表的容量难以扩充。表的容量难以扩充。26作业作业1.已知一个顺序表已知一个顺序表L的元素按照值非递减有序排的元素按照值非递减有序排列,试用列,试用C语言编写
14、一个算法将元素语言编写一个算法将元素x插入,插插入,插入后该表仍然保持非递减有序排列。入后该表仍然保持非递减有序排列。2.用顺序表用顺序表A、B表示集合,试用表示集合,试用C语言编写算语言编写算法求集合法求集合A和集合和集合B的交集(假设的交集(假设A、B内无重复内无重复元素)。元素)。27线性表的顺序存储结构特点线性表的顺序存储结构特点n顺顺序序存存储储结结构构适适合合于于表表中中元元素素变变动动较较少少的的情况情况n原因:存放的连续性原因:存放的连续性n突破突破n用用地地址址任任意意的的存存储储单单元元存存放放,主主要要指指离离散散存放存放n用指针来表示元素之间的关系用指针来表示元素之间的
15、关系28顺序存储结构顺序存储结构链式存储结构链式存储结构29单链表结点的概念单链表结点的概念数据元素内容数据元素内容该数据元素的该数据元素的直接后继地址直接后继地址datanext数据域数据域指针域指针域30链表结点的链表结点的C语言描述语言描述结点的结点的C语言描述为:语言描述为:struct node int data;struct node*next;typedef struct node NODE;31a1a3a2a4head可用存储空间可用存储空间单链表结构单链表结构不同结点存储位置一般是分散的,但每个结点不同结点存储位置一般是分散的,但每个结点所包含的数据项却是存放在一小块连续的空
16、间中所包含的数据项却是存放在一小块连续的空间中32a1a3a2a4head单链表结构单链表结构l 为了顺次访问每个结点,需要保存单链表第一个为了顺次访问每个结点,需要保存单链表第一个结点的存储地址,这个地址称为线性表的头指针。结点的存储地址,这个地址称为线性表的头指针。l 头指针在单链表中一般不后移。头指针在单链表中一般不后移。33存储地址存储地址数据域数据域指针域指针域 1horse8 8monkey40 15pandaNULL 23cat1 35pig15 40elephant3523头指针头指针headcathorsemonkeyelephantpigpanda线性链表的逻辑状态示意图线
17、性链表的逻辑状态示意图线性链表的物理状态示意图线性链表的物理状态示意图线性链表举例线性链表举例head34a1ana2headhead不带头结点的单链表不带头结点的单链表两种链表两种链表a 非空表非空表b 空表空表a1anheada2head带头结点的单链表带头结点的单链表a 非空表非空表b 空表空表35链表结点的链表结点的C语言描述语言描述 struct node int data;struct node*next;typedef struct node NODE;36链表基本操作链表基本操作-初始化初始化NODE*Init()/建立一个空的单链表建立一个空的单链表 L=(NODE*)mal
18、loc(sizeof(NODE);if(L=NULL)printf(“无内存空间可分配无内存空间可分配”);exit(0);L-next=NULL;return L;37链表基本操作链表基本操作-求表长求表长int Length(NODE*L)/求带头结点的单链表的长度求带头结点的单链表的长度NODE*p;p=L-next;/p指向第一结点指向第一结点 j=0;while(p)j+;p=p-next;/移移动动p指向下一结点指向下一结点 return j;38链表基本操作链表基本操作-取第取第i个元素个元素NODE*Get(NODE*L,int i);NODE*p;if(inext;j=1;w
19、hile(p!=NULL&jnext;j+;if(j=i)return p;else return NULL;39链表基本操作链表基本操作-按值查找按值查找NODE*Locate(NODE*L,int x)NODE*p;p=L-next;while(p!=NULL&p-data!=x)p=p-next;if(!p)printf(“无所无所查查找的找的结结点点”);return NULL;else return p;40链表基本操作查找链表基本操作查找问题描述:查找链表的第问题描述:查找链表的第i 个结点个结点问题分析:问题分析:输入:链表,输入:链表,i输出:指向第输出:指向第i个结点的指针个
20、结点的指针41链表查找链表查找a1a2aiheadpppp42查找步骤查找步骤step1 初始化初始化,指针指针p指向头指针指向头指针,计数器置计数器置0step2 p非空且计数器小于非空且计数器小于i循环循环step3 每循环一次每循环一次,p后移一个位置后移一个位置,计数器加计数器加1step4 循环结束循环结束,返回指向返回指向ai 的指针的指针p43NODE*get(NODE*head,int i)NODE*p;int counter=0;/指针指针p指向头结点指向头结点 p=head;while(p!=NULL)&(counter next;/计数器加计数器加1 counter+;/
21、找到结点找到结点 if(p!=NULL)&(counter=i)/*找到找到,1=in或或idata=x s-next=p-next p-next=sai-1aipsx插入算法步骤插入算法步骤52void insert(NODE*head,int i,int x)NODE*p,*s;int j=0;p=head;while(p!=NULL)&(j next;j+;if(p=NULL)|(j i-1)printf(i值不合法值不合法 n);/*找不到找不到,in或或i data=x;s-next=p-next;p-next=s;53ai-1pai+1ait删除操作删除操作54step1 找到找到
22、ai-1的的位置位置,使指针使指针p指向指向ai-1step2 使指针使指针t指向指向p所指结点的后继所指结点的后继step3 使使t所指结点所指结点ai 脱脱链链step4 释放释放t。删除步骤删除步骤 55void delete(NODE*head,int i)NODE*p,*s;int j=0;p=head;while(p-next!=NULL)&(j next;j+;if(p-next=NULL)|(j i-1)printf(“i值不合法值不合法 n”);/*找不到找不到,in或或i next;p-next=s-next;free(s);56算法设计算法设计q命名命名:createli
23、nk1q入口参数入口参数:无无q出口参数出口参数:head反向建立链表反向建立链表57q创建头结点;创建头结点;q重复下列操作重复下列操作N次:次:输入元素信息;输入元素信息;创建结点;创建结点;将新结点插入到首端。将新结点插入到首端。反向建立链表算法步骤反向建立链表算法步骤58反向建立链表反向建立链表headAN-1sheadAN-1AN-2AN-1Ai+1headAis59反向建立链表反向建立链表C程序实现程序实现#define N m /*m为链表中数据元素的个数为链表中数据元素的个数*/int AN;NODE*creatlink1()NODE*head,*s;int i;/*生成头结点
24、生成头结点*/head=(NODE*)malloc(sizeof(NODE);/*置空表置空表 */head-next=NULL;60for(i=N-1;i=0;i-)/*插入插入N个数据个数据 */*生成新结点生成新结点*/s=(NODE*)malloc(sizeof(NODE);/*将输入数据放入新结点数据域将输入数据放入新结点数据域*/s-data=Ai;/*新结点与原首结点链接新结点与原首结点链接*/s-next=head-next;/*将新结点插入到表头将新结点插入到表头*/head-next=s;/*返回单链表头指针返回单链表头指针*/return head;61算法设计算法设计q
25、命名命名:creatlink2q入口参数入口参数:无无q出口参数出口参数:h正向建立链表正向建立链表62q创建创建(设置设置)头结点头结点(head);q重复下列操作重复下列操作n次:次:输入元素信息输入元素信息;创建结点;创建结点;将新结点插到链表的尾端。将新结点插到链表的尾端。q设置尾指针设置尾指针p为空;为空;正向建立链表算法步骤正向建立链表算法步骤63正向建立链表正向建立链表headA0sheadA0Ai-1A0headAip spspp64正向建立链表正向建立链表C程序实现程序实现NODE*creatlink2()NODE*head,*p,*s;int num;/*生成头结点生成头结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ch2_ 线性
限制150内