学习数据结构遇到的课后练习,C++将两个递增的有序链表合成一个递增的有序链表,新链表使用原本两个链表的存储空间,不占用其他存储空间。表中不允许有重复的元素。

个人理解:利用指针来访问两个有序的链表,让两个链表相互比较,如果La的元素小于Lb中的,那么就把Lb中的元素存入Lc,否则就把La中的存入Lc,如果两个相同就把La的存进去,Lb的删掉,更新指针。如果到其中一个的结尾了,另一个没有到结尾,就把剩余的元素插到Lc中。最后删除Lb;释放Lb的空间。如果解释的不清楚,请理解一下。其他就是链表的基本操作。

废话少说直接上代码嘞!希望大佬可以指点错误;

 

#include<iostream>
using namespace std;
#define OK 1
#define ERROR -2
typedef int ElemType;

typedef struct LNode
{
	ElemType date;
	struct LNode *next;
}LNode,*List;

int i,j;
List L,s,p,q;

int InList(List &L)//初始化链表 
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

void HInput(List &L,int n)//后插法 插入的元素和原来的顺序一样 
{
	L = new LNode;
	L->next =NULL;
	s = L;
	for(i=0;i<n;++i)
	{
		p = new LNode;
		cin>>p->date ;
		p->next = NULL;
		s->next = p;
		s = p;
	}
}

int Delete(List &L,int n)//删除 第n位的值 
{
	p=L;
	j=0;
	while((p->next)&&(j<n-1))
	{
		p = p->next ;
		++j;
	}
	if(!(p->next )||(j>i-1)) return ERROR;
	s = p->next ;//s指向要删除的 
	p->next = s->next ;//要删除节点的下一个链接到前一个 
	delete s;
	return OK;
	
 } 
 
int ListInsret(List &L,int n,ElemType e)//插入数据,n为插入的位置,e为要插入的值 
{
	p=L;
	j=0;
	while(p&&(j<n-1))//找插入位置的前驱 
	{
		p=p->next;
		++j;
	}
	if(!p||(j>n-1)) return ERROR;
	s= new LNode;
	s->date= e;
	s->next = p->next;//s的下一位是原本p的下一位,p为要插入的位置的前驱 
	p->next = s;
	return OK;
}

ElemType Get(List L,int n,ElemType &e)//获取第n位的元素赋给e 
{
	p =L->next ;int j=1;
	while(p&&j<n)
	{
		p = p->next;
		++j; 
	}
	if(!p||j>n) return -2;
	e = p->date ;
	return e;
}

int Find(List L,ElemType e)//查找值为e的数据,如果找到返回1;否则返回0 
{
	p=L->next;
	while(p&&(p->date )!=e)
	{
		p=p->next ;
	}
	if(p==NULL) return 0;
	return OK;
}

void Output(List L)//输出链表 
{
	p = L->next ;
	while(p)
	{
		cout<<p->date <<" ";
		p = p->next ;
	}
	cout<<endl;
}
void MergeList(List &La,List &Lb,List &Lc)//比较La和Lb中的元素存入Lc
{
	List pa=La->next;List pb=Lb->next;//pa指向La的首元结点,pb指向Lb的首元结点 
	List pc;
	Lc=pc=La;//pc=Lc指向La的头结点 
	while(pa&&pb)
	{
		if(pa->date<pb->date ){pc->next =pa;pc=pa;pa=pa->next;}//如果pa指向的值比pb指向的值小的话,pa插入到pc里面,更新pc指针为pa,pa指针指向下一个 
		else if(pb->date<pa->date ){pc->next=pb;pc=pb;pb=pb->next;}
		else {
			pc->next=pa;pc=pa;pa=pa->next;//如果pa的值=pb的值,把pa插到pc里头,pb删除,pb指向下一个 
			q=pb->next;delete pb;pb=q;
		}
	}
	pc->next =pa?pa:pb;//插入剩余段 
	delete Lb;//释放Lb的头结点 
}
int main()
{
	List Lb,La,Lc;
	InList(La);
	InList(Lb);
	InList(Lc);
	int n,m;
	cin>>n;
	HInput(La,n);
	cin>>m;
	HInput(Lb,m);
	MergeList(La,Lb,Lc);
	Output(La);
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

万小橘

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

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

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

打赏作者

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

抵扣说明:

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

余额充值