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