数据结构实验:创建并合并两个有序单链表

#include<stdio.h>
#include<iostream>
using namespace std;
#include<windows.h>
#include<malloc.h>
#include<conio.h> 
#define OK 1
#define ERROR 0
typedef int elemtype;
typedef int status; 
typedef struct lnode
{
	elemtype data;
	struct lnode *next; 
}lnode,*linklist;

status initlist(linklist &l) 
{
	l=new lnode;
	l->next=NULL;
	return OK; 
} 

status getelem(linklist l,int i,elemtype &e) 
{
	lnode *p;
	p=l->next;
	int j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j; 
	} 
	if(!p||j>i)
	{return ERROR;}
	else
	{
		e=p->data;
		return OK; 
	} 
	 
} 


status locateelem(linklist l,elemtype e) 
{	
	linklist p;
	p=p->next;
	while (p&&p->data!=e)
	{
		p=p->next;
		return OK; 
	} 
} 

status listinsert(linklist &l,int i,elemtype e)
{	linklist p;
	p=l;
	int j=0;
	while(p&&(j<i-1))
	{
		p=p->next;
		++j;
	}
	if(!p||j>i-1)
	{
		return ERROR;
	}
	else{
		linklist s;
		s=new lnode;
		s->data=e;
		s->next=p->next;
		p->next=s;
		return OK;
	}
 } 
 
status elemdelete(linklist &l,int i)
{
	linklist p;
	p=l;
	int j=0;
	while((p->next)&&(j<i-1))
	{p=p->next;
	++j;
	}
	if (!(p->next)||(j>i-1))
	{
		return ERROR;
	}
	else{
		linklist q;
		q=p->next;
		p->next=q->next;
		delete q;
		return OK;
	}
}


void createlist_qianchafa(linklist &l,int n)
{//逆位序;
	l=new lnode;
	l->next=NULL;
	int i;
	linklist p;
	for (i=0;i<n;++i)
	{
		p=new lnode;
		cin>>p->data;
		p->next=l->next;
		l->next=p;
	 } 

}
 
void createlist_houchafa(linklist &l,int n)
{//正序;
	 l=new lnode;
	 l->next=NULL;
	 linklist r=l;
	 int i;
	 linklist p;
	 for (i=0;i<n;++i)
	 {
	 	
	 	p=new lnode;
	 	cout<<"第"<<i+1<<"个元素:" ; 
	 	cin>>p->data;
	 	p->next=NULL;
	 	r->next=p;
	 	r=p;
	  } 
	
}

void traversell(linklist l)
{
	linklist p;
	p=l->next;
	if(p==NULL)
	{printf("链表为空;");} 
	while(p!=NULL)
	{
		cout<<p->data<<" "; 
		p=p->next;
	} 
} 



void merge(linklist &LA,linklist &LB,linklist &LC)//算法2.16 链式有序表的合并
{
//已知单链表LA和LB的元素按值非递减排列
//归并LA和LB得到新的单链表LC,LC的元素也按值非递减排列
lnode *pa,*pb,*pc;
pa=LA->next;pb=LB->next;
LC=LA;
pc=LC;
while(pa&&pb)
{
	if(pa->data<=pb->data)
		{
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
	else
		{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	pc->next=pa?pa:pb;
} 


 
int main()
{
	linklist la,lb,lc;
	initlist(la);
	initlist(lb);
	initlist(lc); 
	cout<<"初始化成功\n插入La中的元素个数为:" ;
	int n; 
	cin>>n; 
	cout<<"按从小到大顺序输入!\n"; 
	createlist_houchafa(la,n);
	cout<<"La=" ; 
	traversell(la); 
	cout<<"\n插入Lb中的元素个数为:" ;
	int m; 
	cin>>m; 
	cout<<"按从小到大顺序输入!\n";
	createlist_houchafa(lb,m);
	cout<<"Lb=" ; 
	traversell(lb); 


	merge(la,lb,lc); 
	cout<<"\n合并后的Lc=";
	traversell(lc); 
	getch(); 
}
 
 
 
 

书中伪代码弊端尽显,可结合实际情况修改,比如多个函数中"p"并没有定义就直接应用.
欢迎广大学习者参考.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值