数据结构链表插入删除操作

本文详细介绍了链表的数据结构,包括数据域和指针域的概念,并通过图文解释了如何进行链表的插入和删除操作。作者提供了一段C语言实现的代码示例,包括链表的插入函数`LinkInsert`和删除函数`Linkdelete`,帮助读者理解链表操作的原理。
摘要由CSDN通过智能技术生成

博主终于放假了,博主希望能利用这个寒假能把数据结构好好整理一遍分享给大家;

上次我们说了链表的头指针头结点怎么使用的,今天我们就来谈一谈链表的插入和删除操作;我觉着吧数据结构最重要的一点就是弄清楚原理,然后能自己想着原理把代码敲出来,那么这样你就学明白啦;

接下来,我们开始正题;

我们的链表一般分为两部分,一部分是数据域(存放数据),另一部分是指针域(指向下一个单位)

我们所谓的链表的链表就是通过指针让不同的单位链接在一起;

这里我们我们的单元就称之为一个结点哦!

那我们究竟是怎么插入一个新的单位呢?

见下图:

我们有两个结点一个p;我们想新建一个结点s把它插入其中。

这就需要我们对指针所指的内容进行修改。

我们用malloc函数创建一个新的结点s插入其中;

这时我们先把s->next=p;

然后把p->next=s->next;

            

当然我们还需遍历整个链表找到我们需要插入的位置;

怎么遍历?

当然是循环啊!

Status LinkInsert(LinkList *L,int n,ElemType e)
{
	LinkList p,s;
	int j;
	p=*L;
	j=1;
	while(p&&j<n)//判断是否满足条件,迭代
	{
		p=p->next;
	    j++;
	}
	if(!p||j>n)//不满足条件返回0
	{
		return ERROR;
	}
	s=(LinkList)malloc(sizeof(Node));
	s->data=e;
	s->next=p->next;//插入链表操作
	p->next=s;
	return OK;
}

这就是我们插入啦

当然前面的说明什么的也要介绍一下

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

#define OK 1   
#define ERROR 0
#define FALSE 0 

typedef int ElemType; //数据类型

typedef struct Node 
{
	ElemType data;
	struct Node *next;
}Node,*LinkList;//在这里面Node不是一个指针类型,LinkList是指针类型

typedef int Status;//返回值类型

然后我们来说一说删除操作

当你学会了插入操作其实删除操作就已经学而一半啦

当然我们还是要以图文并茂的形式来解释删除操作;

 我们只需要一步就可以了

p->next=q->next;

不想要它直接把它跳过不就好了嘛!

然后我们来看看代码

Status Linkdelete(LinkList *L,int n,ElemType *e)
{
	LinkList p,q;
	p=*L;
	int j=1;
	while(p->next&&j<n)
	{
		p=p->next;
		++j;
	}
	if(!(p->next)||j>n)
	{
		return ERROR;
	}
	q=p->next;
	p->next=q->next;
	*e=q->data;
	free(q);
	return OK;
}

这就是我们今天所讲的内容哦

为了照顾广大同学,我当然要把源代码给大家呀!

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"

#define OK 1   
#define ERROR 0
#define FALSE 0 

typedef int ElemType; //数据类型

typedef struct Node 
{
	ElemType data;
	struct Node *next;
}Node,*LinkList;//在这里面Node不是一个指针类型,LinkList是指针类型

typedef int Status;//返回值类型

/*创建单链表头插法 头结点*/

void  creat(LinkList *L,int n)//为什么要用二重指针//
                              //利用二重指针直接对链表内部进行操作

{
	LinkList p;
	int i;
	(*L)=(LinkList)malloc(sizeof(Node));//创造一个空间
	(*L)->next=NULL;//结点指针域为null
	for(i=0;i<n;i++)
	{
		p=(LinkList)malloc(sizeof(Node));
		p->data=i;
		p->next=(*L)->next;
		(*L)->next=p;
	}
}

/*单链表插入操作*/
Status LinkInsert(LinkList *L,int n,ElemType e)
{
	LinkList p,s;
	int j;
	p=*L;
	j=1;
	while(p&&j<n)//判断是否满足条件,迭代
	{
		p=p->next;
	    j++;
	}
	if(!p||j>n)//不满足条件返回0
	{
		return ERROR;
	}
	s=(LinkList)malloc(sizeof(Node));
	s->data=e;
	s->next=p->next;//插入链表操作
	p->next=s;
	return OK;
}


Status Linkdelete(LinkList *L,int n,ElemType *e)
{
	LinkList p,q;
	p=*L;
	int j=1;
	while(p->next&&j<n)
	{
		p=p->next;
		++j;
	}
	if(!(p->next)||j>n)
	{
		return ERROR;
	}
	q=p->next;
	p->next=q->next;
	*e=q->data;
	free(q);
	return OK;
}


void Linkprint(LinkList L)
{
	LinkList p;
	p=L;
	while(p->next!=NULL)
	{	
		p=p->next;
		printf("%d",p->data);
	}
	
}


int main()
{
	LinkList L;
	int n=5;
	creat(&L,n);
	Linkprint(L);
	printf("\n");
	ElemType e;//切记这里不要用指针类型
	ElemType a=5;
	int j=3;

	
	LinkInsert(&L,j,a);
	Linkprint(L);

	printf("\n");

	Linkdelete(&L,j+1,&e);
	Linkprint(L);

    

	return 0;
}

我们今天讲解的内容就到这里啦!

肖恩会更努力地分享哦!

希望大家能支持肖恩哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W大羊肖恩W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值