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

这篇文章是基于链表基础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(超简单)–单链表的逆序

©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页