头插法和尾插法

article/2025/9/30 2:06:04

链表的头插法和尾插法

表结构的声明

typedef int ElemType;
typedef struct node //定义链表的结点的结构
{ElemType data;//定义链表的数据域struct node *next;//定义链表中的指针域
}slink;

头插法

1,从一个空表开始,重复读入数据,生成新结点。
2,将读入数据存放到新结点的数据域中。
3,将新结点插入到当前链表的表头上。
4,直到读入n个元素为止。截取自教材
现在配上代码

void Headinsert(slink *s,int n) //创造一个头插法的表,结构类型是slink;"n"是这个链表的长度
{slink *p;//再定义一个p(其结构与*s一样)int i;if (n < 1){printf("链表的长度有误,请重新输入");return;}s = NULL;//在这里,我把s作为头指针 相当于head =NULL(目的是让头指针为空)
/*---------------------以下内容为核心,务必认真理解!!!----------------   */for (i = 1; i <= n; i++)//开始创建单链表{p = (slink*)malloc(sizeof(slink));printf("请输入第%d的数值\n",i);scanf_s("%d",&p->data);//输入的值存入到data里面;//把头指针里的内容给p的nexts = p;//再让头指针s 指向p->data(因为在下一次循环中就会把s中的内容,赋值到p—>next) }

我现在输入一下这几个数来演示下:

p->next = s;//把头指针里的内容给p的next

在这里插入图片描述
在这里插入图片描述

可以看到先输入的数25,在输出的时候变到了最后一个,我们可以这样考虑,头插法相当于你在食堂排队打饭,这时候来个人,突然插队,它插的位置还是第一个。在这里插入图片描述

尾插法

在这里插入图片描述

void Tailinsert(slink *s,int n) //创建尾插法
{slink *r, *p;if (n < 1) {printf("链表的长度有误,请重新输入");return;}r = s = (slink*)malloc(sizeof(slink));//创建头结点(注:头插法没有)for (int i = 1; i <= n; i++){p = (slink*)malloc(sizeof(slink));printf("请输入第%d的数值\n",i);scanf_s("%d",&p->data);r->next = p;//把新声明的值p给 r->next(在这里我们定义的“r”是头结点,因为头结点不能移动所以用的是头结点的另一变量r)r = p;//使指针r指向p}r->next = NULL;//在结束循环后使最后一个结点为NULL;}

在这里插入图片描述
尾插法相对简单,理解了头插法,尾插法就很简单了,我现在输入与头插法相同的数据。
在这里插入图片描述
可以发现,我们怎么输入的,它就怎么显示,按到我们的顺序来的

总体代码

#include<stdio.h>
#include<stdlib.h>typedef int ElemType;
typedef struct node //定义链表的结点的结构
{ElemType data;//定义链表的数据域struct node *next;//定义链表中的指针域
}slink;void Headinsert(slink *s,int n) //创造一个头插法的表,结构类型是slink;"n"是这个链表的长度
{slink *p;//再定义一个p(其结构与*s一样)int i;if (n < 1){printf("链表的长度有误,请重新输入");return;}s = NULL;//在这里,我把s作为头指针 相当于head =NULL(目的是让头指针为空)for (i = 1; i <= n; i++)//开始创建单链表{p = (slink*)malloc(sizeof(slink));printf("请输入第%d的数值\n",i);scanf_s("%d",&p->data);//输入的值存入到data里面;p->next = s;//把头指针里的内容给p的nexts = p;//再让头指针s 指向p->data(因为在下一次循环中就会把s中的内容,赋值到p—>next) }printf("该链表内的数据为:\n");for (int j = 0; j < n; j++){printf("  %d  ", s->data);//显示当前数据s = s->next;}printf("\n");
}
void Tailinsert(slink *s,int n) //创建尾插法
{slink *r, *p;if (n < 1) {printf("链表的长度有误,请重新输入");return;}r = s = (slink*)malloc(sizeof(slink));//创建头结点(注:头插法没有)for (int i = 1; i <= n; i++){p = (slink*)malloc(sizeof(slink));printf("请输入第%d的数值\n",i);scanf_s("%d",&p->data);r->next = p;//把新声明的值p给 r->next(在这里我们定义的“r”是头结点,因为头结点不能移动所以用的是头结点的另一变量r)r = p;//使指针r指向p}r->next = NULL;//在结束循环后使最后一个结点为NULL;for (int j = 0; j < n; j++){printf("  %d  ", s->next->data);//在这里我为啥用s->next->data 原因是直接用s->data 的话出现的数据是头结点,头结点没有数值,所以无法显示s = s->next;//定位到下个结点}printf("\n");
}
void selecttion(int button,int n) 
{slink s;if (button == 1){printf("你选择的是头插法\n");Headinsert(&s, n);}else if (button == 2){printf("你选择的是尾插法\n");Tailinsert(&s, n);}else{printf("输入错误指令,请重新输入\n");scanf_s("%d",&button);selecttion(button,n);}
}
int main() 
{int n,button;char Exit;printf("请输入链表的长度n\n");scanf_s("%d", &n);printf("以哪种方式生成链表?1.头插法 2.尾插法\n");scanf_s("%d", &button);selecttion(button, n);printf("是否退出?y/n\n");getchar();scanf_s("%c", &Exit);if (Exit == 'y'){exit(0);}return main();
}

总结

1,了解了尾插法与头插法的区别
2,在写main函数时,发现有些代码,只能在指定的结构完成。
3,我在写代码时,并没有声明head,我用的*s 就拿来代替了head
4,尾插法遍历的时候一定要写成s->next->data 因为他第一个是,空节点,如果运行的话会出现错误,所以要next
--------------------------------------------------------------------------------2020.03.16


http://chatgpt.dhexx.cn/article/ZqbZtvON.shtml

相关文章

单链表之头插法

1、前言&#xff1a; 什么是头插法&#xff1f;说白了头插法就是新增节的点总是插在头节点后面&#xff0c;然后大家可能会有疑惑&#xff0c;什么是新增节点&#xff0c;什么是头节点呢&#xff0c;下面请听俺娓娓道来。。。 2、预前准备&#xff1a; 头节点&#xff1a;一…

单链表的头插法和尾插法的示例

单链表是数据结构中最基本的数据结构&#xff0c;单链表有头插法和尾插法&#xff0c;今天有空把这两者做成一个实验示例以作比较。 提示&#xff1a;编译代码是否通过可能与编译器的版本有关&#xff0c;本程序是在 Android 操作系统下的 Compiler C语言编译器下编译通过。 一…

头插法实现单链表逆置

在头结点的后面依次插入后面的结点&#xff0c;q从第二个结点向后移动遍历&#xff0c;p永远在第一个结点完成头插法逆置单链表。 void reverseL(Linklist &L){//头插法逆转单链表if(L!NULL){LNode* pL->next;//p等于第一个结点LNode* qp->next;//q等于第二个结点p-…

HashMap/ConcurrentHashMap/头插法/尾插法

1.1 HashMap JDK1.7 JDK1.8 存储 数组链表 数组链表红黑树 位置算法 h & (length-1) h & (length-1) 链表超过8 链表 红黑对(链表超过8且数组长度超64) 节点结构 Entry<K,V> implements Map.Entry<K,V> Node<K,V> implements Map.Entry…

C语言 链表 头插法

代码&#xff08;VS2017中运行&#xff09; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct student {int num;float score;struct student *pnext;//*pnext存的是下一个节点的首地址 }stu,*pst…

头插法建立单链表

头插法建立单链表图示过程&#xff08;其中an表示时间上第n个建立的节点&#xff0c;L为头指针&#xff0c;箭头表指向&#xff0c;sn代表an的地址&#xff09; 结构体代码与主函数如下&#xff1a; struct Link //创建一个结构体类型 {int data; //数据域struct Link* p; /…

Java实现头插法

实现原理&#xff1a; 这是第一个头结点&#xff0c;现在要插入一个节点&#xff0c;也就是让新节点指向该头结点&#xff0c;任何让head指向新节点&#xff0c;新节点变为头结点。 代码实现&#xff1a; 实体类&#xff1a; public class entity {private String data;privat…

单链表的头插法

链表与顺序表不同链表是用一组任意的储存单元来存放线性表的结点&#xff0c;这组结点可以是连续的&#xff0c;也可以是非连续的&#xff0c;甚至可以是零散分布在内存的任何位置&#xff0c;为了能正确的去表达结点的逻辑关系&#xff0c;必须在储存元素值的同时&#xff0c;…

HashMap在JDK1.7版本头插法实现解析

HashMap在JDK1.7版本头插法实现解析 先解释下何为头插法。大家都知道HashMap在JDK1.7版本的数据结构为数组链表这样的形式。而头插法说的就是在往HashMap里面put元素时&#xff0c;此时新增在链表上元素的位置为链表头部&#xff0c;也就是数组桶位上的那个位置&#xff0c;故…

头插法链表反转c语言,用头插法反转链表

题目&#xff1a;输入一个链表的头结点&#xff0c;反转该链表&#xff0c;并返回反转后链表的头结点。 链表结点定义如下&#xff1a; typedef char item_t; typedef struct node { item_t item; struct node * next; } node_t; 分析&#xff1a; 使用头插法可以快速实现反转。…

链表头插法

头插法 从一个空表头指针开始&#xff0c;重复读入数据&#xff0c;生成新节点&#xff0c; 将读入数据存放到新节点的数据域中&#xff0c;永远是将新节点插入到当前链表的头节点的后面&#xff0c;第一个创建的节点是放在最后的&#xff0c;直到读入结束标志才停止创建。 #in…

HashMap头插法

HashMap在1.8&#xff08;不含&#xff09;之前对于新增元素的hash冲突的链表插入采用的是头插法&#xff0c;1.8之后开始改用尾插法。那么头插法有什么问题呢&#xff1f;为什么改用尾插法呢&#xff1f;源码学习一下咯 HashMap-jdk1.7.0_80 put新增map元素 public V put(K…

(最详细)c语言尾插法头插法代码讲解

1.尾插法 尾插法 头指针和尾指针都指向头结点&#xff0c;然后往里边插入元素&#xff0c; 每插入一个元素尾指针就后移一下 其中如下图所示 尾插法的核心代码是&#xff1a; pointer->next s; //pointer指向新生成的节点 pointer pointer->next;//pointer移动至新…

头插法和尾插法总结(动图版)

代码使用结构体&#xff1a; typedef struct Node{int value;struct Node* next; }*Link;头插法&#xff1a;利用头指针控制链表节点的增加。 核心&#xff1a; newNode->next head->next; head->next newNode; //头插法创建链表 Link headCreateLink(int n){//头指…

头插法和尾插法建立单链表详解与实现

写在前面&#xff1a;本文使用C语言和C引用&#xff0c;学C和C的同学都是可以看懂的&#xff0c;C毕竟向下兼容C。很详细&#xff0c;一篇能搞懂代码和原理。 先来了解几个简单概念 单链表就是线性表的链式存储&#xff1b; 头结点&#xff1a;单链表在第一个结点之前附加了一个…

链表的三种插入方法(头插法,尾插法,任意位置插入)

插入作为链表的四大基本操作之一&#xff08;增删改查&#xff09;&#xff0c;通常都会借助插入的方法增添信息&#xff0c;这一部分为大家着重讲解插入法。 1.头插法 简而言之&#xff0c;就是从链表的头部进行一个插入&#xff0c;定义一个结构体指针的新节点&#xff0c;…

【数据结构】:单链表之头插法和尾插法(动图+图解)

头插法和尾插法 一、头插法&#x1f4a4;思考一&#xff1a;头插法的核心是什么❓❗❗ 重点一&#xff1a;以带头结点方式实现头插法❗❗ 重点二&#xff1a;以不带头结点方式实现头插法 二、尾插法&#x1f4a4;思考二&#xff1a;尾插法的核心是什么❓❗❗ 重点三&#xff1a…

链表:头插法与尾插法(简易图解和代码)

头插法 定义&#xff1a;输入的数据次序生成的链表节点次序相反&#xff0c;例如&#xff1a;按1,2,3顺序进行头插之后&#xff0c;最终排序却变成了3,2,1。简而言之就是逆序插入。 定义图解&#xff1a; 代码图解&#xff1a; 代码&#xff1a;&#xff08;使用头插法建立单…

未声明的标识符

出现未声明的标识符错误&#xff0c;有可能是真的没有声明。但是也有可能是代码中有些注释&#xff0c;格式不对&#xff0c;导致声明的变量的作用域提前结束了。可以把注释都删掉试试

c2065 未声明的标识符 解决ok

场景1&#xff1a; cv::Mat pad_img; cv::Mat img; img 在一个if else后面声明&#xff0c;就报错了 解决方法&#xff0c;把cv::Mat 声明放到前面就行了&#xff0c;原因未知。 场景2&#xff1a; int a3; a为未声明的标识符&#xff0c;加了各种头文件&#xff0c;都不起…