實現一個通訊錄;
通訊錄可以用來存儲1000個人的信息,每個人的信息包括:
姓名、性別、年齡、電話、住址
提供方法:
1. 添加聯繫人信息
2. 刪除指定聯繫人信息
3. 查找指定聯繫人信息
4. 修改指定聯繫人信息
5. 顯示所有聯繫人信息
6. 清空所有聯繫人
7. 以名字排序所有聯繫人
Contact.h
#ifndef __CONTACT_H__//防止頭文件的重複引用
#define __CONTACT_H__
#include <string.h>
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 25
#define ADDR_MAX 30
#define TELE_MAX 12
#define DEFAULT_SZ 3
#define DEFAULT_INC 2 //默認增長
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
typedef struct PeoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tele[TELE_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo *data;
int sz; //將*之前的結構體重命名爲pContact
int capacity; //容量
}Contact, *pContact; //Contact;
void InitContact(pContact pcon);//Contact* pcon
void AddContact(pContact pcon);
void DelContact(pContact pcon);
void SearchContact(pContact pcon);
void ModifyContact(pContact pcon);
void ShowContact(const pContact pcon);
void SortContact(pContact pcon);
void ClearContact(pContact pcon);
void CheckCapacity(pContact pcon);
void DestroyCapacity(pContact pcon);
static int FindEntry(pContact pcon, char name[]);
#endif
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
void InitContact(pContact pcon)
{
pcon->sz = 0;
pcon->data = malloc(DEFAULT_SZ*sizeof(PeoInfo));//開闢空間
if (pcon->data == NULL)
{
perror("malloc");//報錯
exit(EXIT_FAILURE);
}
memset(pcon->data, 0, DEFAULT_SZ*sizeof(PeoInfo));//初始化
pcon->capacity = DEFAULT_SZ;
}
void CheckCapacity(pContact pcon)
{
if (pcon->sz == pcon->capacity)
{
PeoInfo*ptr = realloc(pcon->data, (pcon->capacity + DEFAULT_INC)*sizeof(PeoInfo));
if (ptr == NULL)
{
perror("realloc");
exit(EXIT_FAILURE);
}
else
{
pcon->data = ptr;
}
printf("增容成功\n");
pcon->capacity += DEFAULT_INC;
}
}
void AddContact(pContact pcon)
{
assert(pcon);
CheckCapacity(pcon);
printf("請輸入名字:>");
scanf("%s", pcon->data[pcon->sz].name);
printf("請輸入年齡:>");
scanf("%d", &(pcon->data[pcon->sz].age));
printf("請輸入性別:>");
scanf("%s", pcon->data[pcon->sz].sex);
printf("請輸入地址:>");
scanf("%s", pcon->data[pcon->sz].addr);
printf("請輸入電話:>");
scanf("%s", pcon->data[pcon->sz].tele);
printf("添加成功\n");
pcon->sz++;
}
void DelContact(pContact pcon)
{
char name[NAME_MAX];
printf("請輸入你要刪除的人的姓名:>");
scanf("%s", name);
int p = 0;//利用p接收FindEntry返回的地址
p = FindEntry(pcon, name);
if (p != -1)
{
int j = 0;
for (j = p; j < pcon->sz; j++)
{
pcon->data[j] = pcon->data[j + 1];//利用後面一個覆蓋前一個,從而達到刪除的效果
}
pcon->sz--;
printf("刪除成功\n");
}
else
{
printf("沒有此人\n");
return;
}
}
static int FindEntry(pContact pcon, char name[])//查找函數入口
{ // static 只能在當前源文件查看,
//把外部鏈接屬性改爲內部鏈接屬性
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(pcon->data[i].name, name) == 0)//字符串比較
{
return i;//找到了,返回下標
}
}
return -1;//沒找到返回-1
}
void SearchContact(pContact pcon)
{
char name[NAME_MAX];
printf("請輸入你要查找的姓名:>");
scanf("%s", name);//pcon->data[pcon->sz].name
int p = FindEntry(pcon, name);
if (p == -1)
{
printf("沒有此人\n");
return;
}
else
{
printf("%10s\t%4s\t%5s\t%20s\t%15s\t\n",
"name", "age", "sex", "addr", "tele" );
printf("%10s\t%4d\t%5s\t%20s\t%15s\t\n",
pcon->data[p].name, //p爲查找返回的下標
pcon->data[p].age,
pcon->data[p].sex,
pcon->data[p].addr,
pcon->data[p].tele);
}
}
void ModifyContact(pContact pcon)
{
char name[NAME_MAX];
printf("請輸入要修改的人的姓名:>");
scanf("%s", name);
int p = 0;//利用pos接收FindEntry返回的地址
p = FindEntry(pcon, name);
if (p != -1)
{
printf("請輸入修改後的姓名: ");
scanf("%s", pcon->data[pcon->sz].name);
printf("請輸入修改後的性別: ");
scanf("%s", pcon->data[pcon->sz].sex);
printf("請輸入修改後的年齡: ");
scanf("%d", &pcon->data[pcon->sz].age);
printf("請輸入修改後的電話: ");
scanf("%s", pcon->data[pcon->sz].tele);
printf("請輸入修改後的地址: ");
scanf("%s", pcon->data[pcon->sz].addr);
printf("修改完畢\n");
}
else
{
printf("沒有此人\n");
}
}
void ShowContact(const pContact pcon)
{
int i = 0;
printf("%10s\t%4s\t%5s\t%20s\t%15s\t\n",
"name", "age", "sex", "addr", "tele");
for (i = 0; i < pcon->sz; i++)
{
printf("%10s\t%4d\t%5s\t%20s\t%15s\t\n",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].addr,
pcon->data[i].tele);
}
}
void SortContact(pContact pcon)
{
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(pcon->data[i].name, pcon->data[i + 1].name) > 0)
{
struct PeoInfo tem;
tem = pcon->data[i];
pcon->data[i] = pcon->data[i + 1];
pcon->data[i + 1] = tem;
}
}
printf("排序完成\n");
}
void ClearContact(pContact pcon)
{
pcon->sz = 0;
}
void DestroyCapacity(pContact pcon)
{
free(pcon->data);
pcon->data = NULL;
pcon->capacity = 0;
pcon->sz = 0;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
#include<stdio.h>
enum //枚舉
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
CLEAR,
};
menu()
{
printf("******************************\n");
printf("**** 1.add 2.del ****\n");
printf("**** 3.search 4.modify ****\n");
printf("**** 5.show 6.sort ****\n");//排序
printf("**** 7.clear 0.exit ****\n");
printf("******************************\n");
}
void test()
{
int input = 0;
Contact my_con;
InitContact(&my_con);//初始化
do
{
menu();
printf("請輸入您的選項:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&my_con);
break;
case DEL:
DelContact(&my_con);
break;
case SEARCH:
SearchContact(&my_con);
break;
case MODIFY:
ModifyContact(&my_con);
break;
case SHOW:
ShowContact(&my_con);
break;
case SORT:
SortContact(&my_con);
break;
case CLEAR:
ClearContact(&my_con);
break;
case EXIT:
DestroyCapacity(&my_con);
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}