C语言实现单链表-01版

单链表的应用非常广,它可以实现栈,队列等;

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

 

posted @ 2015-09-13 21:28  Landpack  阅读(1086)  评论(0编辑  收藏  举报