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