单链表-插入删除

文章详细介绍了单链表的数据结构及其操作,包括空链表的初始化、判断是否为空、在不同位置插入元素、前插和后插以及按位序删除节点的方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述

单链表的定义

typedef struct lnode {
	int data;          //存放数据域
	struct lnode* next; //指针域
}lnode, * linklist;

初始化一个空的单链表不带头结点

bool initlist(linklist &l)
{
	l = NULL;
	return true;
}

判断单链表是否为空

bool empty(linklist l)
{
	if (l == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

初始化一个空的单链表带头结点

bool initlist(linklist& l)
{
	l = (lnode*)malloc(sizeof(lnode));
	if (l == NULL)
		return false;
	l->next = NULL;  
	return true;
}

以下插入删除均为带头结点的操作

带头结点在第i个位置插入元素e

bool listinsert(linklist& l, int i, int e)
{
	if (i < 1)
		return false;
	lnode* p;
	int j = 0;
	p = l;
	while (p!=NULL && j<i-1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
		return false;
	lnode* s = (lnode*)malloc(sizeof(lnode));
	s->data = e;
	p->next = s->next;
	p->next = s;
	return true;
}

不带头结点在第i个位置插入元素e

bool listinsert(linklist& l, int i, int e)
{
	if (i < 1)
		return false;
	if (i == 1)
	{
		lnode* s = (lnode*)malloc(sizeof(lnode));
		s->data = e;
		s ->next = l;
		l = s;    //头指针指向第一个结点
		return true;
	}
	lnode* p;
	int j = 1;
	p = l;
	while (p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
		return false;
	lnode* s = (lnode*)malloc(sizeof(lnode));
	s->data = e;
	p->next = s->next;
	p->next = s;
	return true;
}

指定结点p的后插操作e

bool insertnextnode(lnode* p, int e)
{
	if (p == NULL)
		return false;
	lnode* s = (lnode*)malloc(sizeof(lnode));
	if (s == NULL)
		return false;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

指定结点的前插操作

bool insertpriornode(lnode* p, int e)
{
	if (p == NULL)
		return false;
	lnode* s = (lnode*)malloc(sizeof(lnode));
	if (s == NULL)
		return false;
	s->next = p->next;
	p->next = s;
	//下面两行交换数据
	s->data = p->data;
	p->data = e;
	return true;
}

按位序删除

bool listdelete(linklist& l, int i, int e)
{
	if (i < 1)
		return false;
	lnode* p;
	int j = 0;
	p = l;
	while (p!=NULL &&j<i-1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)  //当前不能为空
		return false;
	if (p->next ==NULL) //当前的下一个也不能为空 因为要删除的就是当前指针p所指向的下一个元素
	{
		return false;
	}
	lnode* q = p->next;  //q是要删除的结点
	e = q->data;         //把e存起来
	p->next = q->next;  //*q断开,就是把p指向q的下一个结点,可能是空,是空就会报错,这就是单链表的局限性,也可能是一个元素
	free(q);           //释放它
	return true;
}

指定结点的删除 指定的结点是最后一个的时候需要特殊处理

bool deletenode(lnode* p)
{
	if (p == NULL)
		return false;
	lnode* q = p->next;     //q指向p的后记
	p->data = p->next->data; //交换数据 p q
	p->next = q->next;    //p指向q的下一个结点
	free(q);        //删除q
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值