【我的漫漫跨考路】数据结构之单链表线性存储实现 Beta

正文之前

昨天晚上阶段性的完成了一部分数学的复习,所以今天打算撸一撸代码,然后发现提电脑忘指针。所以自己磕磕盼盼,对照了一下网上的代码,总算把线性存储单链表的数据类型实现,给自己写出来了。 废话不多说,我也不排版,大家自己好好看,有疑问的在下面评论交流。

正文

一觉醒来,世界都有了变化,上午的焦虑不翼而飞~ 下午重新审视了下代码,发现了链表的头插法和尾插法的区别:头插法是在已经形成的链表的头部插入一个数据块,尾插法是在已经形成的链表的尾部插入一个数据块~那么你看我的代码,是用的头还是尾呢?(温馨提示:不要看head是头就回答我哦~)

//main.c//  ZhiZhen////  Created by 张照博 on 2017/8/10.//  Copyright © 2017年 HustWolf. All rights reserved.//#define Length 6;#include <stdio.h>#include <stdlib.h>typedef struct LNode{    int data;    struct LNode *next;} LNode, *LinkList;LinkList InitList(){    int num;    LNode *L;    L=(LinkList)malloc(sizeof(LNode));    LinkList head=L;    int len=Length;    for(int i=0;i<len;++i)    {        LinkList p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&num);        if(p == NULL)        {            printf("初始化失败!\n");            exit(-1);        }        p->data=num;        printf("%d hia~\n",p->data);        p->next=head->next;        head->next=p;        head=p;    }    return L;}void Insert(LinkList L,int i,int number){    int len=Length;    if(i>len){        printf("Fuck U Dicks");        exit(-1);    }    LinkList p;    int Location=i-1;    p=L;    while(Location--)    {        p=p->next;    }    LinkList s=(LinkList)malloc(sizeof(LNode));    s->data=number;    s->next=p->next;    p->next=s;}int main(){    LinkList X;    X=InitList();    int len=Length;    Insert(X,2,45);    printf("\n");    ++len;    while(len--)    {        printf("%d\t",X->next->data);        X=X->next;    }    return 0;}>运行结果![](http://upload-images.jianshu.io/upload_images/3810775-d6ae40caecb115ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

实话实说:我的是尾插法,没错,我自己一直以为是头,结果是尾巴,是的,没错,每一次head指针都会移位,那么也就是说,head其实是个假的头指针,实际上它是个尾指针,专门指向目前的最后一个数据块。L指针才是真正的BOSS头指针!!

下面是我补上的头插法的内容:

LinkList InitListTou()//头插法{    int num;    LNode *L;    L=(LinkList)malloc(sizeof(LNode));    LinkList trial=L;    int len=Length;    for(int i=0;i<len;++i)    {        LinkList p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&num);        if(p == NULL)        {            printf("初始化失败!\n");            exit(-1);        }        p->data=num;        printf("%d hia~\n",p->data);        trial->next=p;        trial=p;    }    return L;}

跑起来一样66的~

很悲伤的发现,野路子就是野路子,链表的头指针要在main中定义是有道理的,不然我也不会花了一个宝贵的下午来算这个东西,真是悲伤啊!~~!!! 下面是完整版的改过的代码,跟上面联系基本不大了,新增了Merge和Delete函数,然后主函数有了点变化,大家自行观察~

////  main.c//  ZhiZhen////  Created by 张照博 on 2017/8/10.//  Copyright © 2017年 HustWolf. All rights reserved.//#define Length 4;#include <stdio.h>#include <stdlib.h>typedef struct LNode{    int data;    struct LNode *next;} LNode, *LinkList;void InitList(LinkList head)//尾插法{    int num;    int len=Length;    for(int i=0;i<len;++i)    {        LinkList p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&num);        if(p == NULL)        {            printf("初始化失败!\n");            exit(-1);        }        p->data=num;        printf("%d hi~\n",p->data);        p->next=head->next;        head->next=p;        head=p;    }    head->next = NULL;}LinkList InitListTou()//头插法{    int num;    LNode *L;    L=(LinkList)malloc(sizeof(LNode));    LinkList trial=L;    int len=Length;    for(int i=0;i<len;++i)    {        LinkList p=(LinkList)malloc(sizeof(LNode));        scanf("%d",&num);        if(p == NULL)        {            printf("初始化失败!\n");            exit(-1);        }        p->data=num;        printf("%d hia~\n",p->data);        trial->next=p;        trial=p;    }    trial->next = NULL;    return L;}void Insert(LinkList L,int i,int number){    int len=Length;    if(i>len){        printf("Fuck U Dicks");        exit(-1);    }    LinkList p;    int Location=i-1;    p=L;    while(Location--)    {        p=p->next;    }    LinkList s=(LinkList)malloc(sizeof(LNode));    s->data=number;    s->next=p->next;    p->next=s;}void Merge(LinkList l,LinkList x,int td){    LinkList a=l->next;    LinkList b=x->next;    LinkList m,M;    m=l;    M=l;    while(b!= NULL && a!= NULL)    {        if (a->data > b->data)        {            m->next=a;            m=m->next;            a=a->next;        }        else{            m->next=b;            m=m->next;            b=b->next;        }        //    m->next=(l->next->data>x->next->data?(l=l->next):(x=x->next));    }    m->next=a?a:b;    LinkList Ta=M->next;    int out;    printf("Merge:\n");   while(Ta)    {   out =Ta->data;        Ta=Ta->next;        printf("%d\t",out);    }    free(b);}int main(){    LinkList X=(LinkList)malloc(sizeof(LNode));    LinkList Y=(LinkList)malloc(sizeof(LNode));    InitList(X);    InitList(Y);    int td=1;    Merge(X,Y,td);    return 0;}

运行结果:

1414 hi~432432 hi~456456 hi~578578 hi~123123 hi~545545 hi~634634 hi~42444244 hi~Merge:123    545 634 4244    14  432 456 578 Program ended with exit code: 0

正文之后

虽说不说废话,但是我还是想问一下,各位,觉得下面哪个写码的环境好一点?我个人比较偏向于第一个的UI,但是第二个,报错报得更好。

原文发布于微信公众号 - 工科狗和生物喵(gh_3507b116a1f8)

原文发表时间:2017-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

明星程序员被Google挂掉的故事

首先要提一个软件Homebrew Homebrew可能是Mac上最好用的包管理器, 地位相当于Ubuntu的apt, 也相当于命令行版的AppStore ? ...

3755
来自专栏和蔼的张星的图像处理专栏

480. 二叉树的所有路径递归

讲真我见到递归真的是害怕,也没办法讲,这也是参考的别人的答案,过两天再让我写我可能就写不出来了,这个看了看理解了一点点,就先放在这里吧,也许写的多了就懂了也不一...

1161
来自专栏书山有路勤为径

二叉树-最近的公共祖先

已知二叉树,求二叉树中给定的两个节点的最近公共祖先。 最近公共祖先: 两节点v与w的最近公共祖先u,满足在树上最低(离根最 远),且v,w两个节点都是u的子孙。...

1242
来自专栏Java后端技术栈

为什么MySQL数据库索引选择使用B+树?

在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出...

3551
来自专栏小狼的世界

Aptana的破解

最近写JS比较多,常常苦恼与没有一个顺手的IDE。Editplus虽然用的熟,不过那个的效率太低而且代码看起来也很不方便,经过一个多月的试用,发现了一款好用的编...

1012
来自专栏灯塔大数据

每周学点大数据 | No.25二叉搜索树回顾(二)

No.25期 二叉搜索树回顾(二) Mr. 王:既然提到了有序的状态,那么我们就来谈谈有根树的遍历问题。 小可:我知道,遍历就是访问一个数据集合中的所...

3496
来自专栏技术小黑屋

Java性能调优之容器扩容问题

在Java和Android编程中,我们经常使用类似ArrayList,HashMap等这些容器。这些容器少则存储几条,多则上千甚至更多。作为性能调优的一部分,容...

1071
来自专栏Java 源码分析

二叉树

1.二叉树的性质 1.具有 n 个节点的二叉树第 n 层最多2的 n-1 次方个节点 2.具有 n 个节点的二叉树最多有 2 的 n 次方减 1 个节点 3.度...

2734
来自专栏猿人谷

双向链表

双向链表       在线性链式存储结构的结点中只有一个指示直接后继的指针域,由此,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前趋,则需从表...

2655
来自专栏WD学习记录

牛客网 二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

801

扫码关注云+社区

领取腾讯云代金券