zoukankan      html  css  js  c++  java
  • 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 
    ",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

    Can we drop this masquerade
  • 相关阅读:
    生产环境经常用到的命令
    JDK 安装部署
    oracle备份脚本
    HTTP与HTTPS的区别
    TCP和UDP的优缺点及区别
    Web服务器优化
    DDOS攻击的三种常见方式
    Xss Csrf DDOS sql注入及防范
    session共享
    Cookie防伪造防修改
  • 原文地址:https://www.cnblogs.com/landpack/p/4805644.html
Copyright © 2011-2022 走看看