【无标题】

在做王道课后题十三题,第一次做的时候把新合成的链表在函数外定义,从而当成合成函数的参数进行操作,第二次做的时候,新合成的链表在函数内进行定义,函数类型是链表类型从而操作完成后进行函数返回传值,但后者有错误,找不出来。
以下是正确的代码:

#include<iostream> 
using namespace std;
typedef struct LNode{
	int data;
	struct LNode *next;	
}LNode,*LinkList; 

void InitLNode(LinkList &L){     //初始化链表 
	int length;
	cout<<"你的链表长度=";
	cin>>length;
	if(length==0)
		L->next=NULL;
	else
	{	
		LNode *q;
		q=L;         //L即是头指针又代表链表,所以不能改变L变量以影响链表的唯一性 
		cout<<"请输入"<<length<<"个数据:"<<endl;
		for(int i=0;i<length;i++)
		{
			LNode *p=new LNode;
			cin>>p->data;
			q->next=p;
			q=p;	//每次循环结束q就是最后一个结点		
		}
		q->next=NULL;				
	}
}
void printList(LinkList &L)
{
	LNode *p=L->next;;
	while(p)
	{
		cout<<p->data<<" ";
		p=p->next;	
	}
	cout<<endl;	
}
//13,假设两个按元素递增次序排序的线性表,均以单链表的形式存储。
//请编写算法将这两个链表按元素递减的次序归并为一个单链表    //构建新表采用头插法,因为头插法输入和输出 次序相反 
//并要求利用原来两个单链表的结点存放归并后的单链表             //这一句要求空间复杂度为O(1) 
void Two_in_one(LinkList &L1,LinkList &L2,LinkList &L)
{//和顺序表二合一算法一样,先比对合并,之后判断哪个还有剩下的,继续合并 
	LNode *p1=L1->next,*p2=L2->next,*temp;// temp是中间结点,防止断链 
	while(p1&&p2)  
	{
		if(p1->data<=p2->data)
			{
				temp=p1;
				p1=p1->next; 
				temp->next=L->next;
				L->next=temp;	
			}
		else
			{
				temp=p2;
				p2=p2->next; 
				temp->next=L->next;
				L->next=temp;	
			}
	}
	while(p1)	 //如果L1还有剩,之后全合并 
	{
		temp=p1;
		p1=p1->next; 
		temp->next=L->next;
		L->next=temp;		
	}
	while(p2)	
	{
		temp=p2;
		p2=p2->next; 
		temp->next=L->next;
		L->next=temp;		
	}	
}//感觉和王道代码长度差不多长, 
int main() {
	LNode *L1=new LNode;
	LNode *L2=new LNode;
	LNode *L=new LNode; //合并之后的
	L->next=NULL;//进行初始化 
	cout<<"进行L1链表初始化:"<<endl ;
	InitLNode(L1);
	cout<<"初始化后的L1链表为:" ; 
	printList(L1);
	
	cout<<"进行L2链表初始化:"<<endl ;	
	InitLNode(L2);
	cout<<"初始化后的L2链表为:" ; 
	printList(L2);
	
	Two_in_one(L1,L2,L) ;
	cout<<"合并后的后的L链表为:" ; 
	printList(L);
		
	return 0;
}

以下是有毛病的代码:

#include<iostream> 
using namespace std;
typedef struct LNode{
	int data;
	struct LNode *next;	
}LNode,*LinkList; 
void InitLNode(LinkList &L){     //初始化链表 
	int length;
	cout<<"你的链表长度=";
	cin>>length;
	if(length==0)
		L->next=NULL;
	else
	{	
		LNode *q;
		q=L;        //L即是头指针又代表链表,所以不能改变L变量以影响链表的唯一性 
		cout<<"请输入"<<length<<"个数据:"<<endl;
		for(int i=0;i<length;i++)
		{
			LNode *p=new LNode;
			cin>>p->data;
			q->next=p;
			q=p;	//每次循环结束q就是最后一个结点		
		}
		q->next=NULL;				
	}
}
void printList(LinkList &L)
{
	LNode *p=L->next;;
	while(p)
	{
		cout<<p->data<<" ";
		p=p->next;	
	}
	cout<<endl;	
}
LinkList T(LinkList &L1,LinkList &L2)
{
	LinkList L;
	L->next=NULL;
	LNode *p1=L1->next,*p2=L2->next,*temp;
	while(p1&&p2)
	{
		if(p1->data<=p2->data)
		{
			temp=p1;
			p1=p1->next;
			temp->next=L->next;
			L->next=temp;	
		}
		else 
		{
			temp=p2;
			p2=p2->next;
			temp->next=L->next;
			L->next=temp;
		}		
	}
	while(p1)
	{
		temp=p1;
		p1=p1->next;
		temp->next=L->next;
		L->next=temp;
	}
	while(p2)
	{
		temp=p2;
		p2=p2->next;
		temp->next=L->next;
		L->next=temp;
	}		
	return L;	
}
int main() {
	LNode *L=new LNode;
	L->next=NULL;   //初始化一下   可以包装成LinkList型无参数函数,返回头指针进行初始化 
	L->data=0;      //没啥意义 
	
	LNode *L1=new LNode;
	L1->next=NULL;   //初始化一下   可以包装成LinkList型无参数函数,返回头指针进行初始化 
	L1->data=0;      //没啥意义 
	
	LNode *L2=new LNode;
	L2->next=NULL;   //初始化一下   可以包装成LinkList型无参数函数,返回头指针进行初始化 
	L2->data=0;      //没啥意义 
	cout<<"初始化1:" <<endl;
	InitLNode(L1);
	cout<<"初始化后的链表1为:" ; 
	printList(L1);
	
	cout<<"初始化2:" <<endl;
	InitLNode(L2);
	cout<<"初始化后的链表2为:" ; 
	printList(L2);
	
	L=T(L1,L2);
	cout<<"合并后的链表为:" ; 
	printList(L);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值