鍊錶
鍊錶應該是面試時被提及的最頻繁的資料結構。鍊錶是由指標把若干個結點連線成鏈狀結構。鍊錶的建立,插入結點,刪除結點等操作都只需要20行左右的**就能實現,比較適合面試。思路:題目:輸入乙個鍊錶的頭結點,從尾到頭 反過來列印出每個結點的值。要求不改變鍊錶的結構。
通過遞迴來實現反過來輸出鍊錶,當訪問到乙個結點的時候,先遞迴輸出它後面的結點,在輸出結點本身,這樣就可以輸出反過來的鍊錶了
單鏈表:
#define _crt_secure_no_warnings
#include
using
namespace
std;
//單鏈表結點翻轉 - 遞迴
typedef
struct listnode listnode;
#define listsize 1000
listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快
int nodenum = 0;
//nil是表頭,nil是它的指標,繫結一下
listnode nil;
listnode * nil;
listnode * getnewnode()
void listinit()
//dstnode是乙個指向指標的指標,,如果插入的鍊錶是乙個空鍊錶的時候,新插入的結點就是鍊錶的頭指標,這時會
//改變頭指標,因此必須吧dstnode引數設定為指向指標的指標,否則在這個函式範圍外,dstnode 仍然是乙個空指標。
void singlelistinsterafter(listnode ** dstnode, listnode * newnode)
else
tempnode->next = newnode;
}}int data[listsize];
void showlist()
printf("\n");
}void printlistreversingling_recursively(listnode * phead)
printf("%d ", phead->key);
}}void main()
printf("\n");
listinit();
for (int i = 0; i < n; i++)
//按照插入的順序輸出
showlist();
//翻轉單鏈表
listnode * phead = nil;
printlistreversingling_recursively(phead->next);
}
雙鏈表:#define _crt_secure_no_warnings
#include
using
namespace
std;
//linkedlist api
//雙鏈表結點 從尾到頭列印鍊錶
typedef
struct listnode listnode;
#define listsize 1000
listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快
int nodenum = 0;
//nil是表頭,nil是它的指標,繫結一下
listnode nil;
listnode * nil;
listnode * getnewnode()
void listinit()
void listinsertafter(listnode * dstnode, listnode * newnode)
//end of linkedlist api
int data[listsize];
void showlist()
cout
<< endl;
}void printlistreversingling_recursively(listnode * phead)
printf("%d ", phead->key);
}}void main()
printf("\n");
listinit();
for (int i = 0; i < n; i++)
//按照插入的順序輸出
listnode * curnode = nil->next;
while (curnode != nil)
cout
<< endl;
listnode * phead = nil;
printlistreversingling_recursively(phead->next);
}
a. 建立:10個隨機的數字,將其插入到鍊錶中
b. 遍歷:將這10個數字按照插入順序輸出
c. 新增、刪除:使用插入排序的方法調整鍊錶節點的順序,使得節點按值的公升序排列
//linkedlist api
//雙向鍊錶結點
typedef
struct listnode listnode;
#define listsize 1000
listnode listnodepool[listsize];//建立結點池,在需要的時候直接獲取,比new listnode時間快
int nodenum = 0;
//nil是表頭,nil是它的指標,繫結一下
listnode nil;
listnode * nil;
listnode * getnewnode()
void listinit()
void listinsertafter(listnode * dstnode, listnode * newnode)
void listinsertatfront(listnode * node)
void listdelete(listnode * node)
listnode * listsearch(int k)
return x;
}//end of linkedlist api
int data[listsize];
void insertsort(int data, int n)
else
}data[j + 1] = key;
}}void showdata(int n)
cout
<< endl;
}void showlist()
cout
<< endl;
}void listinsertsort()
dstnode = dstnode->prev;
tmpnode = curnode->next;
listdelete(curnode);
listinsertafter(dstnode, curnode);
curnode = tmpnode;
}}void main()
//cout << endl;
printf("\n");
listinit();
listnode * dstnode = nil;
for (int i = 0; i < n; i++)
//按照插入的順序輸出
listnode * curnode = nil->next;
while (curnode != nil)
cout
<< endl;
//插入按照從小到大排序輸出,陣列實現
insertsort(data, n);
showdata(n);
//插入按照從小到大排序輸出,鍊錶實現
listinsertsort();
showlist();
}
面試準備 資料結構 鍊錶
include using namespace std 鍊錶節點定義 template struct slnode slnode const t item,slnode nextnode null 鍊錶類定義 templateclass sllist sllist bool isempty int ...
資料結構 比較鍊錶和陣列
計算機的資源是有限的 而人對計算機的需求是無限的 好的資料機構和演算法便是為了更好的滿足計算機使用者的需求 而這也是計算機作業系統意義所在。在學習資料結構的同時 了解一定的計算機作業系統知識有助於更好的理解其意義所在。而了解資料結構和演算法 會更容易明白作業系統的工作原理。廣義上講 資料結構是資料的...
資料結構與演算法 一 鍊錶
鍊錶的分類 迴圈鍊錶 雙向鍊錶演算法 結構記憶體塊 鍊錶的結點 後繼指標next 指向下乙個結點 頭結點鍊錶中第乙個結點,其記錄鍊錶中的基位址 尾結點鍊錶中的最後乙個結點,其next指標指向null 時間複雜度 刪除和插入 都只需要改變相鄰結點的next指標指向即可,時間複雜度為o 1 隨機訪問 不...