文章目錄
- 丐版通訊錄
- 通訊錄他能干什么呢
- 靜態版本
- test.c
- main.c
- 選單
- contact.c
- 初始化通訊錄函式InitContact
- 添加通訊錄函式AddContact
- 顯示通訊錄函式ShowContact
- 找人函式FindByName
- 洗掉指定聯系人函式DelContact
- 查找聯系人函式SearchContact
- 修改指定聯系人函式ModifyContact
- 快排通訊錄函式(年齡排序)QsortContact
- contact.h
- 創建通訊錄的一些宏
- 選項(方便刪改)
- 用戶資訊結構體
- 通訊錄結構體
- 宣告函式
- 動態版本
- contact.h
- 改一:通訊錄結構體
- contact.c
- 改二:初始化通訊錄函式InitContact
- 改三:增加通訊錄函式AddContact
- 添加四:銷毀通訊錄函式DestroyContact
- 完整代碼
- test.c
- contact.c
- contact.h
- 跑圖
丐版通訊錄
什么是丐版,就是能達到基本溫飽,而微星的丐版是性價比最高的丐版,當然我是高配哈哈哈,這個通訊錄就是微星丐版,一些基本用戶功能是有的,甚至還多了功能,排序,用戶級別的控制記憶體,當然有些用戶友好功能沒寫(例如輸錯三次強制退出啊什么的),這些得高配再寫,不然就不叫丐版了,我相信大多數人用了沒有說不好的,那些高配的不要來裝了(檔案處理的哈哈哈),高配我們家也有,不過還沒到發售時間,不吹了,吃飯了
通訊錄他能干什么呢
1.存放1000個好友資訊
那么一個人的好友資訊包含什么東西呢
包含姓名,電話,性別,住址,年齡
2.還可以增加好友資訊
3.洗掉指定名字的好友資訊
4.查找好友資訊
5.修改好友資訊
6.列印好友資訊
7.排序好友資訊
靜態版本
test.c
測驗通訊錄各個功能
main.c
首先就是主函式
int main()
{
int input = 0;
//int size = 0;//用來記錄通訊錄有多少人的資訊變數
//struct PeoInfo con[MAX];//存放1000個人的資訊
/*為了下面函式不重復的寫con,&size,就把他們集合在 一起了struct Contact*/
struct Contact con;//con就是通訊錄,里面包含1000人資訊的陣列,和size
InitContact(&con);//初始化通訊錄
do//首先讓他回圈起來
{
menu();//顯示選單
printf("請選擇:>");
scanf("%d",&input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
QsortContact(&con);
break;
case EXIT:
printf("退出通訊錄\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}

選單
void menu()
{
printf("*******************************\n");
printf("***** 1.add 2.del ***\n");
printf("***** 3.search 4.modify ***\n");
printf("***** 5.show 6.short ***\n");
printf("***** 0.exit ***\n");
printf("*******************************\n");
}
這里的選單序號要想到列舉
contact.c
通訊錄的實作
初始化通訊錄函式InitContact
//初始化通訊錄
void InitContact(struct Contact* ps)
{
assert(ps);
memset(ps->data, 0, sizeof(ps->data));//把data這個空間里全部設定為零
ps->size = 0;//讓我們通訊錄最初只有0個元素
}
添加通訊錄函式AddContact
//添加通訊錄
void AddContact(struct Contact* ps)
{
assert(ps);
if (ps->size == MAX)//通訊錄滿了就添加不了資訊
{
printf("通訊錄已滿無法添加\n");
}
else
{
printf("請輸入名字:");
scanf("%s", ps->data[ps->size].name);//ps->data找到那個陣列,
//ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
printf("請輸入電話:");
scanf("%s", ps->data[ps->size].tele);
printf("請輸入性別:");
scanf("%s", ps->data[ps->size].sex);
printf("請輸入地址:");
scanf("%s", ps->data[ps->size].addr);
printf("請輸入年齡:");
scanf("%d", &(ps->data[ps->size].age));//這里和上面不一樣,因為上面是字串,名字就是首地址
//而age是int 所以得取地址
//填好之后size得加加,因為size既是通訊錄陣列下標,也是人數的標準,添加一人就++;
ps->size++;
printf("添加成功\n");
}
}
顯示通訊錄函式ShowContact
//不知道自己操作成沒成功就show一下
//顯示通訊錄
void ShowContact(const struct Contact* ps)//這里為了安全,我們只是看一下里面的內容,不會修改,所以就const
{
assert(ps);
if (!ps->size)
{
printf("通訊錄里面沒有人,沒什么好顯示的:\n");
}
else
{
int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年齡","性別","電話","地址");
for (i = 0; i < ps->size; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-20s\n",//為了對齊就把上面的格式拿下來,注意年齡的格式s變成了d
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
}
}
}

找人函式FindByName
//只給本檔案內函式用
static int FindByName(const struct Contact* ps, char name[MAX_NAME])
{
assert(ps);
int i = 0;
for (i = 0; i < ps->size; i++)
{
if (0 == strcmp(ps->data[i].name, name))
{
//break;//找到就跳出來
return i;
}
}
return -1;
}
洗掉指定聯系人函式DelContact
//洗掉指定的聯系人
void DelContact(struct Contact* ps)
{
assert(ps);
if (ps->size == 0)
{
printf("通訊錄為空,無法洗掉.\n");
return 0;
}
char name[MAX_NAME] = {0};
printf("請輸入要洗掉人的姓名:");
scanf("%s", name);
int pos = FindByName(ps,name);//找到把下標拿出來,找不到回傳-1
查找要洗掉的人在什么位置
高校做法也就是打工人做法,萬物皆遍歷
//int i = 0;
//for (i = 0; i < ps->size; i++)
//{
// if (0 == strcmp(ps->data[i].name, name))
// {
// break;//找到就跳出來
// }
//}
//然后再洗掉
if (pos == -1)//說明他遍歷完了也沒找到那個名字,也就是說是不存在的
{
printf("要洗掉的人不存在:");
}
else
{
//洗掉資料
int j = 0;
for (int j = pos; j < ps->size; j++)
{
ps->data[j] = ps->data[j + 1];//需要洗掉的資料后面的來補洗掉資料的空間
}
ps->size--;//洗掉了,人就減一
printf("洗掉成功");
}
}
查找聯系人函式SearchContact
//查找聯系人 我就是查找不修改,所以要const
void SearchContact(const struct Contact* ps)
{
assert(ps);
char name[MAX_NAME] = { 0 };
printf("請輸入 需要查找人的名字:");
scanf("%s",name);
查找的程序和洗掉的 查找程序一樣 ,這時候再寫一樣的話就會出現代碼冗余,所以我們需要寫一個通用的查找功能
//int i = 0;
//for (i = 0; i < ps->size; i++)
//{
// if (0 == strcmp(ps->data[i].name, name))
// {
// break;//找到就跳出來
// }
//}
int pos = FindByName(ps, name);
if (pos == -1)//說明他遍歷完了也沒找到那個名字,也就是說是不存在的
{
printf("要查找的人不存在:");
}
else
{
//找到就列印
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-20s\n",//為了對齊就把上面的格式拿下來,注意年齡的格式s變成了d
ps->data[pos].name,
ps->data[pos].age,
ps->data[pos].sex,
ps->data[pos].tele,
ps->data[pos].addr);
}
}
修改指定聯系人函式ModifyContact
//修改指定聯系人
void ModifyContact( struct Contact* ps)
{
assert(ps);
char name[MAX_NAME] = { 0 };
printf("請輸入要修改人的名字:");
scanf("%s",name);
int pos = FindByName(ps,name);
if (pos == -1)
{
printf("沒有修改人的名字\n");
}
else
{
printf("請輸入名字:");
scanf("%s", ps->data[pos].name);//ps->data找到那個陣列,
//ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
printf("請輸入電話:");
scanf("%s", ps->data[pos].tele);
printf("請輸入性別:");
scanf("%s", ps->data[pos].sex);
printf("請輸入地址:");
scanf("%s", ps->data[pos].addr);
printf("請輸入年齡:");
scanf("%d", &(ps->data[pos].age));
printf("修改完成:");
}
}
快排通訊錄函式(年齡排序)QsortContact
//由于中文名在記憶體中存盤方式的問題,所以我們選擇年齡排序
static int cmp_peoinfo_age(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//快排通訊錄
void QsortContact(struct Contact* ps)
{
assert(ps);
if (ps->size < 2)
{
printf("所需排序人少于2人,無需排序");
return 0;
}
qsort(ps->data, ps->size, sizeof(ps->data[0]), cmp_peoinfo_age);
}
contact.h
通訊錄的宣告
創建通訊錄的一些宏
#define MAX 1000
#define MAX_NAME 20 //為了好修改直接宏定義
#define MAX_TELE 12
#define MAX_SEX 5
#define MAX_ADDR 30
選項(方便刪改)
//選項,因為每次輸入數字的話還要看看數字的意思,會很麻煩,所以列舉
enum Option
{
EXIT, //0退出
ADD, //1添加
DEL, //2洗掉
SEARCH, //3查找
MODIFY, //4修改
SHOW, //5查看
SORT //6排序
};

用戶資訊結構體
//創建用戶資訊型別包含姓名,電話,性別,住址,年齡
//然后通訊錄就是1000個用戶組成的,創建一個陣列就好
struct PeoInfo
{
char name[MAX_NAME];
char tele[MAX_TELE];
char sex[MAX_SEX];
char addr[MAX_ADDR];
int age;
};
通訊錄結構體
//通訊錄型別,里面是通訊錄資訊
struct Contact
{
struct PeoInfo data[MAX];//存放1000個資訊
int size;//記錄當前個數
};
宣告函式
//宣告函式
//初始化通訊錄
void InitContact(struct Contact* ps);
//添加通訊錄
void AddContact(struct Contact* ps);
//顯示通訊錄
void ShowContact(const struct Contact* ps);
/*為了通過name查找人,這里用函式寫是因為之后洗掉,查詢,修改等都
需要用到find這個功能,寫在函式里面的話很多都是重復的會顯的很冗余
int FindByName(struct Contact* ps, char name[MAX_NAME]); 這個函式宣告就不要宣告了,不需要給用戶,
我們給用戶的功能就那選單里的那幾個,這個函式是為了服務查詢名字而出現的,不是為了用戶出現,所以不
需要暴露給用戶,而且還要加上static,不讓其他人用,只給檔案 內函式用*/
//洗掉指定的聯系人
void DelContact(struct Contact* ps);
//查找聯系人
void SearchContact(const struct Contact* ps);
//修改指定聯系人
void ModifyContact(struct Contact* ps);
//排序聯系人
void QsortContact(struct Contact* ps);
動態版本
比其他丐版的優勢
contact.h
改一:通訊錄結構體
//動態版本
//通訊錄型別,里面是通訊錄資訊
struct Contact
{
struct PeoInfo* data;//用指標來維護用戶空間
int sz; //記錄通訊錄當前的元素個數
int capacity ; //通訊錄最大容量
};

contact.c
改二:初始化通訊錄函式InitContact
//動態版本
//初始化通訊錄
//剛開始的時候通訊錄結構體就給了指標但沒有指向空間,所以我們得初始化給他
//只有三個人的元素,不夠再加唄
void InitContact(struct Contact* ps)
{
ps->sz = 0;//此時有效元素是0
ps->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));//先給3個元素
ps->capacity = DEFAULT_SZ;
}

改三:增加通訊錄函式AddContact
//動態版本
// 添加通訊錄
void AddContact( struct Contact* ps)
{
//當有效元素個數和通訊錄最大容量相等時就要擴容了
if (ps->sz == ps->capacity)
{
struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));//增加兩個元素
if (ptr == NULL)
{
printf("擴容失敗\n");
return 0;
}
else
{
ps->data = ptr;//ptr不為空就交給data維護
ps->capacity += 2;//這個不要忘了總容量也要加
printf("擴容成功\n");
}
}
//然后再增加新的資訊
printf("請輸入名字:");
scanf("%s", ps->data[ps->sz].name);//ps->data找到那個陣列,
//ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
printf("請輸入電話:");
scanf("%s", ps->data[ps->sz].tele);
printf("請輸入性別:");
scanf("%s", ps->data[ps->sz].sex);
printf("請輸入地址:");
scanf("%s", ps->data[ps->sz].addr);
printf("請輸入年齡:");
scanf("%d", &(ps->data[ps->sz].age));//這里和上面不一樣,因為上面是字串,名字就是首地址
//而age是int 所以得取地址
//填好之后sz得加加,因為sz既是通訊錄陣列下標,也是人數的標準,添加一人就++;
(ps->sz)++;
printf("添加成功\n");
}
注意我們在擴容卻沒有釋放,那我們什么時候釋放呢,是不是只有程式結束也就是程式退出的時候釋放,也就是Exit的時候
所以我們得寫個銷毀通訊錄的函式
添加四:銷毀通訊錄函式DestroyContact
//銷毀通訊錄
void DestroyContact(struct Contact* ps)
{
//釋放人員資訊空間
free(ps->data);
ps->data = NULL;
//指向的陣列都沒了,所以sz,capacity也沒用了
ps->sz = 0;
ps->capacity = 0;
}
完整代碼
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("*******************************\n");
printf("***** 1.add 2.del ***\n");
printf("***** 3.search 4.modify ***\n");
printf("***** 5.show 6.short ***\n");
printf("***** 0.exit ***\n");
printf("*******************************\n");
}
int main()
{
int input = 0;
//int size = 0;//用來記錄通訊錄有多少人的資訊變數
//struct PeoInfo con[MAX];//存放1000個人的資訊
/*為了下面函式不重復的寫con,&size,就把他們集合在 一起了struct Contact*/
struct Contact con;//con就是通訊錄,里面包含1000人資訊的陣列,和size
InitContact(&con);//初始化通訊錄
do//首先讓他回圈起來
{
menu();//顯示選單
printf("請選擇:>");
scanf("%d",&input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SHOW:
ShowContact(&con);
break;
case SORT:
QsortContact(&con);
break;
case EXIT:
DestroyContact(&con);
printf("退出通訊錄\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
靜態版本
初始化通訊錄
//void InitContact(struct Contact* ps)
//{
// assert(ps);
// memset(ps->data, 0, sizeof(ps->data));//把data這個空間里全部設定為零
// ps->size = 0;//讓我們通訊錄最初只有0個元素
//}
//動態版本
//初始化通訊錄
//剛開始的時候通訊錄結構體就給了指標但沒有指向空間,所以我們得初始化給他
//只有三個人的元素,不夠再加唄
void InitContact(struct Contact* ps)
{
ps->sz = 0;//此時有效元素是0
ps->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));//先給3個元素
ps->capacity = DEFAULT_SZ;
}
靜態版本
添加通訊錄
//void AddContact(struct Contact* ps)
//{
// assert(ps);
// if (ps->size == MAX)//通訊錄滿了就添加不了資訊
// {
// printf("通訊錄已滿無法添加\n");
// }
// else
// {
// printf("請輸入名字:");
// scanf("%s", ps->data[ps->size].name);//ps->data找到那個陣列,
// //ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
// printf("請輸入電話:");
// scanf("%s", ps->data[ps->size].tele);
// printf("請輸入性別:");
// scanf("%s", ps->data[ps->size].sex);
// printf("請輸入地址:");
// scanf("%s", ps->data[ps->size].addr);
// printf("請輸入年齡:");
// scanf("%d", &(ps->data[ps->size].age));//這里和上面不一樣,因為上面是字串,名字就是首地址
// //而age是int 所以得取地址
// //填好之后size得加加,因為size既是通訊錄陣列下標,也是人數的標準,添加一人就++;
// ps->size++;
// printf("添加成功\n");
// }
//}
//動態版本
// 添加通訊錄
void AddContact( struct Contact* ps)
{
//當有效元素個數和通訊錄最大容量相等時就要擴容了
if (ps->sz == ps->capacity)
{
struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));//增加兩個元素
if (ptr == NULL)
{
printf("擴容失敗\n");
return 0;
}
else
{
ps->data = ptr;//ptr不為空就交給data維護
ps->capacity += 2;//這個不要忘了總容量也要加
printf("擴容成功\n");
}
}
//然后再增加新的資訊
printf("請輸入名字:");
scanf("%s", ps->data[ps->sz].name);//ps->data找到那個陣列,
//ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
printf("請輸入電話:");
scanf("%s", ps->data[ps->sz].tele);
printf("請輸入性別:");
scanf("%s", ps->data[ps->sz].sex);
printf("請輸入地址:");
scanf("%s", ps->data[ps->sz].addr);
printf("請輸入年齡:");
scanf("%d", &(ps->data[ps->sz].age));//這里和上面不一樣,因為上面是字串,名字就是首地址
//而age是int 所以得取地址
//填好之后sz得加加,因為sz既是通訊錄陣列下標,也是人數的標準,添加一人就++;
(ps->sz)++;
printf("添加成功\n");
}
//銷毀通訊錄
void DestroyContact(struct Contact* ps)
{
//釋放人員資訊空間
free(ps->data);
ps->data = NULL;
//指向的陣列都沒了,所以sz,capacity也沒用了
ps->sz = 0;
ps->capacity = 0;
}
//不知道自己操作成沒成功就show一下
//顯示通訊錄
void ShowContact(const struct Contact* ps)//這里為了安全,我們只是看一下里面的內容,不會修改,所以就const
{
assert(ps);
if (!ps->sz)
{
printf("通訊錄里面沒有人,沒什么好顯示的:\n");
}
else
{
int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年齡","性別","電話","地址");
for (i = 0; i < ps->sz; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-20s\n",//為了對齊就把上面的格式拿下來,注意年齡的格式s變成了d
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].tele,
ps->data[i].addr);
}
}
}
//只給本檔案內函式用
static int FindByName(const struct Contact* ps, char name[MAX_NAME])
{
assert(ps);
int i = 0;
for (i = 0; i < ps->sz; i++)
{
if (0 == strcmp(ps->data[i].name, name))
{
//break;//找到就跳出來
return i;
}
}
return -1;
}
//洗掉指定的聯系人
void DelContact(struct Contact* ps)
{
assert(ps);
if (ps->sz == 0)
{
printf("通訊錄為空,無法洗掉.\n");
return 0;
}
char name[MAX_NAME] = {0};
printf("請輸入要洗掉人的姓名:");
scanf("%s", name);
int pos = FindByName(ps,name);//找到把下標拿出來,找不到回傳-1
查找要洗掉的人在什么位置
高校做法也就是打工人做法,萬物皆遍歷
//int i = 0;
//for (i = 0; i < ps->size; i++)
//{
// if (0 == strcmp(ps->data[i].name, name))
// {
// break;//找到就跳出來
// }
//}
//然后再洗掉
if (pos == -1)//說明他遍歷完了也沒找到那個名字,也就是說是不存在的
{
printf("要洗掉的人不存在:");
}
else
{
//洗掉資料
int j = 0;
for (int j = pos; j < ps->sz; j++)
{
ps->data[j] = ps->data[j + 1];//需要洗掉的資料后面的來補洗掉資料的空間
}
ps->sz--;//洗掉了,人就減一
printf("洗掉成功");
}
}
//查找聯系人 我就是查找不修改,所以要const
void SearchContact(const struct Contact* ps)
{
assert(ps);
char name[MAX_NAME] = { 0 };
printf("請輸入 需要查找人的名字:");
scanf("%s",name);
查找的程序和洗掉的 查找程序一樣 ,這時候再寫一樣的話就會出現代碼冗余,所以我們需要寫一個通用的查找功能
//int i = 0;
//for (i = 0; i < ps->size; i++)
//{
// if (0 == strcmp(ps->data[i].name, name))
// {
// break;//找到就跳出來
// }
//}
int pos = FindByName(ps, name);
if (pos == -1)//說明他遍歷完了也沒找到那個名字,也就是說是不存在的
{
printf("要查找的人不存在:");
}
else
{
//找到就列印
printf("%-10s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年齡", "性別", "電話", "地址");
printf("%-10s\t%-5d\t%-5s\t%-12s\t%-20s\n",//為了對齊就把上面的格式拿下來,注意年齡的格式s變成了d
ps->data[pos].name,
ps->data[pos].age,
ps->data[pos].sex,
ps->data[pos].tele,
ps->data[pos].addr);
}
}
//修改指定聯系人
void ModifyContact( struct Contact* ps)
{
assert(ps);
char name[MAX_NAME] = { 0 };
printf("請輸入要修改人的名字:");
scanf("%s",name);
int pos = FindByName(ps,name);
if (pos == -1)
{
printf("沒有修改人的名字\n");
}
else
{
printf("請輸入名字:");
scanf("%s", ps->data[pos].name);//ps->data找到那個陣列,
//ps->size找到放在[]里面就是 找到陣列里面的某一個元素了,找到后再.name放到名字里面去
printf("請輸入電話:");
scanf("%s", ps->data[pos].tele);
printf("請輸入性別:");
scanf("%s", ps->data[pos].sex);
printf("請輸入地址:");
scanf("%s", ps->data[pos].addr);
printf("請輸入年齡:");
scanf("%d", &(ps->data[pos].age));
printf("修改完成:");
}
}
//由于中文名在記憶體中存盤方式的問題,所以我們選擇年齡排序
static int cmp_peoinfo_age(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;
}
//快排通訊錄
void QsortContact(struct Contact* ps)
{
assert(ps);
if (ps->sz < 2)
{
printf("所需排序人少于2人,無需排序");
return 0;
}
qsort(ps->data, ps->sz, sizeof(ps->data[0]), cmp_peoinfo_age);
}
contact.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 1000
#define MAX_NAME 20 //為了好修改直接宏定義
#define MAX_TELE 12
#define MAX_SEX 5
#define MAX_ADDR 30
#define DEFAULT_SZ 3
//選項,因為每次輸入數字的話還要看看數字的意思,會很麻煩,所以列舉
enum Option
{
EXIT, //0退出
ADD, //1添加
DEL, //2洗掉
SEARCH, //3查找
MODIFY, //4修改
SHOW, //5查看
SORT //6排序
};
//創建用戶資訊型別包含姓名,電話,性別,住址,年齡
//然后通訊錄就是1000個用戶組成的,創建一個陣列就好
struct PeoInfo
{
char name[MAX_NAME];
char tele[MAX_TELE];
char sex[MAX_SEX];
char addr[MAX_ADDR];
int age;
};
靜態版本
通訊錄型別,里面是通訊錄資訊
//struct Contact
//{
// struct PeoInfo data[MAX];//存放1000個資訊
// int size;//記錄當前個數
//};
//動態版本
//通訊錄型別,里面是通訊錄資訊
struct Contact
{
struct PeoInfo* data;//用指標來維護用戶空間
int sz; //記錄通訊錄當前的元素個數
int capacity ; //通訊錄最大容量
};
//宣告函式
//初始化通訊錄
void InitContact(struct Contact* ps);
//添加通訊錄
void AddContact(struct Contact* ps);
//顯示通訊錄
void ShowContact(const struct Contact* ps);
/*為了通過name查找人,這里用函式寫是因為之后洗掉,查詢,修改等都
需要用到find這個功能,寫在函式里面的話很多都是重復的會顯的很冗余
int FindByName(struct Contact* ps, char name[MAX_NAME]); 這個函式宣告就不要宣告了,不需要給用戶,
我們給用戶的功能就那選單里的那幾個,這個函式是為了服務查詢名字而出現的,不是為了用戶出現,所以不
需要暴露給用戶,而且還要加上static,不讓其他人用,只給檔案 內函式用*/
//洗掉指定的聯系人
void DelContact(struct Contact* ps);
//查找聯系人
void SearchContact(const struct Contact* ps);
//修改指定聯系人
void ModifyContact(struct Contact* ps);
//排序聯系人
void QsortContact(struct Contact* ps);
//銷毀通訊錄函式
void DestroyContact(struct Contact* ps);
跑圖



轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303094.html
標籤:其他
