設計實現一個簡易通訊錄,要求使用結構體
阿新 • • 發佈:2019-01-24
實現一個通訊錄;
通訊錄可以用來儲存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 如果在別的編譯器執行,則不需要定義這個巨集,
執行結果:
結果就不予展示了,有興趣的可以複製程式碼然後執行,
本人也是初學,程式碼中難免有許多疏漏之處,歡迎各位大神批評指正!