首页 > 编程语言 >单链表的算法

单链表的算法

时间:2022-11-12 20:24:00浏览次数:42  
标签:node 结点 单链 struct add next 算法 head

单链表的算法

先进先出单链表(尾插法)

首先我们要知道什么是先进先出:每次插入的新元素,都是插在表尾。就比如饭堂打饭排队的时候,第一个打饭的人往往是第一个离开的,以此类推,最后一个人是最后离开的,这就是先进先出。

生成先进先出单链表:

struct node *creat1(){
    struct node *head,*tail,*p;		//结点变量声明
    int e;
    head=(struct node*)malloc(LENG);		//生成表头结点,一般第一个括号里的struct node为指针类型(不要忘记还有个*号),第二个括号里的LENG,写为sizeof(指针类型)*数据数量
    tail=head;		//尾指针指向表头
    scanf("%d",&e);		//输入第一个元素
    while(e!=0){		//e不为0(这个看需求而定,就是要有个结束的数)
        p=(struct node*)malloc(LENG);		//生成新的结点
        p->data=e;		//将元素e装进data域中
        tail->next=p;		//新节点链接到表尾(就是把尾指针指向新节点)
        tail=p;		//尾指针指向新节点
        scanf("%d",&e);		//再输入一个数赋值给e元素(准备将新的e元素装进新节点的data域中)
    }
    tail->next=NULL;		//尾结点的next置为空指针
    return head;		//返回头指针
}

实际上的操作就是在最后一个结点后面增加(插入)一个新的结点。

生成后进先出单链表(头插法)

然后我们来了解一下什么是后进先出:每次插入的新元素,都是插在表头,原本的元素将会向后排。就比如一个袋子,我们朝里面装东西,先装的东西会在下面,后装的东西会在上面。所以当我们拿东西的时候,就是先拿后装入的东西,然后再拿先装入的。

生成后进先出单链表:

struct node *creat2(){
	struct node *head,*p;		//结点变量声明
    head=(struct node*)malloc(LENG);		//生成表头结点
    head->next=NULL;		//置为空表
    scanf("%d",&e);		//输入第一个元素
    while(e!=0){		//e不为0
        p=(struct node*)malloc(LENG);		//生成新结点
        p->data=e;		//将元素e装进data域中
        p->next=head->next;		//新节点指针指向原首结点
        head->next=p;		//表头结点的指针指向新结点
        scanf("%d",&e);		//再输入一个数赋值给e元素
    }
    return head;		//返回头指针
}

简单画个图方便理解,为了方便了解这里将空结点(NULL)换为1结点;p结点换成二结点(画工不好,请见谅):

最后经过整理就是这样:

2结点增加到1结点前面了。

插入一个结点(任意位置)

有些时候我们并不想在头部或者尾部插入元素,而是想在单链表的中间位置插入一个元素。

那么我们可以有两种操作方式,第一种是知道前一个结点的情况。原理和头插法是类似的,基本上就是把head结点改成需要插入位置的前一个位置的结点即可(假设要将add结点插入在1结点和2结点之间,1结点在前面):

add=(struct node*)malloc(LENG);		//生成一个结点add
add->data=e;		//将元素e装入data域中
add->next=1->next;		//add结点指向1的后继,就是2结点
1->next=add;		//add结点成为1结点的后继

第二种是知道后一个结点的情况,其实方法基本上是一样的:

add=(struct node*)malloc(LENG);		//生成一个结点add
add->data=e;		//将元素e装入data域中
add->next=2;		//add结点成为2的前趋
1->next=add;		//add结点成为2的前趋结点的后继

需要稍微主要一下:我们不能直接"1->next=add;add->next=2;"因为一开始我们的1是未知的。

标签:node,结点,单链,struct,add,next,算法,head
From: https://www.cnblogs.com/qinyu33/p/16884550.html

相关文章

  • 实现泛型算法的几个方法
    #include<iostream>#include<stdio.h>#include<vector>#include<string>//Findaelementincontainerfunction////Youcanusethefunctiontofindaelementinaco......
  • 实验三:朴素贝叶斯算法实验
    【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;熟悉s......
  • 实验三:朴素贝叶斯算法实验
    【实验目的】理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。【实验内容】针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;熟悉s......
  • java实现Apriori算法——频繁项集的计算
    前言《数据挖掘》:用Apriori算法求特定支持度的频繁项集。算法本身不难,java萌新我却花费了一天的时间,特此记录。算法描述我们目的是求出项数为K的频繁项集即L(K)。Apriori算......
  • 窗口滑动算法
    窗口滑动算法简介滑动窗口算法思想是非常重要的一种思想,可以用来解决数组,字符串的子元素问题。它可以将嵌套循环的问题,转换为单层循环问题,降低时间复杂度,提高效率。滑动......
  • 实验三:朴素贝叶斯算法实验
    |20大数据三班| 20大数据三班 ||----|----|----||作业要求|作业要求||学号|20161337|实验三:朴素贝叶斯算法实验【实验目的】理解朴素贝叶斯算法原理,掌握......
  • 机器学习算法:UAMP 深入理解
    导读降维是机器学习从业者可视化和理解大型高维数据集的常用方法。最广泛使用的可视化技术之一是t-SNE,但它的性能受到数据集规模的影响,并且正确使用它可能需要一定学习成......
  • 代码随想录训练营第三十一天 | 贪心算法
    贪心算法的核心思想是在每一步决策中都找到局部最优解122.买卖股票的最佳时机classSolution{publicintmaxProfit(int[]prices){intn=prices.le......
  • 算法题不等式计数问题常见解法-归并排序
    类型1:单个边界范围f(i)<d(j)这种格式的不等式,算法题经常询问我们满足这样的数对有多少。中间的符号也可换成任何等号不等号,也同样适用怎么计算呢?本质上,使用归并排序就是下面......
  • 经典排序算法
    经典排序算法点击查看代码1、插入排序—直接插入排序(StraightInsertionSort)2、插入排序—希尔排序(Shell`sSort)3、选择排序—简单选择排序(SimpleSelectionSort)......