单链表的应用非常广,它可以实现栈,队列等;
Problem
我对学习任何东西都希望能找到尽可能简单的例子,而不是看起来好高大上的;
对链表这样简答的数据结构,有些书也是写得太过“完美”啦;
初学者很难抓住重点,反正我初学的时候就是看不懂;
因此我打算从简单入手去演示;
我们需要实现下面图这样的结构,叫做链表哈;
Solution
首先咱们要想到这几个ABC圆圈可以代表一个数据的节点,什么是节点呢?;
节点就好比是几个同学聚集到一个宿舍一样,他们各自有各自的身高体重;
因此,我们需要一个结构体,声明如下:
struct node { int height; int weight; };
这样一个结构体似乎还差些什么,我们观察上面的图发现,在每个圆圈的外边还有一个连接线;
我们需要这样一条线;
因此,我们的代码可能会是这样的:
struct node { int height; int weight; void * a_line; };
但是呢!再想想,我们这条线指向的是和它本身一样的结构体;
我们如果声明为和它一样的指针不是更好吗?
struct node { int height; int weight; struct node * a_line; };
我们把代码改回来,这样的声明到底合不合法呢?事实上,这里的递归声明一个指针是合法的;
好节点声明完啦,我们可以测试链表啦!这有点不可思议,那么简单吗?看看main函数;
#include <stdio.h> #include <stdlib.h> struct node { int hight; int weight; struct node * a_line; }; int main(void) { struct node * A = (struct node*)malloc(sizeof(struct node)); A->weight = 60; //kg A->hight = 170; //cm A->a_line = NULL; return 0; }
好啦!链表完成啦!你或许以为我在开玩笑呢!好吧,其实的确是一个简单的链表啦;
只不过,它只有一个A点,你无法接受这种一个节点的链表,好吧,我们把ABC连接起来;
首先,我们需要三个点;
int main(void) { struct node * A = (struct node*)malloc(sizeof(struct node)); A->weight = 60; //kg A->hight = 170; //cm A->a_line = NULL; struct node * B = (struct node*)malloc(sizeof(struct node)); B->weight = 50; //kg B->hight = 160; //cm B->a_line = NULL; struct node * C = (struct node*)malloc(sizeof(struct node)); C->weight = 70; //kg C->hight = 180; //cm C->a_line = NULL; return 0; }
然后,是把他们连接起来;
A->a_line = B; B->a_line = C;
好啦!连起来啦,满意啦吧!,你肯定以为我又骗你;
毕竟,怎么也看不出来连接起来啦;
好,让我们从A到C路线走一程,看看能不能走通;
struct node * we; we = A; while (we != NULL){ printf("The hight is %d and the weight is %d \n",we->hight,we->weight); we = we->a_line; }
为了,”旅行“我们把名字报道到了旅行社;
并且,我们获取到了第一站地址就是A的地址啦!
出发;
while循环的意思很简单,判断我们是否到达终点;
没有到达就是打印,xxx,,你懂的;
然后we = we->a_line这句话是关键哦!
我不想解释,自己画图想想!!!
想好了看看我们的运行结果吧!
Discussion
我们的简单链表已经完成,它的缺点太多啦!
让我给你数数吧!例如:
1,要是数据很多怎么办,100000个节点,这个main函数得写多长啊。。。
2,这个连接的方式也太土啦吧!万一某个节点忘记连接下一个怎么办。。。
3,要是我想知道这个节点到底有多长,难道每次都要从头到尾数一遍嘛。。。
4,要是我想在尾部添加一个节点,是不是爬也要爬到尾部去啊。。。
等等。。。
我会尽快给大家写另一个版本哈!
See Also
http://www.cprogramming.com/tutorial/c/lesson15.html