链表讲义
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、查询链表 查找链表中第一个数据成员的值为指定值的节 点,若找到就返回该节点的地址,否则返回NULL。 函数为node *find_node(node *, int)。 4、删除链表上具有指定值的一个结点 程序思路:a、用查询方式查找符合条件的节点; 若找到,其局部结构为:
p的前驱 数据 next
5、释放链表的结点空间 完成释放链表的结点空间的函数如下: void delete_list(node *h) { node *p1; while(h){ //A p1=h; //B h=h->next; //C delete p1; //D } }
6、把一个结点插入链表 对一个各节点的数据成员按升序排列的链表, 把一个结点插入链表时,仍保持链表上各个结点 的升序关系。 节点插入的位置可能是: 1、头部,包括链表为空和新节点的数据成员 不大于链表中第一个节点的数据成员。 2、其它位置,这时,需要找到两个相邻的节 点(p1后继、p2前驱),它们与待插入的节点(p) 的关系是: p1->data >= p->data > p2->data
1、建立一条无序链表 建立无序链表有两种方法:先入后出(FILO)法 和先入先出(FIFO)法。 (1)先入后出(FILO)法 这种方法的特点是:每产生一个新的节点,都 把它放在链表的头部。 工作步骤:a. 输入一个数据,若该数据不为 9999,就向系统申请一个节点的内存,即产生一 个新的节点; b. 让新的节点的next成员指向链表的第一个 节点; c. 把新节点的地址赋给链表头指针;转a。
•2
建立链表 例 链表的基本操作。 本例所做工作包括:建立一条无序链表;输 出该链表上各结点的数据;删除链表上的某 一个结点;再输出链表上的数据;释放无序 链表各结点占用的内存空间;建立一条排序 链表(升序排序);输出链表上的数据;最 后释放链表上各结点占用的内存空间。 链表上结点的数据结构为: struct node { int data; node *next; };
简单链表及其应用 •8.7 1 链表概述 链表是一种在使用过程中可动态改变存 储容量的数据结构。 链表由一组节点按特点的方式构成。 节点的结构为: struct node{ 数据成员列表; node *next; };
链表的组织形式:
head
数据 next
数 next
数据 next
数据 next
节点p 数据 next
p的后继 数据 next
b、将p的后继改为p的前驱的后继,返回p。 c、查找时,由于要保存被删除节点的前驱,因此 需要两个指针变量node *p1, *p2, p1指向当前 要检查的节点,p2指向该节点的前驱。当找到符 合条件的节点时,先判断该节点是否为头节点 (p1==head), 若是,则执行如下操作: head = p1->next; return p1; 否则,执行 p2->next = p1->next; return p1; 在检查过程中移动p1指针时的操作为: p2 = p1; p1 = p1->next; 函数为node *del_node(node *, int)。
数据 next NULL
head : 头指针; NULL : 链表尾节点标志,即链表结束标志。 head 所指向的节点称为头节点。
这样的组织形式叫做单向链表,指针变量 head称为头指针,它指向链表的第一个节 点(头节点);每一个节点的next成员指 向它后面的节点;最后一个节点的next成 员取值为NULL(0),称为尾节点。链表 中,相邻的两个节点的前一个节点叫做前驱, 后一个节点叫做后继。 链表中节点的数量是可以改变的,即,是 动态的,每一个节点都是用new运算符生成。 对链表的操作有:创建、查询、删除节 点、插入节点、删除链表等。
程序中使用的变量: node *head, *p; int data; head: 指向链表第一个节点的头指针; p: 工作变量,用于存放新节点的地址; data: 工作变量,用于接受输入的数据。 函数名为create_filo。 exam871.cpp
(2) 先入先出(FIFO)法 这种方法的特点是:每产生一个新的节点,都 把它放在链表的尾部。 使用3个指针变量,head, p1和p2,head为 头指针,p1存放新节点的地址,p2存放最后一个 节点的地址。head初值为NULL。 步骤:a. 输入数据,若等于9999转e; b. 用p1申请新节点内存; c. 若为第一个节点(head==NULL),head和p2 都指向新节点(p1); 否则:让p2的next成员指向p1,p2指向新节 点(p1);
p2
data data
next
next
p1
程序操作步骤: 1、判断链表是否为空或新节点的数据成员的值小 于等于头节点的数据成员的值,是,则将新节点 插入到头部,返回;否则, 2、p1 = head->next; p2 = head,寻找p1, 使p1->data>=p->data,寻找过程中,始终保 持p2->next == p1的关系。 3、在寻找p1的过程中,若p1==NULL,则新节 点的数据成员的值是链表的最大值,停止寻找。 4、将p插入p2与p1之间。 2和3为循环的条件。 函数为node *Insert(node *, node *);
7、建立一条有序链表 使用前面的插入节点的函数,可以创建一个有序 链表(升序)。 函数为 node *create_sort(); 8、对链表排序 将一个无序链表一个节点一个节点的拆开,并 插入到新链表中,新链表是有序的。 函数为 node *sort_list(node *);
d. 转a; e. 使p2指向的节点成为尾节点,即p2->next = NULL; 返回head; 函数为create_fifo() 2、输出链表上各个结点的值 由头指针head找到第一个节点,再由节点的 next成员找到下一个节点,直到一个节点的next 成员为NULL(尾节点)。 函数为Print(node *),必须把链表的头指 针送入函数中。