c++ 链表及其相关操作

《仅供自己学习参考》
链表,线性表的链式储存结构。

  • 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续 的,也可以不连续)
  • 数据元素之间逻辑上相邻,物理位置可不相邻

前提:

typedef struct LNode
{
	int data;//存放数据元素的值
	struct LNode * next;//指针,指向后继结点
}LNode,*LinkList;

单链表的创建及其相关操作

  • 头插法建表
    (注意数据元素顺序)
void creatlist(LinkList &L,int n)//头插法--创建链表6 5 4 3 2 1,有头结点  
{
	 LNode *p=NULL;//定义一个LNode类型的指针,为后续操作做准备
	 L=(LinkList)malloc(sizeof(LNode));//为头指针分配内存--创建相应的头结点
	 L->next=NULL;//将头结点指针域置空
	 for(int i=1;i<=n;i++)
	 {
	 	p=(LinkList)malloc(sizeof(LNode));
	 	p->data =i;
	 	p->next =L->next;
	 	L->next=p;
	 }
}
  • 尾插法建表
void creatlist2(LinkList &L,int n)//尾插法--创建链表4 5 6 7 8 9 ,有头结点 
{
	LNode *p=NULL;//定义一个LNode类型的指针,为后续操作做准备
	LinkList r;//定义一个尾指针,指向链表的表尾结点
	L=(LinkList)malloc(sizeof(LNode));//为头指针分配内存--创建相应的头结点
	L->next =NULL;//头结点指针域置空
	r=L;//初始时期,尾结点即为头结点
	for(int i=4;i<=4+n-1;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		p->data =i;
		r->next =p;
		r=r->next ;
	}
	p->next =NULL;//链表表尾指针域置空 
}
  • 插入操作
    (如果要在第i个元素前插入,可以相应修改)
Status Lsitinsert(LinkList &L, int i, int e)//在第i个元素之后插入e 
{
	LinkList p;//定义一个LNode类型的指针,便于指向要插入的位置
	LNode *s=NULL;//用来创建要插入的元素的结点
	int j=0;//头结点
	p=L ;
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	if(!p) return ERROR;
	s=(LinkList)malloc(sizeof(LNode));
	s->next =p->next;
	s->data =e;
	p->next=s;
	return OK;
}
  • 删除操作
Status Listdelete(LinkList L,int i)//删除第i个元素
{
	LinkList p;//定义一个LNode类型的指针,便于指向要删除的位置
	LinkList q;//用来记录删除位置
	int j=0;//头结点开始,因为i可以为1
	p=L;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!(p->next )) return ERROR;
	q=p->next;
	p->next =q ->next;
	free(q);
	return OK;
}
  • 链表长度
int llength(LinkList L)
{
	int x=0;
	LinkList p;
	p=L;
	while(p->next )
	{
		p=p->next ;
		x++;
	}
	return x;
}
  • 显示链表元素
void show(LinkList L)
{
	int x=llength(L);
	L=L->next ;
	for(int i=1;i<=x;i++)
	{
		cout<<L->data<<" " ;
		L=L->next ;
	}
	cout<<endl;
}
  • 合并两个有序递增链表
void merge(LinkList &l1,LinkList &l2,LinkList &l3)//合并两个有序链表,并返回 
{
	LinkList p1,p2,p3;
	l3=(LinkList)malloc(sizeof(LNode));
	p1=l1->next ;
	p2=l2->next ;
	p3=l3;
	while(p1&&p2)
	{
		if(p1->data <=p2->data )
		{
			p3->next =p1 ;
			p3=p1;
			p1=p1->next ;
		}
		else
		{
			p3->next =p2;
		    p3=p2;
		    p2=p2->next ;
		}
	}
	p3->next=p1?p1:p2;
	
}
  • 获取链表元素
Status GetElem(LinkList &L,int i,int &e)  //获取第i个元素的值 
{
	LinkList p;
	int j=0;
	int xx=llength(L);
	if(i>xx) return ERROR;
	p=L;
	while(p&&j<i)
	{
		p=p->next;
		j++;
	}
	if(!p) return ERROR;
	e=p->data ;
	return OK;
}
  • 主函数
int main()
{
	LNode* l1;
	LNode *l2;
	LNode*l3;
	LNode * l4;
	int e=0;
	creatlist(l1,6);
	creatlist2(l2,6);
	creatlist2(l4,6);
	show(l1);
	show(l2);
	show(l4);
	cout<<llength(l1)<<endl;
	merge(l2,l4,l3);
	show(l3);
	Lsitinsert(l1, 6, 0);
	show(l1);
	Listdelete(l1,1);
	show(l1);
	GetElem(l1,2,e);
	cout<<e<<endl;
	return 0;
}
  • 运行结果
    无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值