写在前面:本文使用C语言和C++引用,学C和C++的同学都是可以看懂的,C++毕竟向下兼容C。很详细,一篇能搞懂代码和原理。

先来了解几个简单概念

单链表就是线性表的链式存储;

头结点:单链表在第一个结点之前附加了一个结点,这个结点里面没有存放我们要使用的数据,只是头结点方便我们对链表进行操作而设立的;

头指针:用来标识一个单链表,头指针为NULL的话就是一个空表,本文的头指针就是LinkList L;

头插法:从一个空表开始,生成一个新的结点之后,将这个数据插在头结点和头结点指向的数据(原来的第一个数据)之间,此时这个新结点就变成了第一个数据,简单说就是把数据插入在表头。最终数据是倒序输出来的;

尾插法:也就是把数据从表尾插入进去,最后数据是你怎么输入的他就怎么输出;

头插法过程:申请好空间,输入我们要插入的数据之后,我们申请的新的结点的指针(s->next)指向后一个数据的空间(L->next),头部的指针(L->next)指向新生成的空间(s),就这么简单!

第一步:先创建结构体,结构体里面一个存放数据的变量,一个存放指向下一个元素的指针的变量

/*:第一步:定义结构体*/
typedef int ElemType;//可随时修改数据的类型
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;

第二步:创建变量和初始化

/*第二步:创建变量和初始化*/
int main()
{LinkList L;Fore_insert(L);Print_list(L);return 0;
}

第三步:编写头插法函数

/*第三步:头插法*/
LinkList Fore_insert(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));//申请链表空间,最开始是空链表L->next = NULL;//链表的结构体指针赋值为空int x;//我们要插入的数据LinkList s;scanf("%d", &x);while (x != 9999) {//输入9999就停下了s = (LinkList)malloc(sizeof(LNode));//申请新结点的空间s->data = x;//把x放到结点里面去s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}

尾插法的过程:最开始链表是空的,申请空间之后,r表示链表尾部,链表尾部的结构体指针(r->next)指向新结点的空间(s),然后链表尾部变成了新空间s,要把r移向链表尾部(r=s),方便对接下来插入的数据进行操作,对于最后一个插入的数据,它的结构体指针要赋值成NULL。

第四步:编写尾插法函数

/*第四步:尾插法*/
LinkList Final_insert(LinkList& L)
{L = (LinkList)malloc(sizeof(LNode));int x;LinkList s;//新结点的指针LinkList r = L;//r指向链表尾部,插入一个数据就要移动到链表尾部哦!scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;//r移动到链表尾部scanf("%d", &x);}r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULLreturn L;
}

第五步:把结构体打印出来看看

/*第五步:打印结构体数据*/
void Print_list(LinkList L)//注意前面的头插和尾插都是传址调用,这里是传值调用
{L = L->next;//L是头结点,L->next指向第一个数据while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束printf("%d ", L->data);L = L->next;}printf("\n");
}

总的代码在这里:

#include<stdio.h>
#include<stdlib.h>/*:第一步:定义结构体*/
typedef int ElemType;
typedef struct LNode {ElemType data;struct LNode* next;
}LNode,*LinkList;/*第三步:头插法*/
LinkList Fore_insert(LinkList &L)
{L = (LinkList)malloc(sizeof(LNode));L->next = NULL;int x;LinkList s;scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}/*第四步:尾插法*/
LinkList Final_insert(LinkList& L)
{L = (LinkList)malloc(sizeof(LNode));int x;LinkList s;LinkList r = L;scanf("%d", &x);while (x != 9999) {s = (LinkList)malloc(sizeof(LNode));s->data = x;r->next = s;r = s;scanf("%d", &x);}r->next = NULL;//一定不要忘记把最后一个结点的指针赋值为NULLreturn L;
}/*第五步:打印结构体数据*/
void Print_list(LinkList L)
{L = L->next;//L是头结点,L->next指向第一个数据while (L != NULL) {//遍历到NULL也就是最后一个数据的指针就是NULL,循环结束printf("%d ", L->data);L = L->next;}printf("\n");
}/*第二步:创建变量和初始化*/
int main()
{LinkList L;Fore_insert(L);Print_list(L);//Final_insert(L);//Print_list(L);return 0;
}

最后的控制台输出结果如图所示:

头插法结果:

尾插法结果:

头插法和尾插法建立单链表详解与实现相关推荐

  1. 采用头插法和尾插法建立单链表

    面说一下如果用C语言建立单链表,分为头插法和尾插法两种. 采用头插法建立单链表 该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后 ...

  2. 单链表的建立(C语言):头插法和尾插法建立单链表

    采用头插法建立单链表 该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后,如图2-4所示. 图2-4  头插法建立单链表 头插法建 ...

  3. 用头插法和尾插法建立单链表(带头结点)

    尾插法建立单链表 LinkList List_TailInsert(LinkList &L) {int x;L=(LinkList)malloc(sizeof(LNode));LNode *s ...

  4. 头插法和尾插法建立单链表

    在进行单链表的基本运算之前必须先建立单链表,建立单链表的常用方法有两种:头插法建表和尾插法建表 头插法建表,从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后 ...

  5. 数据结构—分别用头插法和尾插法建立单链表

    #include <iostream> using namespace std; typedef struct LNode{int data;struct LNode *next; }LN ...

  6. 带头结点的头插法和尾插法创建单链表

    首先我们先定义一个链表的结构体. typedef int DataType; typedef struct Node {DataType data;struct Node* next; }*SLNod ...

  7. 头插法和尾插法创建单链表

    首先声明一个单链表结构体. typedef struct LNode {int data;struct LNode * next;}LNode,*LinkNode; 链式存储如何一次性存储足够多的数据 ...

  8. 头插法和尾插法建立带头节点的单链表

    有两种方法建立单链表,尾插法和头插法,他们的区别是:头插法是按照输入元素倒序建立,为尾插法为顺序插入,并且多一个尾节点,我们一般使用尾插法. 一.头插法 代码为: pCurr -> next = ...

  9. C++头插法尾插法建立单链表,合并两个有序单链表

    A和B是两个单链表(带表头结点),其中元素递增有序.设计一个算法,将A和B归 并成一个按元素值非递减有序的链表 C,C由A 和B 中的结点组成. #include<iostream> #i ...

最新文章

  1. oracle实例包括用户进程吗,ORACLE实例和ORACLE数据库详解(三)
  2. python3.7 6如何安装-深度linux安装Python3.7.6
  3. 核心概念——节点/边/Combo——内置节点——Ellipse
  4. c语言复化求积公式程序,第六章 函数与宏定义实验2
  5. android edittext不可复制_精选Android中高级面试题:性能优化,JNI,设计模式
  6. 大数据学习笔记43:Hive - JDBC编程
  7. SpringMVC框架第一天
  8. 论文笔记:Semantic Relation Reasoning for Shot-Stable Few-Shot Object Detection
  9. 几种常用网页返回顶部的代码
  10. Windows更改系统字体
  11. 2020微博热点数据简析
  12. 模拟微博登陆,获取微博cookie
  13. windows系统中nul文件删不掉,文件夹无法删除出现无法删除nul参数不正确,MS-DOS命令无效,等各种难以删除的文件或者文件夹
  14. Groovy 快速入门
  15. 随机测试数据生成 与 Pandas迭代方法性能对比
  16. C#--Obsolete
  17. 不给移动一分钱!10个免费发短信的国外站点
  18. 针对此次疫情的防控建议
  19. Python生成英文大小写和数字的随机数
  20. 建立良好体验度的Web注册系统

热门文章

  1. 判断一个链表中是否有环
  2. 锐捷无线ap服务器怎么绑定mac,锐捷无线ap配置命令教程
  3. python 执行命令,并获取结果及执行状态(os.popen、subprocess.Popen、os.system)
  4. 扒一扒神经网络--NIN
  5. keras 自带VGG16 net 参数分析
  6. ToF的多径干扰抑制分析----ToF技术专题系列(四)
  7. 一加android8稳定版,一加 8 安卓 11 稳定版系统发布
  8. 云上“两地三中心”,中小企业都用得起的多保险灾备方案
  9. 从官方例程深度学习海思SDK及API-第2/11季视频课程-朱有鹏-专题视频课程
  10. 《HelloGitHub》第 68 期