#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreatListTail(LinkList &L,int n)//創建鏈表 尾插法
{ LNode *s; int i;//LinkList p或者LNode *p
LinkList r;
L = (LinkList)malloc(sizeof(LNode));
//L->next==NULL;
L->next=NULL;
r=L;
for(i=1;i<=n;i++){
s=(LinkList)malloc(sizeof(LNode));
scanf("%d", &(s->data));
s->next = NULL;
r->next = s;
r=s;
}
}
void MergList(LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
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;
free(Lb);
}
}
//Listprint(LinkList &L)//鏈表顯示
Status Listprint(LinkList &L)//鏈表顯示
{
// LNode *p;
//p=L;
LNode *p = L->next;
while(p!=NULL){
printf("%3d",p->data);
p=p->next;
}
printf("\n");
return OK;
}
int main()
{ int x,n;
LinkList L1,T,L2,L3;
printf("輸入單鏈表L1的長度\n");
scanf("%d",&n);
CreatListTail(L1,n);
printf("輸入單鏈表的L2長度\n");
scanf("%d",&n);
CreatListTail(L2,n);
MergList(L1, L2, L3);
Listprint(L3);
}
uj5u.com熱心網友回復:
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;
free(Lb);
}
那兩行你的目的是做什么呢?
寫出的代碼首先要自己相信是對的,那就肯定就有自己認為合理的解釋, 說一說吧。
uj5u.com熱心網友回復:
看代碼應該是二路歸并,也許你有別的要求也未嘗不可如果二路歸并的話,那兩行代碼就不應該在while陳述句里面
uj5u.com熱心網友回復:
pc->next=(pa?pa:pb),把pa和pb中那個比較長的鏈表的剩余部分賦值給pc,與pc連接
uj5u.com熱心網友回復:
while中的陳述句是比較,pc會連接上pa和pb每次比較之后較小的值
uj5u.com熱心網友回復:
所以啊, 這個比較得在while的外面啊。問題是你把他們放到while陳述句里面了呀
uj5u.com熱心網友回復:
如果放在while陳述句里面就是當pa和pb中較短的執行完了之后就會直接退出while陳述句,就不會執行 pc->next=pa?pa:pb;這么理解對嗎?uj5u.com熱心網友回復:
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;
free(Lb);
}
那兩行你的目的是做什么呢?
寫出的代碼首先要自己相信是對的,那就肯定就有自己認為合理的解釋, 說一說吧。
pc->next=(pa?pa:pb),把pa和pb中那個比較長的鏈表的剩余部分賦值給pc,與pc連接
所以啊, 這個比較得在while的外面啊。問題是你把他們放到while陳述句里面了呀
如果放在while陳述句里面就是當pa和pb中較短的執行完了之后就會直接退出while陳述句,就不會執行 pc->next=pa?pa:pb;這么理解對嗎?
uj5u.com熱心網友回復:

這個和pa和pb哪一個短沒有關系
而是和pa、pb里面date最大值有關系
最大值小的那個(那怕它里面包含到節點數目遠超另外一個)會先被全部插入到pc當中去,剩下的另外一個需要直接掛接到pc尾巴上
問題是在while(pa&&pb)成立的時候, 他們還都沒有到達尾部呢, 此時還在交叉著往pc后面掛節點中,這個時候執行這兩句代碼就不是正確的位置
uj5u.com熱心網友回復:
這個和pa和pb哪一個短沒有關系
而是和pa、pb里面date最大值有關系
最大值小的那個(那怕它里面包含到節點數目遠超另外一個)會先被全部插入到pc當中去,剩下的另外一個需要直接掛接到pc尾巴上
問題是在while(pa&&pb)成立的時候, 他們還都沒有到達尾部呢, 此時還在交叉著往pc后面掛節點中,這個時候執行這兩句代碼就不是正確的位置
我表達錯誤,是根據pa和pb的值大小決定執行哪一條陳述句,與長短無關無
uj5u.com熱心網友回復:
這篇代碼在我的TC2環境里編譯出錯,沒法兒調。你用的是什么開發環境?
uj5u.com熱心網友回復:
這篇代碼在我的TC2環境里編譯出錯,沒法兒調。
你用的是什么開發環境?
devc++
uj5u.com熱心網友回復:
這么多代碼,得邊除錯邊修改。再除錯看看吧。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/111534.html
標籤:C語言
下一篇:for回圈陳述句
