前言
这篇文章的内容是关于伪链表链接和链表的遍历思路的产生以及代码的不断优化过程的总结,思路清晰,相信能为你带来些许灵感或者解答隐藏在你心中的疑惑。
废话不多说,直接开始分析和架构思路
首先我们要定义一个结构体,结构体中有两个元素:一个是当前节点的数据,另一个是下一个节点的地址(注意下一个节点的地址是结构体指针类型)
struct Code
{
int data;
struct Code* pnext;
};
在这里只定义四个结构体变量,并且对它们进行初始化,使得在接下来的操作中更易于理解
struct Code a = {1,NULL},
b = {2,NULL},
c = {3,NULL},
d = {4,NULL};
将元素以节点的形式连接起来
a.pnext = &b;
b.pnext = &c;
c.pnext = &d;
接下来打印一下四个元素对应的值
//a元素
a.data;
printf("%d ",a.data);
//b元素
a.pnext->data;
printf("%d ",a.pnext->data);
//c元素
a.pnext->pnext->data;
printf("%d ",a.pnext->pnext->data);
//d元素
a.pnext->pnext->pnext->data;
printf("%d ",a.pnext->pnext->pnext->data);
我们发现后边b、c、d都是用指针访问结构体成员,而a是用结构成员运算符访问结构体成员,害…强迫症又犯了,让它们都用指针访问看起来多得劲儿,嘿嘿
//a元素
(&a)->data;
printf("%d ",(&a)->data);
//b元素
(&a)->pnext->data;
printf("%d ",(&a)->pnext->data);
//c元素
(&a)->pnext->pnext->data;
printf("%d ",(&a)->pnext->pnext->data);
//d元素
(&a)->pnext->pnext->pnext->data;
printf("%d ",(&a)->pnext->pnext->pnext->data);
这样看起来是不是就顺眼很多了呢,嘿嘿
不过好像总感觉哪里还是有点不尽人意,呃呃…,对了,进行结构体成员访问时后边拖着那一串让人感觉很不舒服,我在想能不能把后边的结构体成员访问简化成和a元素访问那样干干净净呢,那肯定是可以的,接下来就让我们实现它
//声明一个结构体类型的指针装着变量的地址
struct Code* phead;
这里为什么要选用结构体类型的指针而不选用其他的指针类型呢?
因为我们在前面说过下一个节点的地址仍然是结构体指针类型,所以这里要用结构体类型的指针来装着变量的地址。
解决了疑问,那么就请继续向下看吧
//首先将a元素的地址赋值给phead
struct Code* phead = &a;
//phead == &a 当前phead的地址
phead->data; //1 对应数据
phead = phead->pnext; //phead == &b 当前phead的地址
phead->data; //2 对应数据
phead = phead->pnext; //phead == &c 当前phead的地址
phead->data; //3 对应数据
phead = phead->pnext; //phead == &d 当前phead的地址
phead->data; //4 对应数据
phead = phead->pnext; //phead == NULL 当前phead的地址
仔细一看我又感觉不得劲儿了,上面的代码重复率很高,每两行就有一样的,这是你想到什么了----没错,就是循环,这样的结构不就可以用循环来很好地实现了吗
while(phead != NULL)
{
//phead->data;
printf("%d ",phead->data);
phead = phead->pnext;
}
使用循环是不是使代码结构变得更加短小精悍了
那么肯定又有读者会问—你那个循环的条件又是怎样限定的呢?
我们观察上一个代码块中phead值的变化,phead的值只在最后一次迭代后变成了NULL,之前的phead值都不为NULL,那么此时循环的限定条件不就很容易的确定下来了
做完了这些还不够,我们知道在代码中要尽可能的将小的功能封装为独立的函数,使代码的结构和逻辑更加清晰,接下来就将我们上面做的一系列工作封装成函数。
void preview(struct Code* phead)
{
while(phead != NULL)
{
//phead->data;
printf("%d ",phead->data);
phead = phead->pnext;
}
}
我们前面的一系列思路和改进措施最终就浓缩为这样的一个链表遍历函数
总结
上面是简单的伪链表的链接和链表的遍历,虽然最终总结的那个函数看起来十分不起眼,但是在这个函数产生过程中的思路、方法、逻辑和代码的不断优化过程却是最精华的部分,这些内容是我们对逻辑结构理解的总结与升华,所以务必要理解最精华的部分是怎样产生的。