首页 C语言编程精讲之链表

C语言编程精讲之链表

举报
开通vip

C语言编程精讲之链表 RE.ER嵌入式学院 http://www.re-er.com.cn 简单链表 RE.ER嵌入式学院--http://www.re-er.com.cn n 什么是链表? 链表是一种通过结构体其指针成员共同组成的线性数据 结构。 RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head 以上是一个单链表的逻辑图。 容易看出,链表中的每一个节点都由两部分组成: ...

C语言编程精讲之链表
RE.ER嵌入式学院 http://www.re-er.com.cn 简单链表 RE.ER嵌入式学院--http://www.re-er.com.cn n 什么是链表? 链表是一种通过结构体其指针成员共同组成的线性数据 结构。 RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head 以上是一个单链表的逻辑图。 容易看出,链表中的每一个节点都由两部分组成: 1、数据域(DATA); 2、指针域(link)。 RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head 链表的数据域和指针域都是节点结构体的成员。 数据域用于存储数据; 指针域是指向节点结构体类型的指针。 RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head struct node{ //一个可以用于构建链表的结构体类型 void *DATA; struct node *link; } RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head 头指针:每一个链表都有一个头(head)指针,作为链表的起 始点,整个链表的操作都必须从head指针开始进行。当head 指针为空时,代表链表没有节点。 RE.ER嵌入式学院--http://www.re-er.com.cn DATA link DATA link DATA link DATA link NULL head 非循环链表的最后一个节点的link指针总是指向NULL。 RE.ER嵌入式学院--http://www.re-er.com.cn n 链表的部分基本操作 increase() //增加一个节点 print() //遍历并打印链表 cleanup() //清空链表 RE.ER嵌入式学院--http://www.re-er.com.cn 实现 n 在结构体中申明一个指向这种结构体的指针,并用这个指 针记录下一个这种结构体的地址,这样,就可以利用结构 体和结构体中的指针依次链接成为一个链表。 RE.ER嵌入式学院--http://www.re-er.com.cn 我们的节点结构体类型 typedef struct st { int num; char name[20]; struct st *next; }ST; RE.ER嵌入式学院--http://www.re-er.com.cn n ST * increase(ST *head, ST *node) 函数的实现。 RE.ER嵌入式学院--http://www.re-er.com.cn ST * increase(ST *head, ST *node) head NULL 如果链表为空,则head指向NULL node指针指向一个结构体,结构体成 员都已经被赋上相应的值 添加链表的第一个节点,只需把 head指针指向node指向的节点。node NULL RE.ER嵌入式学院--http://www.re-er.com.cn node指针的由来 ST* buildnod(int a, char*str) { ST *temp = (ST*)malloc(sizeof(ST)); if(temp == NULL) { return NULL; } temp->num = a; strcpy(temp->name, str); temp->next = NULL; return temp; } node NULL RE.ER嵌入式学院--http://www.re-er.com.cn ST * increase(ST *head, ST *node) 如果链表不为空,则head != NULL 1、添加到链表最尾部 准备添加第2个节点 head NULL node NULL 需要遍历整个链表,找到最后一个节 点,然后把尾指针指向新加入的节点 temp = head; while(temp->next !=NULL) { temp = temp->next; } temp->next = node; RE.ER嵌入式学院--http://www.re-er.com.cn ST * increase(ST *head, ST *node) 1、添加到链表最尾部 head NULL node NULL 2、添加到链表头部 将node节点的next指针指向head, 然后把head指针指向新的头部并返回 node->next = head; head = node; RE.ER嵌入式学院--http://www.re-er.com.cn ST * increase(ST *head, ST *node) head node NULL NULL 类似increase() 的函数,head指针有可能被改变,则我们需 要通过返回值或传head指针地址的方式设计代码。 如:head = increase(head, node); 如果head指针地址作为参数则申明应为 int increase(ST **headp, ST *node); //推荐 调用函数语句:increase(&head, node); RE.ER嵌入式学院--http://www.re-er.com.cn 遍历一个链表 temp NULL 链表的任何操作都是从头节点开始的,遍历链表是很多链 表操作的基础。如打印、计数、查找等等。 head RE.ER嵌入式学院--http://www.re-er.com.cn 遍历一个链表 temp NULL 如果有一个temp指针也指向头节点,则很常见的两种遍历 链表语句是: while(temp != NULL){temp = temp->next;} while(temp->next != NULL){temp = temp->next;} head RE.ER嵌入式学院--http://www.re-er.com.cn 遍历一个链表 head NULL while(temp != NULL){temp = temp->next;} while(temp->next != NULL){temp = temp->next;} 在以上循环的语句块内加入如 printf(“%s\n”,temp->str); //打印 if(temp->num == NUM){ break; } //查找 等语句 就可以实现不同的功能。cleanup()也可以通过这样实现。 RE.ER嵌入式学院--http://www.re-er.com.cn 建立函数creat() n 建立链表的函数creat()实际上可以通过循环调用buildnode() 和increase()得到。 n 甚至可以认为,这个函数(功能)本身就是多余的。 RE.ER嵌入式学院--http://www.re-er.com.cn 练习 n 使用链表完成 st_increase() st_count() st_print() st_search() st_cleanup()
本文档为【C语言编程精讲之链表】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_726479
暂无简介~
格式:pdf
大小:114KB
软件:PDF阅读器
页数:21
分类:互联网
上传时间:2011-12-14
浏览量:28