C语言之实现单链表指定结点的插入方式

目录
  • 单链表指定结点的插入
  • 链表之在指定结点前面或后面插入新的结点

单链表指定结点的插入

#include <bits/stdc++.h>
using namespace std;

typedef struct node
{
    int data;
    struct node *next;
}no;

int main()
{
    no *head,*tail,*p,*q;
    head=new no;
    head->next=NULL;
    tail=head;
    int n;
    printf("一共要输入的数:");
    cin>>n;
    int k;
    cin>>k;
    for(int i=0;i<n;i++)
    {
        p=new no;
        p->data=k;
        p->next=NULL;
        tail->next=p;//因为tail=head,所以tail没有数值,tail->next才有数值
        tail=p;
        cin>>k;
    }
    printf("输入要插入的数:");
    int m;
    cin>>m;
    q=new no;//生成一个结点来存放这个数
    q->data=m;
    q->next=NULL;
    printf("要插在哪个数和哪个数之间:");
    int a,b;
    cin>>a>>b;
    p=head;
    while(p->data!=m&&p->next!=NULL)
    {
       p=p->next;
       if(p->data==a&&p->next->data==b)
       {
           q->next=p->next;//先处理后面的结点,保证后面的链表不断开,
           //q->next可以起到链接后面链表的作用
           p->next=q;
       }
    }
    p=head->next;
    for(int j=0;j<n+1;j++)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    return 0;
}

测试一:

一共要输入的数:5
1 2 3 4 5 0
输入要插入的数:7
要插在哪个数和哪个数之间:1 2
1 7 2 3 4 5

测试二:

一共要输入的数:5
1 1 2 3 4 0
输入要插入的数:2
要插在哪个数和哪个数之间:1 1
1 2 1 2 3 4

链表之在指定结点前面或后面插入新的结点

1.我们知道链表无非就是增删改查这几个操作,而在指定结点前方或后方插入结点就是增加的一种体现。

(1)在指定结点后方插入新结点

例子:1->2->3->4->5

当要在3和4之间插入新结点的时候(即在3的后方插入新结点)

步骤:

  • 1.先找到3(point->data == data)
  • 2.将3->next(即4的地址)赋给new->next,将新结点new与结点4建立了联系

即:new->next = 3->next;

  • 3.完成上面两步骤后,再执行3->next = new;这样就完成了在3的后面插入了新的结点

切记步骤2和3不可调换。

直接上代码:

int inserFrontLinklist(struct Test* head,struct Test* new,int data1)
{
    struct Test* point = head;
    while(point != NULL)
    {
        if(point->data == data1)
        {
            //后插法的做法
            new->next = point->next;
            point->next = new;
            return 1;
        }
        point = point->next;
    }    
    return 0;
}

(2)在指定结点前方插入新结点

例子:1->2->3->4->5

在指定结点前方插入新结点要考虑两种情况,一种是特殊情况,看是否插入的位置是在链表头,另一种情况是正常插入,插入的地方不是链表头,那么我们一起来看看你两种情况怎么办。

1.如果要插入的点刚好是在链表头的话

    struct Test* point = head;
    if(point->data == data)
    {
        new->next = head;
        return new;
    }//如果要找的那个数刚好在头结点的话那么直接插进去即可

以上两个操作就完成了在链表头插入新的结点的操作,但是记得return的是new,而不是head,因为现在的head已经发生了改变。

2.如果不是在链表头,即正常插入

while(point->next != NULL)//这里跟后插法的区别,后插法是直接判断point本身,而这里是判断point->next
    {
        if(point->next->data == data)//这里也一样,后插法是判断point->data,而这里是判断point->next->data;
        {
            new->next = point->next;//这里的算法跟后插法一样
            point->next = new;
            
            printf("Congratulations,you find the data success!\n");
            return head;
        }
        point = point->next;
    }

虽然这里的核心代码跟上面的后插法是一样的,但是两者的判断条件不一样,后插法的判断条件是while(point != NULL),而前插法的判断条件是while(point->next != NULL),一定要切记这两点

直接上代码:

struct Test* insertBehindLinklist(struct Test *head,struct Test* new,int data)
{//前插法的做法
    struct Test* point = head;
    if(point->data == data)
    {
        new->next = head;
        return new;
    }//如果要找的那个数刚好在头结点的话那么直接插进去即可。
    
    while(point->next != NULL)//这里跟后插法的区别,后插法是直接判断point本身,而这里是判断point->next
    {
        if(point->next->data == data)//这里也一样,后插法是判断point->data,而这里是判断point->next->data;
        {
            new->next = point->next;//这里的算法跟后插法一样
            point->next = new;
            
            printf("Congratulations,you find the data success!\n");
            return head;
        }
        point = point->next;
    }
    printf("Sorry, you find error!\n");
    
    return head;
}

切记一点:

如果链表头发生了改变的话,一定要返回新的链表头,如果链表头没发生变化的话,不用返回链表头,在main里也能检测到链表结点的变化(因为指针本身就是一个地址)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言深入探索之单链表与typedef的用法

    目录 前言 详解typedef关键字 含义 具体使用 详解单链表参数形式 指针知识补充 单链表形参详解 单链表实战案例 完整代码实现 详解头插建表 运行效果 前言 昨天博主去本站问答贴子逛了逛,然后发现了好多关于数据结构线性表,具体来说是单链表的问题.有的是没有一点思路,无从下手:有的是看不懂代码,不理解关键字以及被形参的形式气的不行,我总结了一下常见问题来给大家带来干货,到后面还有简单案例来巩固知识,弄透一题胜无脑刷百题,接下来是正文内容. 详解typedef关键字 含义 C语言允许用户使用

  • C语言数据结构之单链表与双链表的增删改查操作实现

    目录 前言 单链表的增删改查 定义结构体以及初始化 增加结点 删除结点 查找修改结点 移除结点 最终效果 双链表的基本操作 初始化建表 遍历双链表 指定位置插入结点 指定位置删除结点 查找结点位置 最终效果 结语 前言 上篇博客分享了创建链表传入二级指针的细节,那么今天就分享几个c语言课程实践设计吧.这些程序设计搞懂了的话相当于链表的基础知识牢牢掌握了,那么再应对复杂的链表类的题也就能慢慢钻研了.学习是一个积累的过程,想要游刃有余就得勤学苦练! 单链表的增删改查 (1)项目需求 构造带有头结点的

  • C语言如何实现头插法建立单链表

    目录 怎么将结点一个个插入在某个结点前面呢? 然后再在头结点的后面插入新的结点 首先要明确一点,利用头插法建立出来的单链表的输出都是逆序的(就是和你的输入顺序反着来的)然后就是要明确生成的新结点是一个个加在某个结点的前面的(这个结点不一定是头结点,下面的代码是插在p的前头),这就是头插法. 怎么将结点一个个插入在某个结点前面呢? 下面的图可以比较详细的展示出来: 至少对我来说挺详细的哈 p->next=head->next; //一开始 head->next=NULL:  head-&g

  • C语言中如何实现单链表删除指定结点

    目录 单链表删除指定结点 链表的删除结点(各种方法) 链表中删除第i个结点 删除与链表中与a相同的结点 删除链表中重复元素 单链表删除指定结点 在单链表中删除指定的结点.这里单链表是用尾插法建立的,因为尾插法输出的顺序与输入的顺序是相同的. #include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node *next; }no; int main() { no *head,*tai

  • C语言数据结构之单链表的实现

    目录 一.为什么使用链表 二.链表的概念 三.链表的实现 3.1 创建链表前须知 3.2 定义结构体 3.3 申请一个节点 3.4 链表的头插 3.5 链表的尾插 3.6 链表的尾删 3.7 链表的头删 3.8 寻找某节点 3.9 在指定节点前插入节点 3.10 删除指定节点前的节点 3.11 链表的销毁 一.为什么使用链表 在学习链表以前,我们存储数据用的方式就是数组.使用数组的好处就是便于查找数据,但缺点也很明显. 使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要移动大量的

  • C语言之实现单链表指定结点的插入方式

    目录 单链表指定结点的插入 链表之在指定结点前面或后面插入新的结点 单链表指定结点的插入 #include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node *next; }no; int main() { no *head,*tail,*p,*q; head=new no; head->next=NULL; tail=head; int n; printf("一共要

  • 数据结构 C语言实现循环单链表的实例

    数据结构 C语言实现循环单链表的实例 实例代码: //=========杨鑫========================// //循环单链表的实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }Node,*LinkedList; int count = 0; //1.单循环

  • 一文弄懂C语言如何实现单链表

    目录 一.单链表与顺序表的区别: 一.顺序表: 二.链表 二.关于链表中的一些函数接口的作用及实现 1.头文件里的结构体和函数声明等等 2.创建接口空间 3.尾插尾删 4.头插头删 5.单链表查找 6.中间插入(在pos后面进行插入) 7.中间删除(在pos后面进行删除) 8.单独打印链表和从头到尾打印链表 9.test.c 总结 一.单链表与顺序表的区别: 一.顺序表: 1.内存中地址连续 2.长度可以实时变化 3.不支持随机查找 4.适用于访问大量元素的,而少量需要增添/删除的元素的程序 5

  • C语言实现无头单链表详解

    目录 链表的结构体描述(节点) 再定义一个结构体(链表) 断言处理 & 判空处理 创建链表 创建节点 头插法 打印链表 尾插法 指定位置插入 头删法 尾删法 指定位置删除 查找链表 删除所有指定相同的元素 总结 再封装的方式,用 c++ 的思想做无头链表 链表的结构体描述(节点) #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int DataType; //节点 typede

  • C语言数据结构之单链表存储详解

    目录 1.定义一个链表结点 2.初始化单链表 3.输出链表数据 4.完整代码 如果说,顺序表的所占用的内存空间是连续的,那么链表则是随机分配的不连续的,那么为了使随机分散的内存空间串联在一起形成一种前后相连的关系,指针则起到了关键性作用. 单链表的基本结构: 头指针:永远指向链表第一个节点的位置. 头结点:不存任何数据的空节点,通常作为链表的第一个节点.对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题. 首元结点:首个带有元素的结点. 其他结点:链表中其他的节点. 1.定义一

  • C语言数据结构之单链表操作详解

    目录 1.插入操作 2.删除操作 3.查找操作 4.修改操作 5.完整代码 1.插入操作 (1)创建一个新的要插入的结点 (2)将新结点的 next 指针指向插入位置后的结点 (3)将插入位置前的节点指针 next 指向新的结点 注意:步骤(2)(3)的顺序不能颠倒,否则会导致插入位置后的部分链表丢失. 插入位置一共分三种,分别是头部插入.中间插入和尾部插入. 如图: 代码: link* insertElem(link* p,int elem,int pos){ link* temp = p;/

  • Go语言数据结构之单链表的实例详解

    目录 任意类型的数据域 实例01 快慢指针 实例02 反转链表 实例03 实例04 交换节点 实例05 任意类型的数据域 之前的链表定义数据域都是整型int,如果需要不同类型的数据就要用到 interface{}. 空接口 interface{} 对于描述起不到任何的作用(因为它不包含任何的method),但interface{}在需要存储任意类型的数值的时候相当有用,因为它可以存储任意类型的数值. 一个函数把interface{}作为参数,那么它可以接受任意类型的值作为参数:如果一个函数返回i

  • C语言数据结构之单链表的查找和建立

    目录 单链表的查找 按位查找 按值查找 单链表的建立 尾插法 头插法建立单链表 单链表的查找 其实在单链表的插入和删除中,我们已经使用过单链表的查找方法,因为插入和删除的前提都是先找到对应的结点,所以这里就不再多解释 按位查找 GetElem(L, i):按位查找操作.获取表 L 中第 i 个位置的元素的值 //按位查找 LNode * GetElem(LinkList L, int i) { if (i < 0) return false; LNode *p; //指针p指向当前扫描到的结点

随机推荐