教学课件C语言程序设计28链表(1).ppt
PPT模板下载:模板下载:/moban/ 行业行业PPT模板:模板:/hangye/ 节日节日PPT模板:模板:/jieri/ PPT素材下载:素材下载:/sucai/PPT背景图片:背景图片:/beijing/ PPT图表下载:图表下载:/tubiao/ 优秀优秀PPT下载:下载:/xiazai/ PPT教程:教程: /powerpoint/ Word教程:教程: /word/ Excel教程:教程:/excel/ 资料下载:资料下载:/ziliao/ PPT课件下载:课件下载:/kejian/ 范文下载:范文下载:/fanwen/ 试卷下载:试卷下载:/shiti/ 教案下载:教案下载:/jiaoan/ 字体下载:字体下载:/ziti/ 教学课件教学课件C语言程序设计语言程序设计28链表(链表(1)链表上页上页下页下页主页主页结束结束教学目标教学目标应知应知o 了解节点和链表的概念o 掌握动态链表的创建和遍历应会应会o 动态链表的创建o 动态链表的遍历上页上页下页下页主页主页结束结束专业英语词汇专业英语词汇英文词汇英文词汇对应的中文意义对应的中文意义typedef类型重命名类型重命名list列表(线性表)列表(线性表)linklist链表链表node节点节点malloc动态申请内存动态申请内存sizeof空间大小空间大小上页上页下页下页主页主页结束结束回顾与提问回顾与提问1、如何构建一个静态链表?他有什么作用和不足?怎么使链表更实用?2、案例3种有哪几个功能,用哪些函数来实现的?3、检查学生课后实训与作业完成情况(包括小组评价)上页上页下页下页主页主页结束结束演示程序演示程序o 演示成绩管理案例演示成绩管理案例V3.0模块,察看其中创模块,察看其中创建链表和遍历的函数。建链表和遍历的函数。o 提问:如何实现对多个学生信息的存储操提问:如何实现对多个学生信息的存储操作?作?o 引出动态链表。引出动态链表。上页上页下页下页主页主页结束结束分析与讲解分析与讲解o 指向结构体本身的指针指向结构体本身的指针我们可以定义一个指针指向结构体变量,也可以将这个指针定义在某我们可以定义一个指针指向结构体变量,也可以将这个指针定义在某个结构体的内部,作为该结构体的一个成员。个结构体的内部,作为该结构体的一个成员。定义形式如下:定义形式如下:struct STUDENT char name20; int age; float chinese, math; struct STUDENT *next; /定义了指针定义了指针next,它可以指向自身,它可以指向自身结构体类型的变量结构体类型的变量;利用结构体中包含的这种指针,可以构成一个利用结构体中包含的这种指针,可以构成一个链表链表。上页上页下页下页主页主页结束结束分析与讲解分析与讲解n链表的概念链表的概念Alice2176.589.0Tom2081.570.5Bob2279.079.0Jerry2180.588.0head为了编程方便,通常头结点空余(不存储信息),只起一个链表起始点为了编程方便,通常头结点空余(不存储信息),只起一个链表起始点的作用。的作用。如上图,链表的最开始一个结点称为如上图,链表的最开始一个结点称为头结点头结点。我们通过指向头结点的指。我们通过指向头结点的指针针head,就可以访问到链表中的任何结点的信息。,就可以访问到链表中的任何结点的信息。链表的最后一个结点称为链表的最后一个结点称为尾结点尾结点,尾结点的指针必须为,尾结点的指针必须为空空(在(在C中,用中,用NULL表示空指针)。表示空指针)。上页上页下页下页主页主页结束结束分析与讲解分析与讲解n链表结点成员的访问链表结点成员的访问当一个链表创建好了之后,我们可以通过指向链表的指针来当一个链表创建好了之后,我们可以通过指向链表的指针来访问链表中每个结点的成员。访问链表中每个结点的成员。如在上图中,我们想要访问第如在上图中,我们想要访问第1个结点的个结点的age成员,可以用:成员,可以用:head-next-age若想访问第若想访问第2个结点的个结点的age成员,可以用:成员,可以用:head-next-next-age若想访问第若想访问第3个结点的个结点的age成员,可以用:成员,可以用:head-next-next-next-age上页上页下页下页主页主页结束结束分析与讲解分析与讲解n动态开辟和释放空间的函数动态开辟和释放空间的函数编写程序,先动态开辟结构体空间,编写程序,先动态开辟结构体空间,然后释放它。然后释放它。#include #include struct STUDENT char name20; int age; float chinese, math; struct STUDENT *next;main( ) struct STUDENT *s; s = ( s t r u c t S T U D E N T * ) malloc(sizeof(struct STUDENT); gets(s-name); scanf( %d %f %f , &s-age, &s-chinese, &s-math); puts(s-name); printf( %d %f %f , s-age, s-chinese, s-math); free(s);上页上页下页下页主页主页结束结束分析与讲解分析与讲解n链表的创建链表的创建#include #include #include #include #include #include struct STUDENT struct STUDENT char name20; char name20; int age; int age; float chinese, math; float chinese, math; struct STUDENT struct STUDENT * *next;next; /; /注意:以后所有的结构体操作都使用这个定义注意:以后所有的结构体操作都使用这个定义typedef struct STUDENT STU; /typedef struct STUDENT STU; /给结构体改个别名,可让程序简短给结构体改个别名,可让程序简短 STU STU * *create_list();/create_list();/声明创建链表函数声明创建链表函数void print_list(STU void print_list(STU * *head); /head); /声明输出链表函数声明输出链表函数main() main() STU STU * *head;head; head = create_list(); / head = create_list(); /调用函数,创建链表调用函数,创建链表 print_list(head); /print_list(head); /输出以输出以headhead为头指针的链表为头指针的链表 上页上页下页下页主页主页结束结束分析与讲解分析与讲解创建函数创建函数create_list()创建过程:创建过程:(无序链表的创建无序链表的创建)(1)先申请一个头结点先申请一个头结点head,只用其,只用其next成员,其他成员空闲。成员,其他成员空闲。(2)让指针让指针q指向指向head。(q的作用是:总指向当前链表的最后一个结点,的作用是:总指向当前链表的最后一个结点,即尾结点即尾结点)(3)用指针用指针p去开辟新的结点,并对新开辟的结点赋值去开辟新的结点,并对新开辟的结点赋值(4)将新开辟的结点将新开辟的结点p链到链表的末尾,即链到链表的末尾,即q的后面的后面(5)指针指针q向后移动一个结点,即指向向后移动一个结点,即指向p(6)如果需要继续申请新结点,转第如果需要继续申请新结点,转第(3)步,否则转第步,否则转第(7)步步(7)指针指针q所指的结点的所指的结点的next成员置为空成员置为空(NULL)(8)将链表的头指针将链表的头指针head返回给主调函数返回给主调函数上页上页下页下页主页主页结束结束分析与讲解分析与讲解创建函数创建函数create_list() STU STU * * create_list() / create_list() /定义创建链表函数定义创建链表函数 STU STU * *head, head, * *p, p, * *q; char na20;q; char na20; head = ( STU head = ( STU * *)malloc(sizeof( STU ); /(1)malloc(sizeof( STU ); /(1) q = head; /(2) q = head; /(2) gets(na); gets(na); while (strlen(na) / while (strlen(na) /输入名字不为空时,申请结点输入名字不为空时,申请结点 p =(STU p =(STU * *)malloc(sizeof(STU); /(3)malloc(sizeof(STU); /(3) strcpy(p-name, na); strcpy(p-name, na); scanf(%d%f%f, &p-age, &p-chinese, &p-math); scanf(%d%f%f, &p-age, &p-chinese, &p-math); getchar(); / getchar(); /滤掉滤掉scanfscanf未处理的回车符未处理的回车符 q-next = p; /(4) q-next = p; /(4) q = p; /(5) q = p; /(5) gets(na); / gets(na); /为下一个结点做准备为下一个结点做准备 q-next = NULL; /(7) q-next = NULL; /(7) return head; return head; 上页上页下页下页主页主页结束结束分析与讲解分析与讲解输出函数输出函数print_list(head)输出过程:输出过程:根据根据head,沿着,沿着next成员向的结点,逐个输出。成员向的结点,逐个输出。(1)先让指针先让指针p指向指向head的下一个结点的下一个结点(因为因为head中无数据中无数据)(2)如果如果p指向的结点为空,则说明是空链,转指向的结点为空,则说明是空链,转(6),否则转,否则转(3)(3)输出输出p指向的结点的信息指向的结点的信息(4)将将p向后移动一个结点向后移动一个结点(5)转第转第(2)步步(6)函数结束函数结束上页上页下页下页主页主页结束结束分析与讲解分析与讲解输出函数输出函数print_list() void print_list(STU *head) /定义输出链表函数,链表头为定义输出链表函数,链表头为head STU *p; p = head-next; /(1) while (p!=NULL) /当链表处理还未结束时当链表处理还未结束时 (2) puts(p-name); /(3) printf(%d %f %fn, p-age,p-chinese,p-math); /(3) p=p-next; /(4) 上页上页下页下页主页主页结束结束错中学错中学n 链表和数组是一种线性表,里面的数据顺序存放,但链表和数组是一种线性表,里面的数据顺序存放,但链表的节点除了数据域,还有指针域,为操作方便还链表的节点除了数据域,还有指针域,为操作方便还单独设置了头节点,其中不存放数据。单独设置了头节点,其中不存放数据。n 链表遍历操作比较简单,但必须从表头开始逐个访问链表遍历操作比较简单,但必须从表头开始逐个访问节点。节点。n 链表创建过程是申请节点,链到表尾,最后为指针设链表创建过程是申请节点,链到表尾,最后为指针设置成置成NULL,返回头节点,返回头节点Head,不要弄错了,不要弄错了上页上页下页下页主页主页结束结束课堂练习课堂练习n 1、试着写一个函数完成链表的创建、试着写一个函数完成链表的创建n 2、写一个函数,实现链表的遍历操作、写一个函数,实现链表的遍历操作 上页上页下页下页主页主页结束结束更进一步更进一步o 1、考虑案例、考虑案例3中链表是如何创建的?中链表是如何创建的?o 2、案例、案例3中还涉及到对链表的哪些操作?中还涉及到对链表的哪些操作?o 3、总结与评价、总结与评价上页上页下页下页主页主页结束结束本次课小结本次课小结o 1、掌握链表的创建和输出原理、掌握链表的创建和输出原理o 2、掌握链表创建和输出函数的编写、掌握链表创建和输出函数的编写 o 3、理解创建链表和输出链表的函数的调用、理解创建链表和输出链表的函数的调用