實現一個通訊錄;
通訊錄可以用來存儲1000個人的信息,每個人的信息包括:
姓名、性別、年齡、電話、住址
提供方法:
1.添加聯繫人信息
2.刪除指定聯繫人信息
3.查找指定聯繫人信息
4.修改指定聯繫人信息
5.顯示所有聯繫人信息
6.清空所有聯繫人
7.以名字排序所有聯繫人
由於一般儲存都使用不了1000個人的信息,故爲了省空間我使用的是單鏈表儲存聯繫人的信息,有一個儲存一個,單鏈表具有省空間的作用,我將函數代碼封裝,下邊我將分佈列出來
定義結構體頭文件
#ifndef __telphone_H__ #define _CRT_SECURE_NO_WARNINGS 1 #define __telphone_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct tel_number { char name[8]; int sex; int age; char tel[12]; char address[20]; struct tel_number *next; }Node, *Telphone; #define TRUE 1 #define FALSE 0 extern void Init_tel(Telphone *S); //聯繫人鏈表初始化 extern char *fun_sb(char name[]); //輸入指定聯繫人 extern int Add_tel(Telphone S); //增加聯繫人 extern void Show_tel(Telphone S); //顯示所有聯繫人 extern int Delete_tel(Telphone S, char name[]); //刪除制定聯繫人 extern int fund_tel(Telphone S, char name[]); //尋找指定聯繫人 extern int Mod_tel(Telphone S, char name[]); //修改指定聯繫人 extern void Empty_tel(Telphone S); //清空聯繫人 extern int Sort_tel(Telphone S); //按姓名排序 extern void menu(); //菜單 #endif
主函數文件
#include"telphone.h" int main() { int let = 0; Telphone S; Init_tel(&S); char name[10]; int n = 1; while (n) { system("cls"); menu(); scanf("%d", &n); switch (n) { case 1: let = Add_tel(S); if (let == 1) printf("輸入成功!\n"); else printf("輸入失敗!\n"); system("pause"); break; case 2: let = Delete_tel(S, fun_sb(name)); if (let == 1) printf("成功刪除該指定聯繫人!\n"); else printf("刪除失敗!\n"); system("pause"); break; case 3: let = fund_tel(S, fun_sb(name)); if (let == 0) printf("未找到該指定聯繫人"); system("pause"); break; case 4: let = Mod_tel(S, fun_sb(name)); if (let == 1) printf("成功修改該指定聯繫人!\n"); else printf("修改失敗!\n"); system("pause"); break; case 5: Show_tel(S); printf("已全部顯示!\n"); system("pause"); break; case 6: Empty_tel(S); printf("\t清除成功!\n"); system("pause"); break; case 7: let=Sort_tel(S); if (let == 1) printf("成功將聯繫人按姓名排序!\n"); else printf("排序失敗!\n"); system("pause"); break; case 8: printf("\n\t\t\t\t謝謝使用!\n"); n = 0; break; default: printf("\a\t\t輸入序號有誤!請重新輸入!!!\n"); system("pause"); break; } } system("pause"); return 0; }
聯繫人鏈表初始化
#include"telphone.h" //電話簿初始化 void Init_tel(Telphone *S) { *S = (Telphone)malloc(sizeof(Node)); (*S)->next = NULL; }
輸入指定聯繫人
#include"telphone.h" //輸入聯繫人 char *fun_sb(char name[]) { getchar(); printf("請輸入指定聯繫人:"); gets(name); return name; }
增加聯繫人
int Add_tel(Telphone S)//鏈棧進棧 { Node *temp; temp = (Node *)malloc(sizeof(Node)); if (temp == NULL) return(FALSE); /* 申請空間失敗 */ char name[10]; char address[20]; char c = 1; int i = 0, j = 0; getchar(); printf("請輸入姓名:"); gets(name); printf("請輸入性別:男->1,女->0 :"); scanf("%d", &(temp->sex)); strcpy(temp->name, name); printf("請輸入年齡:"); scanf("%d", &(temp->age)); getchar(); printf("請輸入住址:"); gets(address); printf("請輸入電話號碼:"); gets(temp->tel); strcpy(temp->address, address); temp->next = S->next; S->next = temp; /* 修改當前棧頂指針 */ return(TRUE); }
顯示所有聯繫人
#include"telphone.h" void Show_tel(Telphone S) //顯示所有聯繫人 { int i = 0; Node * temp = S->next; if (temp == NULL) return; printf("姓名:%s\n", temp->name); printf("性別:"); if (1 == (temp->sex)) printf("男\n"); else printf("女\n"); printf("年齡:%d\n", temp->age); printf("電話號碼:%s\n", temp->tel); printf("住址:%s\n\n", temp->address); Show_tel(S->next); }
刪除指定聯繫人
#include"telphone.h" //刪除指定聯繫人 int Delete_tel(Telphone S, char name[]) { Node * temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { S->next = temp->next; return TRUE; } else Delete_tel(S->next, name); } return FALSE; }
尋找指定聯繫人
#include"telphone.h" //尋找指定聯繫人 int fund_tel(Telphone S, char name[]) { int i = 0; Node* temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { printf("找到指定聯繫人! 信息如下:\n"); printf("姓名:%s\n", temp->name); printf("性別:"); if (1 == (temp->sex)) printf("男\n"); else printf("女\n"); printf("年齡:%d\n", temp->age); printf("電話號碼:%s\n", temp->tel); printf("住址:%s\n", temp->address); return TRUE; } else fund_tel(S->next, name); } return FALSE; }
修改指定聯繫人
#include"telphone.h" //修改制定聯繫人 int Mod_tel(Telphone S, char name[]) { int i = 0; Node *temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { printf("找到指定聯繫人!請修改!\n :"); printf("姓名由%s修改爲:", temp->name); gets(name); printf("請輸入性別:男->1,女->0 :"); scanf("%d", &(temp->sex)); strcpy(temp->name, name); printf("年齡由%d修改爲:", temp->age); scanf("%d", &(temp->age)); getchar(); printf("住址由%s修改爲:", temp->address); gets(temp->address); printf("電話號碼由%s修改爲:", temp->tel); gets(temp->tel); return TRUE; } else Mod_tel(S->next, name); } return ; }
清空聯繫人
#include"telphone.h" //清空 void Empty_tel(Telphone S) { if (S->next != NULL) free(S); S->next = NULL; }
按姓名排序
#include"telphone.h" //按姓名排序 int Sort_tel(Telphone S) { if (S->next = NULL) return FALSE; int flag = 0; Node *p3 = S; Node *p2, *p1, *p4, *p5; while (p3->next->next != NULL)//注意鏈表向前推進的方式 { p2 = p3->next; p5 = p2; p1 = p2; p4 = p1; while (p1->next != NULL)//內存循環終止的條件 { if (strcmp(p5->name, p1->next->name)>0)//找出原鏈表中剩餘節點中值最小的那個節點 { p5 = p1->next; p4 = p1; flag = TRUE; } p1 = p1->next; } if (flag)//交換兩個節點的順序,值小的節點往前調 { if (p2 == p4)//此種情況爲要交換順序的兩個節點相鄰 { p2->next = p5->next; p5->next = p2; p3->next = p5; } else//這種情況爲要交換的兩個節點不相鄰 { Node *temp = p5->next; p5->next = p2->next; p3->next = p5; p4->next = p2; p2->next = temp; } } p3 = p3->next; } return TRUE; }
注:本人使用的是VS2013編譯器,爲了使用scanf,故定義了宏 #define _CRT_SECURE_NO_WARNINGS 1 如果在別的編譯器運行,則不需要定義這個宏,
運行結果:
結果就不予展示了,有興趣的可以複製代碼然後運行,
本人也是初學,代碼中難免有許多疏漏之處,歡迎各位大神批評指正!