正文之前

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

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

正文

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

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

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

那么你看我的代码,是用的头还是尾呢?(温馨提示:不要看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. sqlserver isnull判断

    --在新增或编辑的时候设置默认值或加isnull判断 Sql isnull函数 ISNULL(columName, 0)<>35 或 ISNULL(columName, '')<&g ...

  2. 【Android Developers Training】 53. 打印HTML文档

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. webpackage 2.x 使用

    webpackage 2.x 使用 安装---(在项目目录下) //1.初始化npm的配置(添加package.json) npm init //2.安装 webpackage npm install ...

  4. winform控件闪烁问题终极办法

    protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle ...

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

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

  6. Japanese Learning - Words and Sentences 1

    1. いらっしゃいませ.何名さまですか. 二人です. タバコをお吸いになりますか. かしこまりました.少々お待ちください. お勘定お願いします. ご一緒でよろしいでしょうか. 別々にお願いします. 2 ...

  7. 使用three.js实现机器人手臂的运动效果

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页上看到许多精彩的演示.不过,这款引擎目前还处在比较不成熟的开发阶段 ...

  8. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  9. Java电器商场小系统--简单的java逻辑

    //商场类public class Goods { int no; //编号 String name; //商品名称 double price; //商品价格 int number; //商品数量 / ...

  10. js 数组里求最大值和最小值

    // 数组里相邻两个数做比较 取满足条件的那个(以此类推) var arr = [1,3,4,5,6,7]; function Max(array){ var max = array[0]; for( ...