单链表PPT格式课件下载.ppt
《单链表PPT格式课件下载.ppt》由会员分享,可在线阅读,更多相关《单链表PPT格式课件下载.ppt(19页珍藏版)》请在冰豆网上搜索。
,指针域:
存储直接后继的存储位置,5,4)头指针、头结点和首元结点的区别,头指针,头结点,首元结点,头指针是指向链表中第一个结点(或为头结点、或为首元结点)的指针;
头结点是在链表的首元结点之前附设的一个结点;
数据域内只放空表标志和表长等信息,它不计入表长度。
首元结点是指链表中存储线性表第一个数据元素a1的结点。
示意图如下:
6,答:
讨论1.在链表中设置头结点有什么好处?
讨论2.如何表示空表?
头结点即在链表的首元结点之前附设的一个结点,该结点的数据域可以为空,也可存放表长度等附加信息,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。
答:
无头结点时,当头指针的值为空时表示空表;
有头结点时,当头结点的指针域为空时表示空表。
头结点不计入链表长度!
7,讨论:
链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?
因每个结点至少有两个分量,且数据类型通常不一致,所以要采用结构数据类型。
以26个字母的链表为例,每个结点都有两个分量:
设每个结点用变量node表示,其指针用p表示,两个分量分别用data和*next表示,这两个分量如何赋值?
方式1:
直接表示为node.dataa;
node.next=q方式2:
p指向结点首地址,然后p-data=a;
p-next=q;
方式3:
p指向结点首地址,然后(*p).data=a;
(*p).nextq,8,设p为指向链表的第i个元素的指针,则第i个元素的数据域写为,指针域写为。
练习:
p-data,ai的值,p-next,ai+1的地址,附1:
介绍C的三个有用的库函数/算符(都在中):
sizeof(x)计算变量x的长度(字节数);
malloc(m)开辟m字节长度的地址空间,并返回这段空间的首地址;
free(p)释放指针p所指变量的存储空间,即彻底删除一个变量。
9,sizeof(x)计算x的长度malloc(m)开m字节空间free(p)删除一个变量,问1:
自定义结构类型变量node的长度m是多少?
问2:
结构变量node的首地址(指针p)是多少?
问3:
怎样删除结构变量node?
msizeof(node)/单位是字节,p(node*)malloc(m),free(p)/只能借助node的指针删除!
P-data=a;
p-next=q,10,对于指向结构类型的指针变量,可说明为:
node*p,*q;
/或用structstudent*p,*q;
/注:
上面已经定义了node为用户自定义的student类型。
类型定义和变量说明可以合写为:
typedefstructstudent/student是自定义结构类型名称chardata;
/定义数据域的变量名及其类型structstudent*next;
/定义指针域的变量名及其类型node,*pointer;
/node是student结构类型的类型替代,*pointer是指针型的student结构类型的替代,也是数据类型*/,附2:
补充结构数据类型的C表示法,11,单链表的存储结构如下,typedefstructLnodeElemTypedata;
/数据域structLnode*next;
/指针域Lnode,*LinkList;
/*LinkList为Lnode类型的指针,如何具体编程来建立和访问链表?
链表的实现,12,2.链表的实现,
(1)单链表的建立和输出
(2)单链表的修改(3)单链表的插入(4)单链表的删除,13,
(1)单链表的建立和输出,例:
用单链表结构来存放26个英文字母组成的线性表(a,b,c,z),请写出C语言程序。
实现思路:
先开辟头指针,然后陆续为每个结点开辟存储空间并及时赋值,后继结点的地址要提前送给前面的指针。
先挖“坑”,后种“萝卜”!
14,#include#includetypedefstructnodechardata;
structnode*next;
node;
node*p,*q,*head;
/一般需要3个指针变量intn;
/数据元素的个数intm=sizeof(node);
/*结构类型定义好之后,每个变量的长度就固定了,m求一次即可*/,将全局变量及函数提前说明:
15,新手特别容易忘记!
inti;
head=(node*)malloc(m);
/m=sizeof(node)前面已求出p=head;
for(i=1;
idata=i+a-1;
/第一个结点值为字符ap-next=(node*)malloc(m);
/为后继结点“挖坑”!
p=p-next;
/让指针变量P指向后一个结点p-data=i+a-1;
/最后一个元素要单独处理p-next=NULL;
/单链表尾结点的指针域要置空!
voidbuild()/字母链表的生成。
要一个个慢慢链入,16,p=head;
while(p)/当指针不空时循环,仅限于无头结点的情况printf(%c,p-data);
p=p-next;
/让指针不断“顺藤摸瓜”,讨论:
要统计链表中数据元素的个数,该如何改写?
sum+;
sum=0;
voiddisplay()/*字母链表的输出*/,17,
(2)单链表的修改(或读取),思路:
要修改第i个数据元素,必须从头指针起一直找到该结点的指针p,然后才能执行p-data=new_value。
修改第i个数据元素的操作函数可写为:
StatusGetElem_L(LinkListL,inti,ElemType/GetElem_L,缺点:
想寻找单链表中第i个元素,只能从头指针开始逐一查询(顺藤摸瓜),无法随机存取。
18,在链表中插入一个元素X的示意图如下:
链表插入的核心语句:
Step1:
s-next=p-next;
Step2:
p-next=s;
p-next,s-next,思考:
Step1和2能互换么?
结点X的生成方式:
s=(node*)malloc(m);
s-data=X;
s-next=?
(3)单链表的插入,19,在链表中删除某元素b的示意图如下:
删除动作的核心语句(要借助辅助指针变量q):
q=p-next;
/首先保存b的指针,靠它才能找到c;
p-next=q-next;
/将a、c两结点相连,淘汰b结点;
free(q);
/彻底释放b结点空间,p-next,思考:
省略free(q)语句行不行?
(p-next)-next,q,(4)单链表的删除,