正文之前

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

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

正文

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

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

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

那么你看我的代码,是用的头还是尾呢?(温馨提示:不要看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. 最长非降子序列的O(n^2)解法

    这次我们来讲解一个叫做"最长非下降子序列"的问题及他的O(n^2)解法. 首先我们来描述一下什么是"最长非下降子序列". 给你一个长度为n的数组a,在数组a中顺 ...

  2. CentOS上安装Hadoop2.7,添加数据节点,运行wordcount

    安装hadoop的步骤比较繁琐,但是并不难. 在CentOS上安装Hadoop2.7 1. 安装 CentOS,注:图形界面并无必要 2. 在CentOS里设置静态IP,手工编辑如下4个文件 /etc ...

  3. (转载)Apache与Tomcat 区别联系

    原文链接:http://www.admin10000.com/document/974.html Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.J ...

  4. ReactiveCocoa源码解析(六) SignalProtocol的take(first)与collect()延展实现

    上篇博客我们聊了observe().map().filter()延展函数的具体实现方式以及使用方式.我们在之前的博客中已经聊过,Signal的主要功能是位于SignalProtocol的协议延展中的, ...

  5. [jbdj]SpringMVC框架(3)映射器

    映射器:什么样的请求交给Action. 1} class  :  BeanNameUrlHandlerMapping  要掌握, 将程序员定义的Action所对应的<bean>标签的nam ...

  6. 使用URLConnection调用axis1.4开发的webservice

    写在前面: 调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可:2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是a ...

  7. CentOS 6.5 下安装 Redis 2.8.7(转载)

    wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...

  8. 编写一个可配置的网页信息提取组件 (二)—— 优雅的.net core 配置系统

    引言 在上篇文章(http://www.cnblogs.com/lightluomeng/p/7212577.html)中,初步实现了一个可配置的网页信息分析组件.但是由于是奔着解决事情的目的去的,所 ...

  9. 玩玩微信公众号Java版之五:获取关注用户信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同).公众号可通过本接口来根据Op ...

  10. synchronized Lock用法

    在介绍Lock与synchronized时,先介绍下Lock: public interface Lock { void lock(); void lockInterruptibly() throws ...