(中职)C语言程序设计模块十一电子课件.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《(中职)C语言程序设计模块十一电子课件.pptx》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计模块十一电子课件.pptx(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、YCF正版可修改PPT(中职)C语言程序设计模块十一ppt电子课件LOGO链表模块1111.1链表的基本概念及要点11.1.1链表的基本概念(1)将若干数据项按一定的原则连接起来的表就称为链表。(2)链表中的数据称为结点(或节点)。任何结点都由两部分组成:数据域(data)。指针域(next)。(3)链表的链接原则:前一个结点指向下一个结点,即前一个结点指针域保存下一个结点地址。只有通过前一个结点才能找到下一个结点。头结点(也称头指针)一般不存放有效数据,只保存第1个结点的地址。头结点不存放有效数据,主要是为了方便插入和删除运算的实现。若头结点存放了有效数据,则其为事实上的第1个结点。通常把除
2、头结点外的其他结点称为数据结点,第1数据结点也称为首结点。通常只对存放实际数据的数据结点进行编号(从1开始)。11.1链表的基本概念及要点11.1.1链表的基本概念(4)头结点是链表的起始结点,结点标号为0。11.1链表的基本概念及要点11.1.1链表的基本概念(5)最末结点指针域值为“”,表示其指针值为空(NULL)。(6)结点空间由malloc()函数动态获取并进行结点的创建。(7)头结点是关键点,“抓住”了头结点,就“抓住”了整个链表。链表示意图如图11-1所示。图11-1链表11.1链表的基本概念及要点11.1.2链表结构的定义及内存空间的申请struct LNodeint data;
3、/*数据域*/struct LNode*next;/*指针域*/;struct LNode*p,*t;/*定义了两个链表指针*/p=(struct LNode*)malloc(sizeof(struct LNode);/*申请内存空间*/t=(struct LNode*)malloc(sizeof(structLNode);链表结构(也称结点结构)定义示例。示例1:11.1链表的基本概念及要点11.1.2链表结构的定义及内存空间的申请typedef struct LNodeint data;/*数据域*/struct LNode*next;/*指针域*/NODE;/*定义了一个链表结构类别名N
4、ODE*/NODE*p,*t;/*用类别名定义两个链表指针*/p=(NODE*)malloc(sizeof(NODE);/*申请内存空间*/t=(NODE*)malloc(sizeof(NODE);示例2:11.1链表的基本概念及要点11.1.3链表的基本操作要点链表的操作主要靠“-”运算符和指针域来实现。设若有模块11.1.2的示例1和示例2的链表结构,可以做以下简化的理解:(1)左为指针域,右为指向下一个结点:“t-next=p-next;”意为把p指向的下一个结点的地址保存到t的指针域。“p=p-next;”意为指针p下移。(2)当出现双重“-”运算符时:“p-next-data=3;”
5、意为把常值3赋给p指向的下一结点的数据域。“p-next-datadata;”意为p指向的下一结点的数据域值小于t指向结点的数据域值。“p-next-datat-next-data;”意为p指向的下一结点的数据域值大于t指向的下一结点的数据域值。(3)链表操作往往须借助于多个链表指针,单一指针是不可能完成复杂操作的。11.2单链表11.2.1单链表的建立尾插法所谓尾插法,就是把刚创建的结点插入前一结点之后,最后给最末结点指针域赋空值即可。为了便于读者学习、理解,在后面的学习中直接把链表指针称为结点,事实上是指针指向结点。11.2单链表11.2.1单链表的建立尾插法【例11-1】学生成绩链表头结
6、点为第1个数据结点。#include#include struct LNode/*定义链表结构(也可称为结点结构体),数据域有姓名、班级和成绩*/char name8;int class;int score4;/*语数外加专业4科成绩*/struct LNode*next;/*指针域,指针域存放下一个结点的存储位置(指针)*/;/*创建链表指针函数,返回链表指针,实际上是返回链表的头指针*/struct LNode*create(int n)struct LNode*h,*p,*t;/*链表的创建一般来说需3个链表指针,一个头(如h),一个尾(如t),一个动态指针(如p),用于动态获取内存空间
7、*/11.2单链表11.2.1单链表的建立尾插法char xm8;/*对应链表结构中的数据域姓名成员*/int clas,a4;/*对应链表结构中的数据域班级和成绩成员*/int i,j;h=NULL;/*关键句1:头指针赋空值*/printf(Please input name,class and 4 score:n);for(i=n;i0;-i)p=(struct LNode*)malloc(sizeof(struct LNode);/*分配内存空间,建立结点*/scanf(%s%d,xm,&clas);for(j=0;jname,xm);p-class=clas;for(j=0;jsco
8、rej=aj;11.2单链表11.2.1单链表的建立尾插法if(h=NULL)/*下面两句为关键语句2*/h=p;/*理解为:如果头为空,就把刚创建的结点转为头结点*/t=p;/*理解为:并把刚创建的结点转为尾结点。可见第1个新结点必须具备双重身份:既为头又为尾。这两句仅执行1次,目的就是创建头结点*/elset-next=p;/*这两句为关键语句3:从第2次创建的结点开始,其地址保存于上一结点指针域*/t=p;/*新建结点又转为尾结点*/t-next=NULL;/*关键语句4:结点创建完毕,给最后一个结点指针域赋空*/return h;/*关键语句5:必须返回头结点*/11.2单链表11.2
9、.1单链表的建立尾插法int main()int n,j;struct LNode*q;/*定义一个链表指针,用于接收函数返回来的值*/printf(Input you want to create point:);scanf(%d,&n);q=create(n);/*调用create()函数,上面函数返回的是头指针值*/printf(nametclasstChinesetMathstEnglisetProfessialn);while(q)printf(%st%dt,q-name,q-class);/*输出数据域*/for(j=0;jscorej);putchar(n);q=q-next;/
10、*关键语句6:指针位移指向下一结点*/printf(n);free(q);11.2单链表11.2.1单链表的建立尾插法Input you want to create point:3Please input name,class and 4 score:Lucy 3 89 87 85 65Jack 3 69 78 95 64Lily 3 87 68 92 91name class Chinese Maths English ProfessionLucy 3 89 87 85 65Jack 3 69 78 95 64Lily 3 87 68 92 91创建3个结点,输入/输出数据如下:11.2单
11、链表11.2.1单链表的建立尾插法上述链表尾插法创建过程如图11-2所示。创建上面的学生链表时,若要保持头结点数据域为空,应怎么修改呢?【例11-1】是把整个新建的结点转为了头结点,因而头结点成了事实上的第1个数据结点。现在要保持其为空,就不能这样操作,应该把新建的结点地址保存在头结点的指针域,这样就避免了整体转换,头结点有了新建结点的地址,而其数据域仍然为空。图11-2【例11-1】链表尾插法示意图11.2单链表11.2.1单链表的建立尾插法#include#include struct LNodechar name8;int class;int score4;struct LNode*ne
12、xt;struct LNode*create(int n)struct LNode*h,*p,*t;char xm8;int clas,a4;int i,j;h-next=NULL;/*关键语句1:给头结点指针域赋空*/11.2单链表11.2.1单链表的建立尾插法printf(Please input name,class and 4 score:n);for(i=n;i0;-i)p=(struct LNode*)malloc(sizeof(struct LNode);scanf(%s%d,xm,&clas);for(j=0;jname,xm);p-class=clas;for(j=0;jsc
13、orej=aj;if(h-next=NULL)h-next=p;/*关键语句2:新建结点地址保存到头结点指针域。仅第1次新建时执行*/t=p;11.2单链表11.2.1单链表的建立尾插法elset-next=p;t=p;t-next=NULL;return h;int main()int n,j;struct LNode*q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);q=q-next;/*关键语句3:头结点数据域为空,因而要从第1个数据结点开始*/11.2单链表11.2.1单链表的建立尾插法printf(n
14、ametclasstChinesetMathstEnglisetProfessialn);while(q)printf(%st%dt,q-name,q-class);for(j=0;jscorej);putchar(n);q=q-next;printf(n);11.2单链表11.2.1单链表的建立尾插法头结点为空的尾插法创建过程如图11-3所示。图11-3头结点为空的尾插法创建过程11.2单链表11.2.2单链表的建立头插法所谓头插法,就是把新建结点依次插入前一结点之前,则原头结点变为最末结点,最后建立的结点变为第1结点。这个过程刚好与尾插法是相反的。头插法的结点排列按照堆的从低到高的生长方向
15、,输出时将按从高到低的地址输出,即输入时的反序输出。11.2单链表11.2.2单链表的建立头插法【例11-2】编写一个链表,读入一行字符,每个字符存入一个结点,按输入的顺序建立一个链表的结点序列,然后按相反的顺序输出,并释放全部结点。该题用头插法即可实现:#include#include struct Nodechar ch;struct Node*next;struct Node*h=NULL;/*关键语句1:头已赋空,将作为最末结点*/struct Node*create()char c;struct Node*p;while(c=getchar()!=n)p=(struct Node*)
16、malloc(sizeof(struct Node);p-ch=c;11.2单链表11.2.2单链表的建立头插法p-next=h;/*关键语句2:头保存到新建结点指针域*/h=p;/*关键语句3:新建结点转为新的头*/return h;int main()struct Node*q,*t;q=create();printf(The result is:n);while(q)printf(%c,q-ch);free(q);/如输入 abcde,则输出e d c b aq=q-next;11.2单链表11.2.2单链表的建立头插法头插法创建链表示意图如图11-4所示。图11-4头插法创建链表示意图
17、11.2单链表11.2.3单链表结点逆置所谓单链表结点逆置,指的是把结点倒转,头变尾,尾变头。例如,输入“2 4 1”,输出“1 4 2”。#include#include typedef struct LNode int data;struct LNode*next;Node;/*链表结构类别名,定义类别名,可以省不少事*/Node*h;/*尾插法链表建立(创建步骤同前,略)*/Node*create(int n)11.2单链表11.2.3单链表结点逆置/*-创建链表逆置函数-*/Node*reverse(Node*h)/*在以h为头结点的链表中实现逆序*/Node*p,*t;p=h;/*关
18、键语句1:先安排p在头结点位置*/t=p-next;/*关键语句2:再把p指向的下一结点用t来表示*/p-next=NULL;/*关键语句3:把p(此时尚未进入循环,实际就是头结点)的指针域赋空,断掉其与后面结点的连接。事实上,它将变为最后一个结点*/while(t)/*开始循环*/p=t;/*关键语句4:先把t转换为p*/t=t-next;/*关键语句5:t再变为下一结点*/p-next=h;/*关键语句6:把头结点的地址(如100)保存到p的指针域*/h=p;/*关键语句7:再把p转为新的头结点*/return h;/*返回头结点,此时的h已不是原链表的头结点了*/11.2单链表11.2.
19、3单链表结点逆置int main()int n;Node*q;printf(Input you want to create point:);scanf(%d,&n);q=create(n);q=reverse(q);/*结点逆置*/printf(The result is:);while(q)printf(%d,q-data);q=q-next;输入/输出示例:Input you want to create point:5Input number:1 5 6 2 4The result is:4 2 6 5 111.2单链表11.2.3单链表结点逆置单链表逆置实现原理如图11-5所示。图1
20、1-5单链表逆置实现原理11.2单链表11.2.4单链表结点查询、插入和删除1.单链表结点查询【例11-3】结点查询实例。在一个头为空的单链表中查询某个数值。找到便输出该结点的位置和查找的值,找不到便提示“Can not find your need!”。#include#include typedef struct LNodeint data;struct LNode*next;NODE;NODE*h;/*建立头为空的链表*/NODE*create(int n)NODE*p,*t;int a,i;h=(NODE*)malloc(sizeof(NODE);11.2单链表11.2.4单链表结点查
21、询、插入和删除h-next=NULL;printf(Input every data:);for(i=n;i0;-i)p=(NODE*)malloc(sizeof(NODE);scanf(%d,&a);p-data=a;if(h-next=NULL)h-next=p;t=p;elset-next=p;t=p;t-next=NULL;return h;11.2单链表11.2.4单链表结点查询、插入和删除/*-结点查询函数的实现,返回地址,为指针函数-*/void*search(NODE*h,int score)/*在以h为头的链表中查找值等于score的结点*/NODE*p;int i=0;/*
22、头为空,标号为0*/p=h;/*借助指针p*/while(p!=NULL&p-data!=score)/*关键语句1:循环条件*/p=p-next;/*关键语句2:指针下移。如果有匹配的值,p将刚好到达这个结点*/i+;11.2单链表11.2.4单链表结点查询、插入和删除if(p-data!=score)printf(Can not find you need!n);elseprintf(Result is:NO.%djd-%d,i,p-data);putchar(n);int main()int n,score;NODE*q;printf(Input you want to create p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 模块 十一 电子 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内