在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
单链表的应用非常广,它可以实现栈,队列等; 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
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论