正文之前

昨天晚上阶段性的完成了一部分数学的复习,所以今天打算撸一撸代码,然后发现提电脑忘指针。所以自己磕磕盼盼,对照了一下网上的代码,总算把线性存储单链表的数据类型实现,给自己写出来了。

废话不多说,我也不排版,大家自己好好看,有疑问的在下面评论交流。

正文

一觉醒来,世界都有了变化,上午的焦虑不翼而飞~

下午重新审视了下代码,发现了链表的头插法和尾插法的区别:

头插法是在已经形成的链表的头部插入一个数据块,尾插法是在已经形成的链表的尾部插入一个数据块~

那么你看我的代码,是用的头还是尾呢?(温馨提示:不要看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;
}
>运行结果 ![](//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;
}

运行结果:

14
14 hi~
432
432 hi~
456
456 hi~
578
578 hi~
123
123 hi~
545
545 hi~
634
634 hi~
4244
4244 hi~
Merge:
123 545 634 4244 14 432 456 578 Program ended with exit code: 0

正文之后

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

【我的漫漫跨考路】数据结构之单链表线性存储实现 Beta的更多相关文章

  1. 【我的漫漫跨考路】有生之年·调完了BUG--冒泡排序C++版本

    正文之前 今天去牛客网试了试一些实战编程题,感觉贼有意思,但是也很难,挑了个成绩排序的算法题我就开始怼! 对我一个编程经验并不是很丰富的人来说,确实算是个挑战了. 所以我满满当当的搞了四个小时多,才算 ...

  2. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  3. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  4. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

  5. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  6. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  7. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  8. 数据结构 - 静态单链表的实行(C语言)

    静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...

  9. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

随机推荐

  1. php隔行换色输出表格

    <?php header("Content-type:text/html;charset=utf-8"); $str=''; $str.='<table border= ...

  2. GC机制总结

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  3. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  4. net 中web.config单一解决方法 (其他配置引入方式)

    近期一个项目需要写许多的配置项,发现在单个web.config里面写的话会很乱也难于查找 所以搜了一下解决了,记录下来 一.   webconfig提供了引入其他config的方式 <conne ...

  5. (转载)Oracle10g 数据泵导出命令 expdp 使用总结(三)

    原文链接:http://hi.baidu.com/edeed/item/19aa0df856da3e19a6298894 Oracle10g 数据泵导出命令 expdp 使用总结(一) 14. JOB ...

  6. CSS3-loading动画(一)

    前两天从一个网站中看到了一些比较好的loading动画效果,是用纯CSS3来写的,感觉不错,就尝试着照着效果来自己写出来. 在开始之前,先复习一个小知识:CSS3新增的关键帧动画,可以用来实现很多的动 ...

  7. Debian 8添加kali更新源并安装metasploit

    一.Debian 8添加kali更新源 中科大kali更新源: deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contr ...

  8. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  9. laravel+vue组合的项目中引入ueditor(打包成组件形式)

    前言:最近写东西需要用到ueditor,并且需要是在vue组件中引入. (本博客默认你已经配置了laravel+vue的项目环境,如果还没有配置好的的小伙伴,可以看看我的另一篇博客,链接: http: ...

  10. C#装箱拆箱

    .       装箱和拆箱是一个抽象的概念 2.       装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型        利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类 ...