博主终于放假了,博主希望能利用这个寒假能把数据结构好好整理一遍分享给大家;
上次我们说了链表的头指针头结点怎么使用的,今天我们就来谈一谈链表的插入和删除操作;我觉着吧数据结构最重要的一点就是弄清楚原理,然后能自己想着原理把代码敲出来,那么这样你就学明白啦;
接下来,我们开始正题;
我们的链表一般分为两部分,一部分是数据域(存放数据),另一部分是指针域(指向下一个单位)
我们所谓的链表的链表就是通过指针让不同的单位链接在一起;
这里我们我们的单元就称之为一个结点哦!
那我们究竟是怎么插入一个新的单位呢?
见下图:
我们有两个结点一个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;
}
我们今天讲解的内容就到这里啦!
肖恩会更努力地分享哦!
希望大家能支持肖恩哦!