前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【我的漫漫跨考路】数据结构之单链表线性存储实现 Beta

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

作者头像
用户1687088
发布2018-05-07 16:42:08
6330
发布2018-05-07 16:42:08
举报

正文之前

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

正文

一觉醒来,世界都有了变化,上午的焦虑不翼而飞~ 下午重新审视了下代码,发现了链表的头插法和尾插法的区别:头插法是在已经形成的链表的头部插入一个数据块,尾插法是在已经形成的链表的尾部插入一个数据块~那么你看我的代码,是用的头还是尾呢?(温馨提示:不要看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,但是第二个,报错报得更好。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 工科狗和生物喵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文之前
  • 正文
  • 正文之后
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档