head.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TEL 20
#define MAX_ADDR 20
#define START_SIZE 2
#define INC_SIZE 10
typedef struct Info
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tel[MAX_TEL];
char addr[MAX_ADDR];
}Info;
typedef struct Contact
{
Info *con;
int count;
int capacity;
}Con, *pCon;
void readFile(pCon pcon);
void writeFile(pCon pcon);
void menu();
void init(pCon pcon);
int checkCapacity(pCon pcon);
void add(pCon pcon);
int find(pCon pcon);
void del(pCon pcon);
void search(pCon pcon);
void alter(pCon pcon);
void show(pCon pcon);
void clear(pCon pcon);
void sort(pCon pcon);
contact.h
#pragma once
#include "head.h"
void readFile(pCon pcon)
{
FILE *pFile;
pFile = fopen("contact.txt", "rt");
if (pFile == NULL)
{
return;
}
else
{
fscanf(pFile,"%d %d ",&pcon->count,&pcon->capacity);
pcon->con = (Info *)malloc(sizeof(Info)*pcon->capacity);
if (pcon->con == NULL)
{
perror("Error:");
return;
}
int pos = 0;
for (pos = 0; pos < pcon->count; pos++)
{
fscanf(pFile, "%s %s %d %s %s ", pcon->con[pos].name,
pcon->con[pos].sex, &(pcon->con[pos].age), pcon->con[pos].tel, pcon->con[pos].addr);
}
}
fclose(pFile);
}
void writeFile(pCon pcon)
{
FILE *pFile;
pFile = fopen("contact.txt","wt");
fprintf(pFile,"%d %d ",pcon->count,pcon->capacity);
int pos = 0;
for (pos = 0; pos < pcon->count;pos++)
{
fprintf(pFile, "%s %s %d %s %s ", pcon->con[pos].name,
pcon->con[pos].sex, pcon->con[pos].age, pcon->con[pos].tel, pcon->con[pos].addr);
}
fclose(pFile);
printf("已保存!\n");
system("pause");
}
void menu()
{
printf("##################################\n");
printf("##### 1.增加联系人信息 #####\n");
printf("##### 2.删除联系人信息 #####\n");
printf("##### 3.查找指定联系人信息 #####\n");
printf("##### 4.修改指定联系人信息 #####\n");
printf("##### 5.显示所有联系人信息 #####\n");
printf("##### 6.清空所有联系人 #####\n");
printf("##### 7.以名字排序所有联系人 #####\n");
printf("##### 0.保存退出! #####\n");
printf("##################################\n");
}
void init(pCon pcon)
{
pcon->count = 0;
pcon->con = (Info *)malloc(START_SIZE * sizeof(Info));
memset(pcon->con,0,START_SIZE * sizeof(pcon->con));
pcon->capacity = START_SIZE;
}
int checkCapacity(pCon pcon)
{
if (pcon->count == pcon->capacity)
{
Info *p = NULL;
p = (Info *)realloc(pcon->con, (pcon->capacity + INC_SIZE) * sizeof(Info));
if (p != NULL)
{
pcon->con = p;
pcon->capacity += INC_SIZE;
return 1;
}
else
{
return 0;
}
free(p);
}
return 1;
}
void add(pCon pcon)
{
if (checkCapacity(pcon) == 0)
{
printf("fail!");
}
printf("请输入姓名:");
scanf("%s",pcon->con[pcon->count].name);
printf("\n请输入性别:");
scanf("%s", pcon->con[pcon->count].sex);
printf("\n请输入年龄:");
scanf("%d",&(pcon->con[pcon->count].age));
printf("\n请输入电话:");
scanf("%s", pcon->con[pcon->count].tel);
printf("\n请输入地址:");
scanf("%s", pcon->con[pcon->count].addr);
pcon->count++;
printf("添加成功!\n");
}
int find(pCon pcon)
{
char name[MAX_NAME];
int i = 0;
printf("请输入姓名:");
scanf("%s",&name);
for (i = 0; i < pcon->count; i++)
{
if (strcmp(name,pcon->con[i].name) == 0)
{
return i;
}
}
return -1;
}
void del(pCon pcon)
{
if (pcon->count == 0)
{
printf("通讯录为空!\n");
return;
}
int pos = 0;
int i = 0;
pos = find(pcon);
if (pos == -1)
{
printf("未找到!\n");
}
else
{
for ( i = pos; i < pcon->count-1; i++)
{
pcon->con[i] = pcon->con[i + 1];
}
pcon->count--;
printf("删除成功!\n");
}
}
void search(pCon pcon)
{
if (pcon->count == 0)
{
printf("通讯录为空!\n");
return;
}
int pos = 0;
int i = 0;
pos = find(pcon);
if (pos == -1)
{
printf("未找到!\n");
}
else
{
printf("姓名:%s ",pcon->con[pos].name);
printf("性别:%s ", pcon->con[pos].sex);
printf("年龄:%d ", pcon->con[pos].age);
printf("电话:%s ", pcon->con[pos].tel);
printf("地址:%s\n", pcon->con[pos].addr);
}
}
void alter(pCon pcon)
{
if (pcon->count == 0)
{
printf("通讯录为空!\n");
return;
}
int pos = 0;
int i = 0;
pos = find(pcon);
if (pos == -1)
{
printf("未找到!\n");
}
else
{
printf("请输入姓名:");
scanf("%s", &(pcon->con[pos].name));
printf("\n请输入性别:");
scanf("%s", &(pcon->con[pos].sex));
printf("\n请输入年龄:");
scanf("%d", &(pcon->con[pos].age));
printf("\n请输入电话:");
scanf("%s", &(pcon->con[pos].tel));
printf("\n请输入地址:");
scanf("%s", &(pcon->con[pos].addr));
printf("修改成功!\n");
}
}
void show(pCon pcon)
{
if (pcon->count == 0)
{
printf("通讯录为空!\n");
return;
}
int pos = 0;
for (pos = 0; pos < pcon->count; pos++)
{
printf("姓名:%s", pcon->con[pos].name);
printf("性别:%s", pcon->con[pos].sex);
printf("年龄:%d", pcon->con[pos].age);
printf("电话:%s", pcon->con[pos].tel);
printf("地址:%s\n", pcon->con[pos].addr);
}
}
void clear(pCon pcon)
{
if (pcon->con != NULL)
{
free(pcon->con);
pcon->con = NULL;
pcon->capacity = 0;
pcon->count = 0;
}
printf("清除成功!\n");
}
void sort(pCon pcon)
{
if (pcon->count == 0)
{
printf("通讯录为空!\n");
return;
}
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < pcon->count - 1; i++)
{
for (j = 0; j < pcon->count - i - 1; j++)
{
if (strcmp(pcon->con[j].name, pcon->con[j + 1].name) > 0)
{
Info temp = pcon->con[j];
pcon->con[j] = pcon->con[j + 1];
pcon->con[j + 1] = temp;
flag = 1;
}
}
if (flag == 0)
{
printf("排序完成!\n");
return;
}
}
printf("排序完成!\n");
}
Main.c
#pragma once
#include "contact.h"
enum func
{
EXIT,
ADD,
DEL,
SEARCH,
ALTER,
SHOW,
CLEAR,
SORT,
};
int main()
{
int select;
Con my_con;
init(&my_con);
readFile(&my_con);
while (1)
{
menu();
printf("\n请选择:");
scanf("%d", &select);
switch (select)
{
case EXIT:
{
writeFile(&my_con);
exit(0);
}
break;
case ADD:
add(&my_con);
break;
case DEL:
del(&my_con);
break;
case SEARCH:
search(&my_con);
break;
case ALTER:
alter(&my_con);
break;
case SHOW:
show(&my_con);
break;
case CLEAR:
clear(&my_con);
break;
case SORT:
sort(&my_con);
break;
default:
printf("输入错误,请重新输入!");
break;
}
}
system("pause");
return 0;
}