兩個有序連結串列的合併
阿新 • • 發佈:2019-01-01
二、實驗分析
(1)問題分析
1、考慮兩個連結串列L1,L2中資料的多少;
2、用兩個指標同時遍歷兩個有序連結串列L1,L2,並且比較每次讀取的兩個連結串列元素的數值,將其中的小值插入到新的連結串列L中。
3、考慮到其中連結串列L1(或者L2)由於元素少,而被先遍歷完,另個連結串列L2(或者L1)直接接在新的連結串列L表尾;
4、函式返回新連結串列L的表頭。
(2)實現要點
1、設定指標t1遍歷L1,指標t2遍歷L2,指標Ptr指向合適的結點(在L1中的結點,或者L2中的結點)來構造新的連結串列L。
實驗程式碼:
List Merge(List L1,List L2)
{List t1,t2,Ptr,L;
if(L1==NULL&&L2==NULL)
return NULL;
else if(L1==NULL)
return L2;
else if(L2==NULL)
return L1;
t1=L1->Next;
t2=L2->Next;
L=(List)malloc(sizeof(struct Node));
L->Next=NULL;
Ptr=L;
while(t1&&t2)
{
if(t1->Data<=t2->Data)
{
Ptr->Next=t1;
Ptr=t1;
t1=t1->Next;
Ptr->Next=NULL;
}
else
{
Ptr->Next=t2;
Ptr=t2;
t2=t2->Next;
Ptr->Next=NULL;
}
}
while(t1)
{
Ptr->Next=t1;
Ptr=t1;
t1=t1->Next;
Ptr->Next=NULL;
}
while(t2)
{
Ptr->Next=t2;
Ptr=t2;
t2=t2->Next;
Ptr->Next=NULL;
}
L1->Next=NULL;
L2->Next=NULL;
return L;
}
三、實驗總結
1.在遍歷L1,L2,並取出較小元素(現假設是L1中被訪問的某個元素較小)放到新的連結串列L中;
比較一下兩段程式碼,區別在哪?
程式碼段1:
這個程式碼段是錯誤的;
現在Ptr指向連結串列L1中的t1所指結點,可我卻把整個L1連結串列置空了,
那接下來t1就不能遍歷L1中剩餘的其他結點了。
程式碼段2:
這個程式碼段是正確的;
在新連結串列L中用尾插法形成,先將本次比較中,數值較小的結點插入L中,再讓t1繼續遍歷L1,同時再次確定此時Ptr是連結串列L的尾結點。
2.我犯的一個段錯誤問題
這裡的t1,t2都沒有賦值,就被我直接用上了,所以造成了段錯誤!
下面是修改後的程式碼段: