完成了鍊錶的學習,我們可以嘗試寫一些小的案例練習鍊錶的操作。
下面我來為大家介紹用單鏈表實現乙個簡單的**本程式。
2.刪除聯絡人
3.修改聯絡人
4.查詢聯絡人
5.檢視所有聯絡人
6.清空聯絡人
而修改練習人又可能包含以下選項:
(1)修改姓名
(2)修改性別
(3)修改年齡
(4)修改**號碼
(5)修改位址
分析到這兒,我們就可以著手寫**了。
標頭檔案:
#pragma
#include
#include
#include
#include
#define testtype printf("\n################################# %s #############################\n",__function__)
typedef struct booknode booknode;
//初始化**本
void booklistinit(booknode** phead);
//列印**本
void booklistprint(booknode* head, const
char* msg);
//插入聯絡人
void booklistinsert(booknode** phead,char* name,char* gender,int age,char* telephone,char* address);
//尋找聯絡人的位置
booknode* booklistfindpos(booknode* phead, char* to_find);
//刪除聯絡人
void booklisterase(booknode** phead, char* to_delete);
//查詢聯絡人
void booklistfind(booknode* phead, char* to_find);
//銷毀**本
void booklistdestroy(booknode** phead);
//更改聯絡人資訊
void booklistchange(booknode** phead, char* to_change, int flag, char* newmsg);
//選單
void telephonebookmenu();
具體實現#include
"book.h"
void booklistinit(booknode** phead)
*phead =
null;
}void destroynode(booknode* node)
//建立乙個新的聯絡人節點
booknode* createmum(char* uname,char* ugender,int uage,char* utelephone,char* uaddress)
//存入將練習人資訊儲存到節點中
strcpy(new_node->name,uname);
strcpy(new_node->gender,ugender);
new_node->age = uage;
strcpy(new_node->telephone,utelephone);
strcpy(new_node->address,uaddress);
new_node->next =
null;
return new_node;
}//列印**本
void booklistprint(booknode* head, const char* msg)
for(;cur !=
null;cur = cur->next)
return;
}//將聯絡人資訊插入鍊錶中
void booklistinsert(booknode** phead,char* name,char* gender,int age,char* telephone,char* address)
if(*phead ==
null)
booknode* cur =
*phead;
while(cur->next !=
null)
//不是空鍊錶,找到最後乙個節點,將新節點查到該節點之後
cur->next = createmum(name,gender,age,telephone,address);
return;
}booknode* booklistfindpos(booknode* phead, char* to_find)
booknode* cur = phead;
while(cur !=
null)
cur = cur->next;
}return
null;
}//刪除聯絡人節點
void booklisterase(booknode** phead, char* to_delete)
if(*phead ==
null)
booknode* pos = booklistfindpos(*phead,to_delete);
if(pos ==
null)
if( pos->next !=
null)
if(pos->next ==
null)
destroynode(pos);
cur->next =
null;
return;
}}//查詢聯絡人,並列印具體資訊
void booklistfind(booknode* phead, char* to_find)
booknode* cur = phead;
while(cur !=
null)
cur = cur->next;
}printf("[ 抱歉,沒有找到聯絡人! ]\n");
return;
}void booklistdestroy(booknode** phead)
if(*phead ==
null)
while((*phead)!=
null)
return;
}void booklistchange(booknode** phead,char* to_change,int flag,char* newmsg)
if(*phead ==
null)
booknode* pos = booklistfindpos(*phead, to_change);
if(pos ==
null)
switch(flag)
return;
}void telephonebookmenu()
接下來是主函式:
int main()
break;
case
2: break;
case
3: break;
case
4: break;
case
5: break;
case
6: break;}}
}
雙手奉上,makefile.
telephone_book:book.c main.c
gcc -g $^ -o $@
.phony:clean
clean:
rm telephone_book
大功告成!
最後,還有一些小建議,為了便於程式的除錯,我們最好在每個函式完成之後,都單獨寫乙個測試函式,例如:
//booklistinsert的測試函式
testbooklistinsert()
int main()
這樣可以極大程度的減少我們在後期除錯的複雜度。
這是我自己胡亂琢磨的乙個小案例,如果有什麼bug或者不妥之處,歡迎發郵件到我的郵箱 ( [email protected] ) 批評指正。
php實現乙個單鏈表
單鏈表,節點只有乙個指標域的鍊錶。節點包括資料域和指標域。鍊錶乙個很重要的特性,就是這個頭節點 head。它絕對不能少,每次遍歷都要從它開始,並且不能移動頭節點,應該用乙個變數去代替他移動。腦袋裡要有鍊錶的結構。這是關鍵。來一段 class node 鍊錶有幾個元素 function countno...
反轉乙個單鏈表
思路二 反轉乙個鍊錶 示例 結構體定義 先對原鍊錶做頭刪操作,再對新鍊錶做頭插定義乙個新head頭指標,標記為newhead,將它初始為null,並非指向null,最後我們選擇返回這個newhead指標作為新鍊錶的頭指標。定義乙個結點node作為 臨時中轉站 初始化與否並無大影響。進行迴圈遍歷鍊錶各...
定義乙個單鏈表
鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 鍊錶是由乙個乙個的節點相連線的,每乙個節點都是乙個物件,都有兩個屬性 data,next 根據鍊錶的結構可以分為 1.帶頭 不帶頭 2.單向 雙向 3.迴圈 非迴圈 這些組合起來就有8種結構 編寫乙...