(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 相比陣列,鍊錶可以更加靈活的儲存資料,不需要知道要儲存的資料有多少,這樣可以充分利用計算機的記憶體空間。鍊錶可以再任意位置...