C 鍊錶 練習

2021-10-24 08:53:11 字數 4439 閱讀 6064

(1)將兩個遞增的有序鍊錶合併為乙個遞增的有序鍊錶。要求結果鍊錶仍使用原來兩個鍊錶的儲存空間, 不另外占用其它的儲存空間。表中不允許有重複的資料。

合併後的新錶使用頭指標lc指向,pa和pb分別是鍊錶la和lb的工作指標,初始化為相應鍊錶的第乙個結點,從第乙個結點開始進行比較,當兩個鍊錶la和lb均未到達表尾結點時,依次摘取其中較小者重新鏈結在lc表的最後。如果兩個表中的元素相等,只摘取la表中的元素,刪除lb表中的元素,這樣確保合併後表中無重複的元素。當乙個表到達表尾結點,為空時,將非空表的剩餘元素直接鏈結在lc表的最後。

void

mergelist

(linklist &la,linklist &lb,linklist &lc)

//取較小者la中的元素,將pa鏈結在pc的後面,pa指標後移

else

if(pa-

>data>pb-

>data)

//取較小者lb中的元素,將pb鏈結在pc的後面,pb指標後移

else

//相等時取la中的元素,刪除lb中的元素

} pc-

>next=pa?pa:pb;

//插入剩餘段

delete lb;

//釋放lb的頭結點

}

(2)將兩個非遞減的有序鍊錶合併為乙個非遞增的有序鍊錶。要求結果鍊錶仍使用原來兩個鍊錶的儲存空間, 不另外占用其它的儲存空間。表中允許有重複的資料。

分析:

合併後的新錶使用頭指標lc指向,pa和pb分別是鍊錶la和lb的工作指標,初始化為相應鍊錶的第乙個結點,從第乙個結點開始進行比較,當兩個鍊錶la和lb均未到達表尾結點時,依次摘取其中較小者重新鏈結在lc表的表頭結點之後,如果兩個表中的元素相等,只摘取la表中的元素,保留lb表中的元素。當乙個表到達表尾結點,為空時,將非空表的剩餘元素依次摘取,鏈結在lc表的表頭結點之後。

void

mergelist

(linklist& la, linklist& lb, linklist& lc,

)//la表為空,用q指向pb,pb指標後移

elseif(

!pb)

//lb表為空,用q指向pa,pa指標後移

else

if(pa-

>data<=pb-

>data)

//取較小者(包括相等)la中的元素,用q指向pa,pa指標後移

else

//取較小者lb中的元素,用q指向pb,pb指標後移

q->next = lc-

>next; lc-

>next = q;

//將q指向的結點插在lc 表的表頭結點之後

}delete lb;

//釋放lb的頭結點

}

(3)已知兩個鍊錶a和b分別表示兩個集合,其元素遞增排列。請設計演算法求出a與b的交集,並存放於a鍊錶中。

[題目分析]

只有同時出現在兩集合中的元素才出現在結果表中,合併後的新錶使用頭指標lc指向。pa和pb分別是鍊錶la和lb的工作指標,初始化為相應鍊錶的第乙個結點,從第乙個結點開始進行比較,當兩個鍊錶la和lb均為到達表尾結點時,如果兩個表中相等的元素時,摘取la表中的元素,刪除lb表中的元素;如果其中乙個表中的元素較小時,刪除此表中較小的元素,此表的工作指標後移。當鍊表la和lb有乙個到達表尾結點,為空時,依次刪除另乙個非空表中的所有元素。

void

mix(linklist& la, linklist& lb, linklist& lc)

else

if(pa-

>data>data)

else

}while

(pa)

// 釋放結點空間

while

(pb)

//釋放結點空間

pc->next=null;

//置鍊錶尾標記。

delete lb;

//釋放lb的頭結點

}

(4)已知兩個鍊錶a和b分別表示兩個集合,其元素遞增排列。請設計演算法求出兩個集合a和b 的差集(即僅由在a**現而不在b**現的元素所構成的集合),並以同樣的形式儲存,同時返回該集合的元素個數。

分析:求兩個集合a和b的差集是指在a中刪除a和b中共有的元素,即刪除鍊錶中的相應結點,所以要儲存待刪除結點的前驅,使用指標pre指向前驅結點。pa和pb分別是鍊錶la和lb的工作指標,初始化為相應鍊錶的第乙個結點,從第乙個結點開始進行比較,當兩個鍊錶la和lb均為到達表尾結點時,如果la表中的元素小於lb表中的元素,pre置為la表的工作指標pa刪除lb表中的元素;如果其中乙個表中的元素較小時,刪除此表中較小的元素,此表的工作指標後移。當鍊表la和lb有乙個為空時,依次刪除另乙個非空表中的所有元素。

void difference(linklist& la, linklist& lb,

int*n)

//a鍊錶中當前結點指標後移

else

if(pa-

>data>q-

>data)q=q-

>next;

//b鍊錶中當前結點指標後移

else

//刪除結點

}}

(5)設計演算法將乙個帶頭結點的單鏈表a分解為兩個具有相同結構的鍊錶b、c,其中b表的結點為a表中值小於零的結點,而c表的結點為a表中值大於零的結點(鍊錶a中的元素為非零整數,要求b、c表利用a表的結點)。

分析:

b表的頭結點使用原來a表的頭結點,為c表新申請乙個頭結點。從a表的第乙個結點開始,依次取其每個結點p,判斷結點p的值是否小於0,利用前插法,將小於0的結點插入b表,大於等於0的結點插入c表。

void

discompose

(linkedlist a)

∥將小於0的結點鏈入b表,前插法

else

∥將大於等於0的結點鏈入c表,前插法

p=r;∥p指向新的待處理結點。

}}

(6)設計乙個演算法,通過一趟遍歷在單鏈表中確定值最大的結點。

分析:

假定第乙個結點中資料具有最大值,依次與下乙個元素比較,若其小於下乙個元素,則設其下乙個元素為最大值,反覆進行比較,直到遍歷完該鍊錶。

elemtype max (linklist l )

return pmax-

>data;

(7)設計乙個演算法,通過遍歷一趟,將鍊錶中所有結點的鏈結方向逆轉,仍利用原表的儲存空間。 [題目分析] 從首元結點開始,逐個地把鍊錶l的當前結點p插入新的鍊錶頭部。
void

inverse

(linklist &l)

}

(8)設計乙個演算法,刪除遞增有序鍊錶中值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數,其值可以和表中的元素相同,也可以不同)。

分析:

分別查詢第乙個值》mink的結點和第乙個值≥maxk的結點,再修改指標,刪除值大於mink且小於maxk的所有元素。

void

delete

(linklist &l,

int mink,

int maxk)

//查詢第乙個值》mink的結點

if(p)

// 釋放結點空間

}//if

}

(9)已知p指向雙向迴圈鍊錶中的乙個結點,其結點結構為data、prior、next三個域,寫出演算法change§,交換p所指向的結點和它的字首結點的順序。

分析:

知道雙向迴圈鍊錶中的乙個結點,與前驅交換涉及到四個結點(p結點,前驅結點,前驅的前驅結點,後繼結點)六條鏈。

void  exchange(linkedlist p)//p是雙向迴圈鍊錶中的乙個結點,本演算法將p所指結點與其前驅結點交換。

//演算法exchange結束。

(10)已知長度為n的線性表a採用順序儲存結構,請寫一時間複雜度為o(n)、空間複雜度為o(1)的演算法,該演算法刪除線性表中所有值為item的資料元素。

分析:

在順序儲存的線性表上刪除元素,通常要涉及到一系列元素的移動(刪第i個元素,第i+1至第n個元素要依次前移)。本題要求刪除線性表中所有值為item的資料元素,並未要求元素間的相對位置不變。因此可以考慮設頭尾兩個指標(i=1,j=n),從兩端向中間移動,凡遇到值item的資料元素時,直接將右端元素左移至值為item的資料元素位置。

void  delete(elemtype a[

],int n)

//a是有n個元素的一維陣列,本演算法刪除a中所有值為item的元素。

鍊錶操作練習

本小題請務必重視,綜合了各種鍊錶操作 各種考試考題 可以做成乙個比較完整的工程,請設計測試程式進行測試,務必自己編寫 1 針對帶表頭結點的單鏈表,試編寫下列函式。1 建立函式create 根據一維陣列a n 建立乙個單鏈表,使單鏈表中各元素的次序與a n 中各元素的次序相同,要求該程式的時間複雜性為...

鍊錶例題練習

例題描述 將鍊錶中值小於x的節點放在鍊錶的前面,值大於等於x的節點放在鍊錶的後半部分。class listnode public listnode int val public class linkedlistinterview else send cur send指向cur所指的物件,當send指...

python練習 鍊錶

鍊錶是最簡單的資料結構之一,包括單向鍊錶 雙向鍊錶 迴圈鍊錶。每條鍊錶都由一系列節點 node 組成,節點包括兩部分 資料元素的值 value 和指向下乙個節點的指標 next 相比陣列,鍊錶可以更加靈活的儲存資料,不需要知道要儲存的資料有多少,這樣可以充分利用計算機的記憶體空間。鍊錶可以再任意位置...