搜索
查看: 1486|回复: 4
打印 上一主题 下一主题

【重新拾笔】(原创)十五分钟教程(链表篇)

[复制链接]
跳转到指定楼层
楼主
发表于 2014-2-24 22:26:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 超神级 于 2014-2-26 21:01 编辑

链表篇start:                       话说链表真的不难!我学链表的时候就被坑了!因为很多人都说难我就认为难!吓得自己学的时候就知道了p跟着别人的思路走!看这篇教程的时候千万不要跟着我的思路走!自己多问为什么.!例如为什么需要链表呢!因为数组是连续的内存空间大小有限假设定义了一个数组char a[2].如果a[1]的地址是1那么a[2]的地址就是2!链表呢!不是一块连续内存的空间!用指针相连!假设第一个结点的内存地址是1,那么第2块的地址有可能就是111,链表的出现只不过是为了大规模的存储吧!.....
           个人感觉链表就好像是以前的火车火车头后面一节一节挂一节!why为什么火车是一节一节的呢@话说网友真的很给力!答案自己有兴趣百度下!       链表其实吧最多就算一个写的比较好的算法而已!并不是一个知识点!如果你结构体,动态内存分配,指针方面不错的话都是可以尝试着自己写一个链表的!
      链表的结构!1.头节点,2首节点,3尾节点的指针域为NULL!一个单链表的的节点通常有两部分,前面一部分是数据,后面一部分是指向下一个节点的指针!单链表就好像排队一样你知道你前面那个人是男是女但是你后面的就不知道是男是女了!;单链表就像火车一样!有了火车头才有后面的车厢!想要去2车厢就要先去1车厢然后才可以找到2车厢!衔接也是先要有个火车头。然后才可以往后面挂1车厢然后2车厢然后3车厢这样挂!
     下面我就把链表的伪算法提供给大家由于本人水平有限希望大神们给提供个更好的伪算法!希望大家试着写10分钟写不出来也没关系很正常!
伪算法:求提供!刚才写了个自己看下真是惨不人睹真没思路了使用结构体定义链表的数据类型
使用malloc函数动态分配内存
读取用户输入的数据存入动态分配的内存空间里!
进行衔接!
遍历
找到头结点!
非空输出是空退出
head=head->next
====================================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>//头文件必须加!
struct student
{
        int id;//定义一个属性(数据域)
    struct student*next;//指向下个节点(指针域)!};//这就是单链表的简单结构!数据类型。
struct student *hanshu(void)
{
        int a,b,c;
        struct student*head=malloc(sizeof(struct student));
    struct student*head2=head;//
    printf("你要建立几个节点\n");
    scanf("%d",&a);
    for(b=1;b<=a;b++)
    {
                printf("请输入你要增加的ID号\n");
        scanf("%d",&c);
        struct student *tail=malloc(sizeof(struct student));
        tail->id=c;
                head2->next=tail;//进行衔接
                //head2=head2->next;这是挂结点的两种方式!都看下吧试着理解!
                tail->next=NULL;//里面有垃圾值赋值为0.
        
    }
        head2=NULL;
        return head;//返回头指针!
}
void traverse(struct student *head)
{        

        while(head->next!=NULL)
        {
               
        head=head->next;//下一个结点自己推演下!
        printf("%d\n",head->id);//输出id
        }

}
int main()
{
        struct student*head;//定义一个头指针
        head=hanshu();//接收返回的头指针
        traverse(head);//传地址
        system("pause");
        return 0;
}
链表就是这个指下一个下一个指下下一个!下下指下下下个下下下个指下下下下个.好吧我看着都有点晕+_+!如果学会了赞个!没学会拍块砖、



沙发
发表于 2014-2-24 23:11:58 | 只看该作者
1. 链表当然不难,非常容易出错而已……很多职业程序员也不愿意亲手写链表的
2. 链表不是算法,而是数据结构……

3. ANSI C中的malloc函数定义在stdlib.h中,malloc.h是过时的东西
4. 我比较建议写 typedef struct stu{.....} student,让代码看上去视觉负担轻一些

5. 接口设计就不吐槽了, 这个hanshu何苦另外写一个函数?有重复利用的余地吗?
6. 还是不建议把malloc返回的指针强制转换类型,这是C和C++都分不清的半桶水程序员喜欢干的事情

7. 契科夫数列是啥玩意儿?
8. 循环里用scanf外加不除错代码是非常糟糕的风格
9. 变量名好乱……
10. unset掉tail->next河head2是完全没必要的……只需要最后做一次就可以了,这样的代码给别人看了徒增疑惑

11. head->next != 0 这一句,你用的空指针是0,而前面用的空指针是NULL,统一一下比较好

点评

已修改!!  发表于 2014-2-26 20:27
板凳
发表于 2014-2-24 23:18:33 | 只看该作者
最重要的,我觉得这个例子完全没有体现出链表的必要性……
其实一般程序员是极少用到链表的,我觉得一个无限向上增长的stack来做例子比较合适
linked-list在数据结构课程中放的那么靠前,一方面是因为它是重要的内存布局形式,另一方面是因为树和图都是它的一种复杂变体……在小问题上的实用性其实很一般

我觉得要教人链表,一开始用数组模拟比较好。链表重要的是思想,而不是实现
关键是要明白:一个数据单元存放核心数据,以及下一个数据单元存在的位置这种基本的内存分布形式
这点在数据结构上是比较少见的
地板
 楼主| 发表于 2014-2-25 06:45:41 | 只看该作者
rosynirvana 发表于 2014-2-24 23:18
最重要的,我觉得这个例子完全没有体现出链表的必要性……
其实一般程序员是极少用到链表的,我觉得一个无 ...

好吧!晚上增进和修改。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表