C語言實現單鏈表面試題(基礎篇)

2021-08-02 15:48:06 字數 2945 閱讀 1935

順序表:

1. 記憶體中位址連續

2. 長度不可變更

3. 支援隨機查詢 可以在o(1)內查詢元素

4.適用於需要大量訪問元素的 而少量增添/刪除元素的程式

鍊錶 :

1. 記憶體中位址非連續

2. 長度可以實時變化

3. 不支援隨機查詢 查詢元素時間複雜度o(n)

4. 適用於需要進行大量增添/刪除元素操作而對訪問元素無要求的程式

在這裡我們先定義乙個單鏈表,下面進行對鍊錶的操作。

typedef

int datatype;

typedef

struct listnode

node,*pnode,*plist;//結點

注意,這裡是逆序列印鍊錶,並不是逆序,不需要真正的改變鍊錶的順序,只需要列印就好。

思想:這裡用乙個遞迴實現逆序列印,一直遞迴,到最後乙個,然後列印,返回上一層,這樣就實現了逆序列印。具體**如下。

void reverseprint(plist plist)//逆序列印鍊錶

if (plist->next==

null)

reverseprint(cur->next);//遞迴

printf ("%d ",cur->

data);

}

思想:刪除無頭單鏈表的非尾結點,也就是說不能刪除尾,所以我們想到,肯定需要判斷,為尾就不可以刪除。具體實現**如下:

void delnottailnode(pnode pos)

思想:因為是單鏈表,不能找到前乙個,所以在結點前面插入,就需要換一種思想了。可以考慮把資料進行交換,具體**如下

void insertfrontnode(pnode pos,datatype d)//在指定位置的前面插入乙個,非頭

約瑟夫環:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。約瑟夫環結束

那麼用單鏈表實現,這個鍊錶應該是環狀的。

pnode josephcircle(plist *pplist,int num)//約瑟夫環

while(--count)//這個數結束後才會出列,沒結束之前,一直向後走

//走到這裡就開始刪除,然後繼續迴圈

printf ("%d ",cur->

data);

del = cur->next;

cur->

data

= cur->next->

data;

cur->next = cur->next->next;

free(del);

del =

null;

}return cur;

}

這次才是逆置單鏈表,上面那個是逆序,只列印不改變,這個則是要改變鍊錶。

思想:1. 考慮沒有結點,則不需要逆置

2. 乙個結點,也不需要逆置

3. 正常情況,就是改變定義的新的頭結點,讓它去改變這個鍊錶,最後只需要把定義的那個頭連上鍊表的頭即可。**如下。

void reverselist(plist *pplist)//逆置

if ((*pplist)->next==

null)//有個結點也不需要逆置

cur = newhead->next;//cur指向第二個

newhead->next =

null;

while(cur)

*pplist = newhead;//最後改變頭結點就可以實現逆置

}

void bubblesort(plist *pplist)//氣泡排序,定義乙個尾指標

if (cur->next==

null)//乙個元素

while (cur!=tail)

cur= cur->next;

}tail = cur;

cur =

*pplist;

}}

plist merge(plist l1,plist l2)

if(l1==

null)//l1為空

if (l2==

null)//l2為空

//下面是正常情況

if(cur1->

data

<=cur2->

data)

else

while(cur1&&cur2)

else

if (cur1==

null)//在這裡判斷一下,是否有某個鍊錶已經為空了

if (cur2==

null)

}return newhead;

}

pnode findmidnode(plist plist)

while (fast&&(fast->next))//這裡有兩個條件,是因為鍊錶元素個數的奇偶

return slow;//最後放回這個慢的

}

思想:首先定義兩個指標,乙個指標比另乙個先走k步,然後兩個一起走,當快的那個走完,慢的指向的就是要找的那個。

**如下

void findknode(plist *pplist,int k)//找鍊錶的倒數第k個結點

while (fast&&(fast->next))

}printf("%d\n",slow->data);

}

以上這些就是基礎的單鏈表的面試題,後續還會寫高階版的。

觀點是個人見解,如有錯誤,歡迎指正,謝謝。

C語言實現單鏈表面試題(基礎篇)

順序表 1.記憶體中位址連續 2.長度不可變更 3.支援隨機查詢 可以在o 1 內查詢元素 4.適用於需要大量訪問元素的 而少量增添 刪除元素的程式 鍊錶 1.記憶體中位址非連續 2.長度可以實時變化 3.不支援隨機查詢 查詢元素時間複雜度o n 4.適用於需要進行大量增添 刪除元素操作而對訪問元素...

C語言實現單鏈表面試題 基礎篇(中)

6.逆值 翻轉單鏈表 思想同從頭列印鍊錶一樣,但應注意在反向連線鍊錶時的指向問題 void listtranspose listnode pplist,listnode plist 轉置單鏈表 plist next next plist plist next null 7.單鏈表排序 氣泡排序 氣泡...

c語言實現單鏈表面試題

首先實現乙個無頭單鏈表 include include include typedef int datatype typedef struct listnode listnode 列印 void printlist listnode plist printf null printf n 尾插 voi...