如何用C語言和單鏈表編寫通訊錄程式?

以下經驗是個人埋頭苦幹了一個星期的成果,程式不是十分完善!不過你如要需要可以到我人百度網盤下載;uk=3006152706

一、系統分析

1.1問題描述

此程式要求開發一個具有如下功能:

(1)使用者登入:輸入使用者名稱和密碼,密碼正確才允許登入。

(2)錄入通訊資訊;

(3)給定人名,修改該人的通訊資訊;

(4)給定人名,刪除該人的通訊資訊;

(5)根據輸入的人名或姓,顯示查詢到的相應通訊資訊;

(6)根據輸入的分類,顯示該分類的所有人的通訊資訊;

(7)統計功能:統計各分類的人數。

另外要求用連結串列來儲存通訊錄的資訊並實現增刪功能。

1.2系統功能分析

主要包含一下多種功能:

新增:新增通訊錄記錄,逐個新增聯絡人。

顯示:顯示通訊錄記錄,顯示所有的聯絡人。

刪除:刪除通訊錄記錄,輸入人名刪除相應的資訊。

查詢:查詢通訊錄記錄,其中分為按人名查詢和按類查詢。

修改:修改通訊錄記錄,選擇性修改。

儲存:將資訊儲存到檔案,以檔案形式儲存到硬碟。

讀取:將資訊從檔案讀取到記憶體中。

退出:退出程式。

1.3開發平臺及工具介紹

開發平臺為windows 7ultimate,

開發工具為code::blocks 10.05

二、系統設計

2.1系統總體結構設計(由於貼不是設計圖紙,在這就沒有給出)

2.2系統各個功能模組詳細設計

Login() //登入

CreatePerson_L(per,i) //新增聯絡人

Load_All_Person_L(per) //顯示所有的聯絡人

DeletePerson_L(per) //按名字刪除聯絡人

Load_Some_Person_L(per) //輸出同類聯絡人

ResetPerson_L(per) //修改聯絡人

Save_Person_L(per) //儲存通訊錄

Read_Person_L() //讀取通訊錄

Statisticsrson_L(per) //統計同類的聯絡人

2.2.1登入功能模組

登入模組的設計思想主要為:

當用戶輸入使用者名稱或密碼錯誤時,提示使用者輸入錯誤

呼叫自身

程式碼如下:

charlocaluser[7]={"admin"}; //原始使用者

charlocalpassword[7]={"123456"};//原始使用者密碼

char username[16]; //用來接收使用者登入的資訊

char password[20];

void login()

{printf("請你輸入使用者名稱和密碼 ");

printf("username:");gets(username);

printf("password:");gets(password);

if((strcmp(localuser,username)!=0) (strcmp(localpassword,password)!=0))

{printf("你輸入的使用者名稱或密碼有誤,請重新輸入 ");

login();

}

system("cls");

}

........................................

..........................................

...............................此處省略一千字

三、總結與體會

剛聽到老師說個人完成程式設計時,我心裡有點慌,心想自己上學期的C語言沒有學得很好,尤其是有關指標的操作和檔案操作。再加上細看題目時發現要求要用到連結串列,這下我就更慌了,因為連結串列這方面的知識上學期完全沒有學的樣子,幸好這個學期資料結構有學連結串列的方面的知識。但是,對於連結串列這學期才剛學沒多久!所以就慌了!

上個月很忙,所以一直拖到5月份初才開始著手準備!首先,我抽出一天的時間去圖書館複習了連結串列、指標、檔案方面的知識!即使如此,看著題目還是無從下手!所以我在網上找了有關此方面的程式,然後對照著題目開始設計整體構架!

先是設計了登入函式login(),這裡用到了當用戶輸入使用者名稱或密碼錯誤時,login()自己呼叫自己!剛開始我想到的是用goto語句來實現函式自身呼叫的功能,但是由於編譯時不知道為什麼沒有通過,也就放棄了,第二天翻書時無意之間看到了函式自身呼叫,所以就用了自身呼叫。

第二設計新增聯絡人的函式CreatePerson_L(),設計這個函式時花費了好多心思!剛開始就遇到了沒法通過編譯,一直不知道為什麼,我請教了同學,發現原來是在printf("是否繼續新增聯絡人Y/N:");這個語句後面忘記了加一個接收回車鍵的語句getchar();這個問題解決了!還有問題,那就是我錯誤地直接把初始化函式那就是InitPerson()的功能寫在CreatePerson_L()裡,當登入到通訊錄且通訊錄為空時,由於Person per;沒有頭結點,即沒有初始化,導致其它函式(如Load_All_Person_L())沒有辦法判斷通訊錄是否為空!後來我InitPerson()單獨出來,並且在int main()裡剛開始呼叫它。修改了上面兩個錯誤後,在後來測試中有個隱藏中錯誤被發現了,那就是當你第二以上呼叫CreatePerson_L()時,我發現新增加的聯絡人根本就沒有連結在原來聯絡人的後面,這個問題,我設定了一個整型變數I用來判斷是否為第一次呼叫CreatePerson_L(),當第二以上呼叫時我寫下如下程式碼解決它!

Person p,s;

s=L;

if(i>=2) //第二次以上呼叫CreatePerson_()時,指標s是重新分配的,不再指向連結串列最後一個元素

{ Person q;

q=L; //故需要重新定位指向最後一個元素

q=q->next;

while(q) //使指標跳到最後一個元素

{ s=q; //指向最後一個元素

q=q->next;

}

第三設計刪除函式,這個函式主要是要找到相應人聯絡人,然後設定兩個Person型別的指標p,s。其中s是用來跟在p的後面的,當p->name==需要刪除的聯絡人時,只需讓s->next=p->next;並釋放p。

第四、設計按類查詢函式等等。總體上,這次個人完成設計程式雖然設計的程式不好,而且很累,在電腦面前坐了差不多一個星期,腰痠背疼,但是讓我感覺很有成就感,大大提升了我對程式設計的信心。

相關問題答案