链表基础2(超简单)--单链表的插入和删除

本文详细介绍了单链表的基础操作,包括如何创建、插入和删除节点。通过实例和代码演示,阐述了删除节点时将前后节点连接以孤立目标节点并释放内存的过程,以及插入节点时调整指针指向的方法。此外,提供了完整的C语言实现代码,帮助读者理解链表操作的原理。
摘要由CSDN通过智能技术生成

这篇文章是基于链表基础1(超简单)–创建一个长度为n的单链表所写的,需要看基础的可以跳过去,链表的基础知识这里就不在讲了。

我们首先来看一下链表的删除,话不多说直接上图。

在这里插入图片描述
如图,比如我们要删除B这个节点。我们先来看一下删除后的图。一对比你就明白啦!
在这里插入图片描述
两个图一对比你就发现,如果我们要删除B节点,我们首先要将B节点的前后两个节点A,C连起来,这样B不就孤立了嘛,我们就可以给他free掉了!是不是灰常简单呀!
我们来看一下具体代码实现。

先看一下这个链表的结构

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
}link;
link *pnew;//新节点
link *phead;//头节点
link *ptemp;//临时节点
link *pdel;//删除功能用
link *pins;//插入功能用
下面是具体删除部分代码
void del(void)
{
    int x;
    int flag=0;
    printf("\n");
    printf("请输入你要删除的数\n");
    scanf("%d", &x);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
      if(ptemp->pnext->date==x)//遍历到要删除的节点的前一个节点
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    pdel=ptemp->pnext;
    if(flag==1)
    {
        ptemp->pnext=pdel->pnext;
        free(pdel);
    }
}

好了我们删除部分就结束了,下面我们来看一下链表的插入

如果你删除看懂了插入就也很简单啦!
比如有A,C这样两个节点,我们要在中间插入一个B节点,我们要如何操作呢?是不是我们只要把A 节点的指针域存放B节点的地址,然后B节点的指针域存放C节点的地址,这样不就插入成功了嘛!是不是也很简单啦!
话不多说上代码。链表结构还是上面那个结构

void ins(void)
{
    int y;
    int flag=0;
    printf("\n");
    printf("请输入你要插入的数的位置\n");
    scanf("%d", &y);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==y)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    if(flag=1)
    {
        printf("已找到插入位置\n");
    }
    pnew=(link*)malloc(sizeof(link));
    pnew->date=99;
    pins=ptemp->pnext;//保存·后一个节点地址
    ptemp->pnext=pnew;
    pnew->pnext=pins;
    printf("插入完成,输出所有数据\n");
    ptemp=phead;
    while(ptemp!=NULL)
    {
        printf("%d ", ptemp->date);
        ptemp=ptemp->pnext;
    }

}

这就是我们插入部分代码,下面是一个长度为n的单链表的创建插入删除完整代码。

#include <stdio.h>
#include <stdlib.h>

typedef struct lianbiao
{
        int date;
        struct lianbiao *pnext;
}link;
link *pnew;//新节点
link *phead;//头节点
link *ptemp;//临时节点
link *pdel;//删除功能用
link *pins;//插入功能用
int count=1;
void creat(void);
void add(void);
void del(void);
void ins(void);
int main()
{
    int n,i;
    printf("请输入所需要创建的链表长度,不可为0\n");
    scanf("%d", &n);
    creat();
    for(i=0;i<n-1;i++)
    {
        add();
    }
  printf("链表创建完毕,输出链表所有数据\n");
  //printf("%d ", phead->date);
  for(ptemp=phead;ptemp!=NULL;ptemp=ptemp->pnext)
   {
       printf("%d ", ptemp->date);
   }
   ins();

   del();
   printf("删除后的链表数据\n");
   ptemp=phead;
   while(ptemp!=NULL)
   {
       printf("%d ", ptemp->date);
       ptemp=ptemp->pnext;
   }
   return 0;
}
void creat(void)
{
    phead=(link*)malloc(sizeof(link));
    phead->pnext=NULL;
    phead->date=0;
    //memset(link,0,sizeof(link));
}
void add(void)
{
    pnew=(link*)malloc(sizeof(link));
    pnew->date=count;
    pnew->pnext=NULL;
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        ptemp=ptemp->pnext;
    }
    ptemp->pnext=pnew;
    //pnew=NULL;
    count++;
}
void del(void)
{
    int x;
    int flag=0;
    printf("\n");
    printf("请输入你要删除的数\n");
    scanf("%d", &x);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==x)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    pdel=ptemp->pnext;
    if(flag==1)
    {
        ptemp->pnext=pdel->pnext;
        free(pdel);
    }
}
void ins(void)
{
    int y;
    int flag=0;
    printf("\n");
    printf("请输入你要插入的数的位置\n");
    scanf("%d", &y);
    ptemp=phead;
    while(ptemp->pnext!=NULL)
    {
        if(ptemp->pnext->date==y)
        {
            flag=1;
            break;
        }
        ptemp=ptemp->pnext;
    }
    if(flag=1)
    {
        printf("已找到插入位置\n");
    }
    pnew=(link*)malloc(sizeof(link));
    pnew->date=99;//插入数据为99
    pins=ptemp->pnext;//保存·后一个节点地址
    ptemp->pnext=pnew;
    pnew->pnext=pins;
    printf("插入完成,输出所有数据\n");
    ptemp=phead;
    while(ptemp!=NULL)
    {
        printf("%d ", ptemp->date);
        ptemp=ptemp->pnext;
    }

}

运行结果如图:
在这里插入图片描述
感谢评阅,如有问题可以在评论区或者私信我!感谢评阅,欢迎指正交流。
链表基础3(超简单)–单链表的逆序

  • 14
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值