单链表的基础操作(插入和删除)详细解答

定义单链表的结构体

typedef struct Node{
    ElemType data;  //存放元素值
    struct Node *next;  //指向后继节点
}Linklist  //单链表节点类型

单链表的插入操作:(例如:在单链表L中第 i 个位置插入新的数据元素e,或者说在第i个位置之前插入新的数据元素e,都是一样的意思,自己慢慢琢磨),下面让我们分步进行操作。

  1. 查找第 i 个结点(实际输出的p,是指向i的前一个结点,p->next才是指向i个结点)
Status ListInsert(LinkList *L ,int i,Elemtype e){
	int j;
	LinkList p;
	p = *L;//p此处是被头指针赋值,p = head
	j = 1;
	
	while(p && j<i){   
		p = p->next;
		j++;//这里j++与++j都一样的效果
	}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
	
	if(!p || j>i){//增强程序健壮性的判断语句
		return ERROR;
	}

}
  1. 插入元素e
LinkList s;
s = (LinkList)malloc(sizeof(Node));
s->data = e;

s->next = p->next;
p->next = s;

合并(单链表的插入):

Status ListInsert(LinkList *L ,int i,Elemtype e){
	int j;
	LinkList p,s;
	p = *L;//p此处是被头指针赋值,p = head
	j = 1;
	
	while(p && j<i){   
		p = p->next;
		j++;//这里j++与++j都一样的效果
	}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
	
	if(!p || j>i){//增强程序健壮性的判断语句
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(Node));
	s->data = e;

	s->next = p->next;
	p->next = s;
	return bingo;
}

单链表的插入操作:(例如:在单链表L中删除结点L,并输出i结点的值),也是分两步进行操作。

  1. 查找第 i 个结点(与插入操作一样,代码就不再展示,但仍要注意实际输出的p,是指向i的前一个结点,p->next才是指向i个结点)
  2. 删除第i个结点
p = p->next->next;
*e = p-next-data;
free(p-next);

也可以借用一个数

Linklist q;
q = p->next;
p->next = q->next;
*e = p-next-data;
free(p-next);

合并(单链表的删除):

Status ListDelete(LinkList *L ,int i,Elemtype *e){
	int j;
	LinkList p,q;
	p = *L;//p此处是被头指针赋值,p = head
	j = 1;
	
	while(p && j<i){   
		p = p->next;
		j++;//这里j++与++j都一样的效果
	}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
	
	if(!p || j>i){//增强程序健壮性的判断语句
		return ERROR;
	}
	q = p->next;
	p->next = q->next;
	
	*e = p-next-data;
	free(p-next);
	
	return bingo;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值