链表 c++。ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计基础
② 提示“输入节目时长”,之后用键盘输入,用了
下面两句:
cout << “输入节目时长”;
cin >> Time;
这部分程序语句是为下面的 while 循环做准备的。
如果 Time 不为 0,才做下面的内容。
第11章
链表
程序设计基础
③ while( Time != 0 ) 循环 在当循环的循环体内完成建立链表的过程。首 先给 p 结点分配内存空间。这个内存空间的大小要 根据 p 结点的定义(p 结点是 ActList 结构)来确 定。接着下面就是几个赋值语句
第11章 链表
程序设计基础
3、在定义 Create 函数之前,先定义了一个指向结构 的头指针 head,即
ActList *head;
4、定义 Create函数,该函数可返回指向 ActList 结构
的指针,即
ActList *Create( )
分析这个函数的功能可分如下4块
第11章
链表
程序设计基础
程序设计基础
第11章
链表
程序设计基础
教学目标
链表的概念 建立链表中指针的运用 插入删除结点的思路与双指针作用 建立循环链表的思路
第11章
链表
程序设计基础
链表属于动态数据结构,可以类比成 一“环”接一“环”的链条,这里每一
“环”视作一个结点,结点串在起形成
链表。
第11章
链表
程序设计基础
11.1
举例说明链表的概念
head
p q
图 链表的第一个 结点建成
第11章
链表
程序设计基础 当 Time 不为 0,p 又被分配了内存空间,形成了第二个 结点,装入节目信息后,判断 head 不再为空,说明前面已 有结点在链表中,这时要将第二个结点放到 q 所指向的结 点的后面。执行 q->next = p 之后就完成了。之后再将 q 指 针移到第二个结点上,将 p 指针腾出来去做下一个结点的 工作。 head q p
第11章 链表
程序设计基础
ActList *head;
ActList *Create() { ActList *p=NULL; ActList *q=NULL; head = NULL;
// 链头指针
// 定义一个指向 AcitList 结构 //的指针函数,名为 Create // 指针,指向个待插入的结点 // 指针,用于在其后插入结点 // 一开始链表为空 // 节目时长,如为0则退出
调用 dsplayList(head) 就会将整个链 表从头至尾输出。
第11章
链表
程序设计基础
建立链表的过程可归纳为如下三个步骤
1、定义 ActList 结构,结构中包含数据域和指针域。将一个结 构看作一个结点。 2、定义一个指向结构的指针 head,准备用来指向链表的第一 个结点。 3、定义一个指向ActList 结构的指针函数,起名为 Create 函数, 该函数返回的是创建好的链的头指针 head。 下面是 Create 函数所要做的事情: ① 定义指向 ActList 结构的两个指针 p 和 q,定义后立即初 始化为 NULL,即不指向任何地址。再让头指针 head 为 NULL,也是不指向任何地址,表示该链表尚未建立,一个 结点也没有。然后定义一个中间变量“节目时长 Time”, 当 Time 为 0 时,建立链表的过程应该结束。
第11章 链表
程序设计基础
建立链表的过程可归纳为如下三个步骤
① 下面程序的构思是,只要 Time 不为 0,就要构建链表。 构建的思路是将一个一个的结点加至链表里来。 首先给 p 找一个能够指向的内存空间,我们说这是给 p 结点分配一片内存空间。如下图
p
第11章
链表
程序设计基础 ② 然后,通过键盘往这个空间中装入与节目有关的信息。 装完之后判断一下 head 为空否,如为空则 p 结点为第一个 结点,让 head 指向 p 结点就完成了有一个结点的链表。之 后让 q 赋值为 p,即使让 q 指针去指向刚加入链表的结点, 将 p 指针腾出来去做下一个结点的工作。
程序设计基础
#include <iostream> using namespace std; struct ActList // 定义一个名为 ActList 结构 { char ActName[20]; // 节目名为字符数组 char director[20]; // 主持人为字符数组 int Mtime; // 节目长度为分钟 ActList *next; // 指向 ActList 结构的指针 };
// 让Time赋给p结点的结 构成员Mtime
cout << "输入节目名称:"; // 提示信息
cin >> p->ActName;
cout << "输入主持人:";
cin >> p->director;
// 输入节目名称 // 提示信息 // 输入主持人
第11章 链表
程序设计基础
if (head == NULL) head = p; else q->next = p; q = p;
第11章
链表
//************************************ //* 程 序 名:11_1.cpp * //* 作 者:wuwh * //* 编制时间:2002年11月26日 * //* 主要功能:链表 * //************************************
第11章 链表
程序设计基础
2、程序开头为结构定义。在这里我们称这样的一个结构 为一个结点。这个结点包含两个域:数据域和指针域
结 点
int MTime; char ActName[20]; 数据域 指针域
char director[20]
ActList *next;
数据域中装有节目的信息,而指针域装的是指向 另一个结点的地址。显然这是为形成链表而专门设 置的。
// head为空,要插入第一个 // 结点,让头指针指向结点p // 否则不是头结点,应将p结点
// 插入到q结点的后面
// q指向当前最后一个结点
cout << "\n输入节目时长:"; cin >> Time; // 输入下一个节目时长
}
// 一旦跳出while循环,说明有一个节目时长为0
if (head != NULL) q->next = NULL;
第11章 链表
程序设计基础
我们可以将每一个节目单独放在一个结构里,用
一个指针把两个结构连在一起,一天的节目形成一
条链表。用一个所谓的头指针 head 指向链表的第一
个结点。如下图所示
head
节目1
节目2
节目n
头指针
NULL
下面的程序是建立链表的过程。
第11章 链表
程序设计基础
11.2 建立链表的过程
第11章 链表
程序设计基础
int main( ) {
源自文库// 主函数开始
// 调用子函数displaList() // 调用时的实参为Create()函数的返回值
displayList( Create() ); return 0;
} // 主函数结束
第11章
链表
程序设计基础
说明
1、先从主函数说起
主函数只有一条语句 displayList(Create( )); 这是调用子函数 displayList,该子函数的形参为 ActList *head 是一个指向 ActList 结构的名为 head 的指针变量。在主 函数调用 displayList 时所用的实际参数来自运行 Create( ) 函 数的返回值。从 Create( ) 的定义 ActList *Create( ) 看出 Create( ) 函数的返回值应该是一个指向 ActList 的指针。 主函数在调用子函数时,又遇到该函数的实参又是调用另 一个函数之后的返回值。看起来的确显得复杂,但是我们耐心 分析之后,感到并不难。
// 让q所指的最后一个结点的指针域为空说明这已是链尾了
return(head);
}
// 返回头指针 第11章 链表
程序设计基础
void displayList(ActList *head) { cout << "显示节目列表\n"; while(head != NULL) // 当指针head不空,则输出 { cout << head->Mtime << endl << head->ActName << endl << head->director << endl << endl; head=head->next; }
int Time;
第11章
链表
程序设计基础
// 以下是给新结点输入节目信息 cout << "输入节目时长:"; cin >> Time; while(Time != 0) // 当该节目的时长不为0时,将其 { // 纳入链表中
p = new ActList; p->Mtime = Time;
// 分配内存空间给p结点
这是说如果头指针为空,表示链表还是空的,这时 p 结点就是第一个结点。让 head 指向 p 结点。之 后让 q=p; 这是让 q 指向刚进入链表的结点,让 p 再去指向待加入的结点。如果 p 结点已不是第一个 结点了,head 必不为 NULL,因此要走 else 分支, 即
else q->next = p;
第11章 链表
程序设计基础
将此时的 p 结点放到 q 所指向的结点后面。之
后让 q=p; 即让 q 指向刚进入链表的结点,腾出 p
去指向下一个待加入的结点。 接下来输入下一个节目时长,
cout << “\n输入节目时长:”;
cin >> Time;
至此,while 语句的循环体结束。当 Time 值不 为0,就会有结点加入链表,继续执行循环体。一
第11章
链表
程序设计基础
【任务11.1】 某电视台希望王小二同学为他们编一个程序。该程
序可以将节目串在一起,形成一份有序的节目预告。
节目列表有如下三项
1、节目名称 包括 新闻联播(CCTV News) 祖国各地(Motherland) 体育之窗(Sports) 学校见闻(College) 电影展播(Movie) 2、节目主持人(Director) 3、播放时间长度(Time)
第11章
链表
程序设计基础 指针移到第二个结点上,将 p 指针腾出来去做下一个结 点的工作。
head
q
第三个结点加入链表的过程为 head q p
第11章
链表
程序设计基础 最末一个结点连至链表的尾部之后,要在 q 指针所指向 的最后一个机诶但的指针域加上一个 NULL,表示这里是 链尾了,后面再也不连结点了。
第11章
链表
第二条 return (head); 将这条链表的头指针 head 返回。这件事意味着执行完 Create 函数后得到 head 指针所指向的地址,这 个地址就是链表中的第一个结点的地址。 这时对主函数而言
程序设计基础
displayList( Create( ) ) 就是 dispalyList( head )
p->MTime = Time;
cout << “输入节目名称:” ;// 提示
cin >> p->ActName; // 用键盘输入节目名称
cout << “输入主持人:”; // 提示
cin >> p->director;
// 用键盘输入主持人
第11章 链表
接着是一个分支语句
程序设计基础
if (head==NULL) head=p;
head
q
NULL
第11章
链表
程序设计基础
练
习
1、按下表顺序输入某班的一个学习小组的成员表:
姓名 赵达 1983 出生年月 1 3 2 9 5 4 6 钱亮 1983 孙参 1983 李思 1982 周芜 1983 武陆 1983 郑琪 1982
将学习小组形成一个链表,每人一个结点。结点中有 4个成员:姓名、出生年、出生月、指针。
旦 Time 为 0,则会跳出 while 循环。
第11章 链表
程序设计基础
④ 执行两条语句
if (head != NULL) q->next = NULL;
return (head); 第一条是说,如果 head 不空说明链表已 建成,这时 q 一定是最后一个结点,将该结 点的指针域置成空,以表明它是链尾。
① 定义
ActList *p = NULL; ActList *q = NULL; head = NULL; int Time;
定义了两个指向结构 ActList 的指针 p 和 q,并 初始化为空,即未指向任何地址。同时让头指针 head 也为空。再定义一个临时变量 Time,是一个 整型数。
第11章 链表