网站首页 > 文章精选 正文
数组在存储的过程中是一段连续的地址空间,遍历数组元素采用下标的方法依次获取数组元素。
链表没有下标的概念,链表的遍历不能使用下标方式,但同样可以通过从首元结点开始,依次访问到最后一个结点,这必然使用到循环,那需要考虑如下两个问题?
(1) 循环的条件
(2) 循环的次数
先来看循环的条件。链表中的一个特点就是链表中最后一个元素的指针域为空,依此就可以在遍历过程中判断每个结点是否为空,不为空就输出数据域,否则就结束循环。因此采用一个指针指向首元结点,依次获取每个结点的指针域,判断是否为空。
再来看循环的次数。链表中结点的个数未知,因此循环的次数不定。比较for和while循环,for循环在循环次数确定时较适用,对于循环次数不确定,适合使用while循环。
到这函数主体的内容其实已经确定,还有一些细节需要确定。因为是一个函数,所以需要确定返回值和函数形参。
遍历链表需要依次输出链表各个结点的数据域,可以直接在函数中将每个元素输出,因此返回值可以为void(空)。
函数的形参,需要指定遍历哪一个链表,因此函数形参为这个链表本身,换句话说就是链表的头指针,因为通过头指针就可以获得整个链表。
函数的声明如下:
void ListTraverse(LinkList L);
返回值为void,形参为链表L
完整的代码如下:
void ListTraverse(LinkList L){
LinkList p;
p = L->next;
printf("当前链表:\n");
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return;
}
依次来解释下代码
LinkList p;
声明一个指针,这个指针就是用来指向结点,在循环过程中,依次判断结点是否为空
p = L->next;
L是头指针,存储的是头结点的地址,L->next表示的是首元结点的地址,头结点数据域并不存储数据信息,第一个数据域存储信息的结点是首元结点,所以遍历从首元结点开始。
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
循环条件,判定指针p不为空,p初值为首元结点的地址,在循环中使用赋值p = p->next,依次将指针p移动到下一个结点,当p->next为NULL时,说明已指向最后一个结点,循环结束。
猜你喜欢
- 2024-12-24 mysql索引总结(二) mysql索引的使用和原理
- 2024-12-24 常见数据结构—线性表详解(超详细顺序表、链表)
- 2024-12-24 「C语言」链表的操作——增删改查——让你一次全弄懂
- 2024-12-24 单向链表基本操作你学会了吗 单向链表基本操作你学会了吗为什么
- 2024-12-24 深入理解HashMap 深入理解计算机系统第三版答案
- 2024-12-24 @程序员,你真的了解内存吗? 程序员不用担心内存管理
- 2024-12-24 详解双向链表的基本操作(C语言) 双向链表基本操作的实现
- 2024-12-24 环形队列 Circular Queue 环形队列中有多少个元素可以根据队首指针
- 2024-12-24 编程知识:既然已经有数组了,为什么还要链表?
- 2024-12-24 哈希表原理及应用 哈希表工作原理
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)