【数据结构】单链表插入和删除

 

 

#include <malloc.h>
typedef struct LNode
{
	int data;
	struct  LNode* next;
}LNode,*LinkList;
//在第i个位置插入元素e (带头结点)
bool ListInsert(LinkList& L, int i, int e)
{
	if (i < 1)//位序是从1 开始的
		return false;
	LNode* p;//指针p指向当前扫描到的节点
	int j = 0;//当前p指向的是第几个结点
	p = L;//L指向头结点,头结点是第0和结点(不存数据)
	while (p!=NULL&&j<i-1)//循环找到第i-1个结点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;//将结点s连到p之后
	return true;//插入成功
}

 

 

//在第i个位置插入元素e (不带头结点)
bool ListInsert(LinkList& L, int i, int e)
{
	if (i < 1)//位序是从1 开始的
		return false;
	if (i == 1)//插入第一个结点的操作与其他结点操作不同
	{
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s;
		return true;
	}
	LNode* p;//指针p指向当前扫描到的节点
	int j = 1;//当前p指向的是第几个结点
	p = L;//L指向头结点,头结点是第0和结点(不存数据)
	while (p != NULL && j < i - 1)//循环找到第i-1个结点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;//将结点s连到p之后
	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;
}

//前插操作:在p结点之前插入元素e
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是连到 p之后
	s->data = p->data;//将p 中的元素复制到s中
	p->data = e;//p中元素覆盖为e
}

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)//循环到第i-1个结点
	{
		p = p->next;
		j++;
	}
	if (p == NULL)
		return false;
	if (p->next == NULL)
		return false;
	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
	return true;
}

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_46472622/article/details/126638378