c++课件线性表.ppt
《c++课件线性表.ppt》由会员分享,可在线阅读,更多相关《c++课件线性表.ppt(85页珍藏版)》请在三一办公上搜索。
1、第二章 线性表(linear list),线性表的定义及运算线性表的顺序存储结构(顺序表)线性表的链式存储结构(链表),2.1 线性表的定义及运算 2.1.1.线性表的定义:是由n(n=0)个数据元素(结点)a1,a2,a3,an组成 的有限序列。其中:n为数据元素的个数,也称为表的长度。当n=0 时,称为空表。非空的线性表(n0)记作:(a1,a2,a3,an)线性表的特性:(1)线性表中的所有数据元素的数据类型是一致的。(2)数据元素在线性表中的位置只取决于它的序号。(3)结点间的逻辑关系是线性的。,(1)有且仅有一个开始结点a1(无直接前趋);(2)有且仅有一个终端结点an(无直接后继)
2、;(3)其余的结点ai 都有且仅有一个直接前趋ai-1和一个直接后继ai+1。(4)ai是属于某个数据对象的元素,它可以是一个数字、一个字母或一个记录。,例126个英文字母组成的字母表(A,B,C、Z)例2某校从1978年到1983年各种型号的计算机拥有量的变化情况。(6,17,28,50,92,188),2.1.2 线性表(a1,a2,a3,an)的逻辑特征:,例3、学生健康情况登记表如下:,数据的运算是定义在逻辑结构上的,而具体的实现则在存储结构上进行。(1)存取(2)插入(3)删除(4)查找(5)合并(6)分解(7)排序(8)求线性表的长度,基本运算,2.1.3.线性表的运算,2.2 线
3、性表的顺序存储结构(顺序表)2.2.1.顺序表的定义:用一组连续的存储单元(地址连续)依次存放线性表的各个数据元素。即:在顺序表中逻辑结构上相邻的数据元素,其物理位置也是相邻的。,2.2.2 顺序表中数据元素的存储地址若一个数据元素仅占一个存储单元,则其存储方式如下图。,从图中可见,第i个数据元素的地址为:LOC(a i)=loc(a 1)+(i-1),若每个数据元素占用m个存储单元,则第i个数据元素的存储位置为:LOC(a i)=loc(a 1)+(i-1)*m其中:loc(a 1)称为基地址(第一个数据元素的存储位置)。显然,数据元素在顺序表中位置取决于数据元素在线性表中的位置。顺序表的特
4、点是:逻辑位置相邻,其物理位置也相邻。例:一个向量第一个元素的存储地址是100,每个元素的长度为2,则第五个元素的存储地址是 _,108,2.2.3 顺序表的描述:可用C语言的一维数组实现:#define M 100int vM;其中:M 是大于线性表长度的一个整数,它可根据实际需要而修改。线性表的各个元素a1,a2,a3,an可依次存入在向量v的各个分量v1,v2,.,vn中。,Sqlist类型定义,#define len 100/线性表存储空间的初始分配量#define skip 10/线性表存储空间的分配增量Typedef struct ElemType*elem;/存储空间基址 int
5、 length;/当前长度 int listsize;/当前分配的存储容量(以 sizeof(ElemType)为单位)SqList;,2.2.4 顺序表的几种基本运算,顺序表的初始化,Status InitList_Sq(SqList/InitList_Sq,(1)删除算法 将线性表的第i(1=i=n)个结点删除,使:长度为n的线性表变为长度为n-1的线性表。(a1,a2,ai-1,ai,ai+1,an),(a1,a2,ai-1,ai+1,an),2.2.4 顺序表的几种基本运算,删除算法的思想:1.若i=n,只需删除终端结点,不用移动结点;2.若表长度n=0或删除位置不适当,则输出错误信息
6、,并返回-1;3.当1=in时,则将表中结点ai+1,ai+2,an依次向前移动一个位置(共需移动n-i个数据元素)。4.最后将表长n减1,删除成功,函数返回值为0。,删除算法实现,Void deleteList(Sqlist 注:Sqlist类型定义见教材22页,删除算法分析:上述算法for循环语句的执行次数为n-i;若i=1,最坏:O(n)若i=n,无需用移动结点,直接删除即可。(最好O(1))移动结点的平均次数:,按等概率考虑:可能的删除位置为i=1,2,n共n个,则pi=1/n所以,顺序表删除算法平均约需移动一半结点。,2.2.4 顺序表的几种基本运算(2)插入运算 在第i(1=i=n
7、)个元素之前插入一个新的数据元素x。使:长度为n的线性表变为长度为n+1的线性表(a1,a2,ai-1,ai,an),(a1,a2,ai-1,x,ai,an),插入算法的思想:1.若i=n+1,则将x插入到表尾;2.若表长度n0或插入位置不适当,则输出错误信息,并返回-1;3.当1=i=n时,则从表尾开始到第i个元素,依次向后移动一个位置(共需移动n-i+1个数据元素)。4.最后将x存入vi中,表长n增加1,插入成功,函数返回值为0。,插入算法实现,int insertlist(v,pn,i,x)int v,x,*pn,i;/*-pn指向表长n的地址。-*/int j;if(*pn*pn+1)
8、printf(“插入位置i不适当n);return(-1);,for(j=*pn;j=i;j-)vj+1=vj;vi=x;(*pn)+;printf(successn);return(0);算法调用:k=insertlist(v,&n,i,x),移动结点的平均次数:,插入算法分析:,上述算法for循环语句的执行次数为n-i+1;,若i=1,需移动全部n个结点(最坏:O(n)),若i=n+1(在表尾插入),无需用移动结点,直接插入即可。(最好O(1)),按等概率考虑:可能的插入位置为i=1,2,n,n+1共n+1个,则pi=1/(n+1)所以,顺序表插入算法平均约需移动一半结点。小结:顺序表插入
9、、删除算法平均约需移动一半结点,当n很大时,算法的效率较低。,优点:(1)无须为表示结点间的逻辑关系而增加额外的存储空间。(2)可以随机地访问表元素。缺点:(1)插入和删除平均须移动一半结点。(2)存储分配只能预先进行(静态)过大-浪费 过小-溢出,顺序表的优、缺点,2.3 线性表的链式存储结构(链表),2.3.1 基本知识链表:用一组任意的存储单元(可以是无序的,即可零散地分布在内存中的任何位置上)存放线性表的数据元素。链表的特点:链表中结点的逻辑次序和物理次序不一定相同。即:逻辑上相邻未必在物理上相邻。结点之间的相对位置由链表中的指针域指示,而结点在存储器中的存储位置是随意的。,线性表(a
10、1,a2,a3,a4),结点的组成:,数据域 指针域,数据域-表示数据元素自身值。指针域(链域)-存储其后继结点(或其它结点)的存储位置信息。通过链域,可将n个结点按其逻辑顺序链接在一起(不论其物理次序如何)。,单链表:-每个结点只有一个链域。,头指针-指示链表中第一个结点的存储位置;整个链表的存取必须从头指针开始附:单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。例如:若头指针为head,则可把链表称为“表head”。,2.3.2 单链表,空表-头指针为空。开始结点-(无前趋)用头指针指向之。尾结点-(无后继),最后一个结点,其指针域为空,用或null表示。表中其它结点-由其前趋
11、的指针域指向之。头结点-在链表的第一个结点之前附设一个结点,称为头结点。头结点的数据域可以不存任何信息,也可存储如长度等附加信息。,typedef int datatype;typedef struct node/结点类型定义 datatype data;/数据域 struct node*next;/next为指针域,指向后继JD,*LinkList;/JD是结点的类型;LinkList 是指向JD类型结点的指针类型JD*head,*p;LinkList H;,单链表的描述:,指针p与所指向的结点关系示意图:p 结点(*p)说明:p-指向链表中某一结点的指针。*p-表示由指针p所指向的结点。(
12、*p).data或p-data-表示由p所指向结点的数据域。(*p).next或p-next-表示由p所指向结点的指针域。,P=(JD*)malloc(n*sizeof(JD)-对指针p赋值使其指向某一结点(按需生成一个JD结点类型的新结点)。其中:Sizeof(JD)-求结点需要占用的字节数。n-需要结点的个数Malloc(size)-在内存中分配size个连续可用字节的空间。(size=n*sizeof(JD)(JD*)-进行类型转换。Free(p)-系统回收p结点。(动态),单链表的基本运算(1)建立单链表之-头插法建表:思想:从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新
13、结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。,B,A,C,D,Head,S,注:头插法生成的链表中结点的次序和输入的顺序相反。,JD*CREATELISTF()Char ch;/*逐个插入字符,以“$“为结束 符,返回单链表头指针*/JD*head,*s;head=NULL;/*链表开始为空*/ch=getchar();/*读入第一个结点的值*/while(ch!=$)s=(JD*)malloc(sizeof(JD);/生成新结点s*/,s-data=ch;s-next=head;head=s;ch=getchar();return head;/*CREATLIS
14、TF*/,头插法建表:,算法思想:将新结点插入到当前链表的表尾上,可增加一个尾指针r,使其始终指向链表的尾结点。,A,C,B,(1)建立单链表之-尾插建表法:,head,r,尾插建表可使生成的结点次序和输入的顺序相同,JD*CREATLISTR()Char ch;/*逐个插入字符,以“$“为结 束符,返回单链表头指针*/JD*head,*s,*r;head=NULL;/*链表开始为空*/r=NULL;/*尾指针初值为空*/ch=getchar();/*读入首结点的值*/while(ch!=$)/*“$“为输入结束符*/s=(JD*)malloc(sizeof(JD);/生成新结点*/,s-da
15、ta=ch;If(head=NULL)head=s;else r-next=s;r=sch=getchar();If(r!=NULL)r-next=NULL;return head;/*CREATLISTR*/,尾插法建表:,头、尾插法建表分析:上述头、尾插法建表由于没有生成(附加)头结点,因此开始结点和其它结点的插入处理并不一样,原因是开始结点的位置存放在头指针中,而其余结点的位置是在其前趋结点的指针域。尾插法建表的改进算法思想:设头结点,使第一个结点和其余结点的插入操作一致。,(表)头结点:-在第一个结点之前附设,其指 针域 存贮指向第一个结点的指针(即第一个结点的存贮位置)。头结点的数据
16、域:可有可无头结点的指针域:指向第一个结点的指针。,(1)建立单链表之-改进的尾插建表法:,带头结点的单链表,空表,非空表,说明:无论链表是否为空,其头指针是指向头结点的非空指针,所以表的第一个结点和其它结点的操作一致。,head,头结点,JD*CREATLISTR1()/*带头结点的尾插法建立单链表,返回表头指针*/Char ch;JD*head,*s,*r;head=malloc(sizeof(JD);/*生成头结点*/r=head;/*尾指针初值指向头结点*/ch=getchar();while(ch!=$)/*“$“为输入结束符*/,s=(JD*)malloc(sizeof(JD);/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 课件 线性
链接地址:https://www.31ppt.com/p-6154048.html