单链表的插入和删除操作

后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e) 
{
	if(p==NULL)
	return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	if(s==NULL)//内存分配失败 
	return false;
	s->data=e;//用节点s保存数据元素e 
	s->next=p->next;
	p->next=s;//将节点s连接到p之后 
	return true;
}
//在第i个位置插入元素e(带头节点)
bool ListInsert(LinkList &L,int i,ElemType e)
{
	if(i<1)
	return false;
	LNode *p;//指针p指向当前扫到的节点 
	int j=0;//当前p指针指向的是第几个节点 
	p=L;//L指向头节点,头节点是第0个节点(不存数据) 
	whlie (p!=NULL && j<i-1)//循环找到第i-1个节点 
	{
		p=p->next;
		j++;
	}
	if(p==NULL)//i值不合法 
	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 InsertPriorNode(LNode *p,ElemTypr 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 
	return true;
 } 
 按位序删除
 bool ListDelete(LinkList &L,int i,ElemType &e)
 {
 	if(i<1)
 	return false;
 	LNode *p;//指针p指向当前扫描到的节点
 	int j=0;//当前 p指针指向的是第几个节点 
 	p=L;//L指向头节点,头节点是第0个节点(不存数据) 
 	whlie (p!=NULL && j<i-1)//循环找到第i-1个节点 
 	{
 		p=p->next;
 		j++;
	 }
	 if(p==NULL)//i值不合法
	 return false;
	 if(p->next==NULL)//第i-1个节点后已无其他节点 
	 return false;
	 LNode *q=p->next;//令q指向被删除节点 
	 e=q->data;//用e返回元素的值 
	 p->next=q->next;//将*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->next=q->next;//将*q节点从链中断开 
	free(q);//释放后继节点的储存空间 
	return true;
}
//按位查找,返回第i个元素(带头节点)
LNode * GetElem(LinkList L,int i)
{
	if(i<0)
	return NULL;
	LNode *p;//指针p指向当前扫描到的节点 
	int j=0;//当前p指向的是第几个节点 
	p=L;
	whlie(P!=NULL && j<i)
	{
		p=p->next;
		j++
	}
	return p;
 } 
 //按值查找,找到数据域==e的节点
 LNode * LocateElem(LinkList L,ElemType e)
 {
 	Lnode *p=L->next;
 	while(p!=NULL&&p->data!=e)//从第一个节点开始查找数据域为e的节点 
 	p=p->next;
 	return p;//找到后返回该结点指针,否则返回NULL 
  } 
  //求表的长度
  int Length(LinkList L)
  {
  	int len=0;//统计表长 
  	Lnode *p=L;
  	while(p->next!=NULL)
  	p=p->next;
  	len++;
   } 
//尾插法
LinkList List_TailInsert(LinkList &L)//正向建立单链表 
{
	int x;
	L=(LinkList)malloc(sizeof(LNode));//建立头节点 
	LNode *s,*r=L;//r为表尾指针 
	printf("请输入要建立的单链表的节点的值(正序)\n") ; 
	printf("输入9999即可结束"); 
	scanf("%d",&x);//输入节点的值 
	while(x!=9999)//输入9999表示结束 
	{
		s=(LNode *)malloc(sizeof(LNode));//在r节点之后插入元素x 
		s->data=x;
		r->next=s;
		r=s;//r指向新的表尾节点 
		scanf("%d",&x);
	}
	r->next=NULL;//尾节点指针置空 
	return L;
}
//头插法
LinList List_HeadInsert(LinkList &L)//逆向建立单链表 
{
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode));//创建头节点 
	L->next=NULL;//初始为空链表 
	scanf("%d",&x);//输入节点的值 
	whlie(x!=9999)//输入9999表示结束 
	{
		s=(LNode *)malloc(sizeof(LNode));//创建新节点 
		s->data=x;
		s->next=L->next;
		L->next=s;//将新节点插入表中,L为头指针 
		scanf("%d",&x);
	}
	return L;
}
 
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define ElemType int
typedef struct LNode{//定义单链表节点类型 
	ElemType data;//每个节点存放一个数据元素 
	struct LNode *next;//指针指向下一个节点 
}Lnode,*LinkList;
//初始化一个单链表(带头节点) 
bool InitList(LinkList &L)
{
	L=(LNode *)malloc(sizeof(LNode));//分配一个头节点 
	if(L==NULL)//内存不足分配失败 
	return false;
	L->next=NULL;//头节点之后暂时还没有节点 
	return true;
}

 
LinkList List_TailInsert(LinkList &L)//正向建立单链表 
{
	int x;
	L=(LinkList)malloc(sizeof(LNode));//建立头节点 
	LNode *s,*r=L;//r为表尾指针 
	printf("请输入要建立的单链表的节点的值(正序)\n") ; 
	printf("输入9999即可结束"); 
	scanf("%d",&x);//输入节点的值 
	while(x!=9999)//输入9999表示结束 
	{
		s=(LNode *)malloc(sizeof(LNode));//在r节点之后插入元素x 
		s->data=x;
		r->next=s;
		r=s;//r指向新的表尾节点 
		scanf("%d",&x);
	}
	r->next=NULL;//尾节点指针置空 
	return L;
}
int main(){
	LinkList L;//声明一个指向单链表的指针 
	InitList(L);//初始化一个空表 
		List_TailInsert(L);
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

big old mouse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值