之前写过一个开辟固定大小空间的通讯录,在此基础上进行修改。
call.h
#ifndef __CALL_H__
#define __CALL_H__
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable : 4996)
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include <errno.h>
typedef struct callman
{
char name[20];
char sex[10];
int age;
int tel[12];
char addr[50];
}callman;
//typedef struct status
//{
// callman num[1000];
// int count;
//}status;
typedef struct status
{
//callman num[1000];
callman* num;
int count;//
int v;//rongling
}status;
void myinit(status* p);//chushihua
void myadd(status* p);//tianjia
void mydele(status* p);//shanchu
void myfind(status* p);//chauzhao
void myrevise(status* p);//xiugai
void mydisplay(status* p);//xianshi
void myempty(status* p);//qingkong
void mysort(status* p);//paixu
void Free_data(status* p);//释放内存
void SaveData(status* p);//把数据保存到文件内
void DownLoad(status* p);//从文件中读取数据
#endif // !__CALL_H__
call.c
#include "call.h"
int Find(status* p, char* pname)
{
int i = 0;
for (i = 0; i < (p->count); i++)
{
if (strcmp(p->num[i].name, pname) == 0)
return i;
}
return -1;
}
void menu1()
{
printf("*******************\n");
printf("1.name 2.sex\n");
printf("3.age 4.tele\n");
printf("5.addr 0.return\n");
printf("*******************\n");
}
void myinit(status* p)//chushihua
{
//int count = sizeof(p->num);
//p->count = 0;
//memset(p->num, 0, count);
p->count = 0;
p->v = 5;
p->num = (callman*)malloc(5 * sizeof(callman));
if (p->num == NULL)
{
printf("out of menory");
exit(1);
}
//p->count = 0;
else
{
DownLoad(p);
}
//memset(p->num, 0, count);
}
//void myadd(status* p)//tianjia
//{
// printf("xinming:\n");
// scanf("%s", p->num[p->count].name);
// printf("xinbie:\n");
// scanf("%s", p->num[p->count].sex);
// printf("nianling:\n");
// scanf("%d", &(p->num[p->count].age));
// printf("telenum:\n");
// scanf("%s", p->num[p->count].tel);
// printf("address:\n");
// scanf("%s", p->num[p->count].addr);
// if (p->count > 1000)
// {
// printf("shangxian\n");
// }
// else
// {
// printf("success\n");
// p->count++;
// }
//
//}
void myadd(status* p)//tianjia
{
if (p->count == p->v)
{
callman* tmp = (callman*)realloc(p->num, sizeof(callman) * (p->v + 5));
if (tmp == NULL)
printf("%s", strerror(errno));
else
p->num = tmp;
p->v += 5;
}
printf("xinming:\n");
scanf("%s", p->num[p->count].name);
printf("xinbie:\n");
scanf("%s", p->num[p->count].sex);
printf("nianling:\n");
scanf("%d", &(p->num[p->count].age));
printf("telenum:\n");
scanf("%s", p->num[p->count].tel);
printf("address:\n");
scanf("%s", p->num[p->count].addr);
p->count++;
}
void mydele(status* p)//shanchu
{
char name[20] = { 0 };
int result = 0;
int n = 0;
int i = 0;
printf("dele name\n");
scanf("%s", name);
result = Find(p, name);
if (result != -1)
{
printf("shifousanchu?\n");
printf("yes.1 no.0\n");
scanf("%d", &n);
if (1 == n)
{
for (i = result; i < (p->count) - 1; i++)
{
p->num[i] = p->num[i + 1];
}
p->count--;
printf("success\n");
}
else
{
printf("fail\n");
}
}
else
{
printf("bucinzai\n");
}
}
void myfind(status* p)//chauzhao
{
char name[20] = { 0 };
int result = 0;
printf("find name:\n");
scanf("%s", name);
result = Find(p, name);
if (result != -1)
{
printf("name:%s\n", p->num[result].name);
printf("sex:%s\n", p->num[result].sex);
printf("age:%d\n", p->num[result].age);
printf("tel:%s\n", p->num[result].tel);
printf("addr:%s\n", p->num[result].addr);
}
else
{
printf("bucinzai\n");
}
}
void myrevise(status* p)//xiugai
{
char name[20] = { 0 };
int result = 0;
printf("input xiugainame\n");
scanf("%s", name);
result = Find(p, name);
if (result != -1)
{
printf("name:%s\n", p->num[result].name);
printf("sex:%s\n", p->num[result].sex);
printf("age:%d\n", p->num[result].age);
printf("tel:%s\n", p->num[result].tel);
printf("addr:%s\n", p->num[result].addr);
int i = 0;
do {
menu1();
printf("shuruxiugaixiang:\n");
scanf("%d", &i);
switch (i)
{
case 1:
printf("name:");
scanf("%s", p->num[result].name);
break;
case 2:
printf("sex:");
scanf("%s", p->num[result].sex);
break;
case 3:
printf("age:");
scanf("%d", p->num[result].age);
break;
case 4:
printf("telenum:");
scanf("%s", p->num[result].tel);
break;
case 5:
printf("address:");
scanf("%s", p->num[result].addr);
break;
case 0:
break;
default:
printf("error");
break;
}
} while (i);
}
else
{
printf("bucunzai!\n");
}
}
void mydisplay(status* p)//xianshi
{
int i = 0;
printf("shuchuxinxi\n");
printf("%10s%7s%6s%8s%10s\n", "name", "sex", "age", "tele", "addr");
for (i = 0; i < (p->count); i++)
{
printf("%11s", p->num[i].name);
printf("%5s", p->num[i].sex);
printf("%5d", p->num[i].age);
printf("%10s", p->num[i].tel);
printf("%12s", p->num[i].addr);
printf("\n");
}
}
void myempty(status* p)//qingkong
{
p->count = 0;
}
void mysort(status* p)//paixu
{
int i = 0;
int j = 0;
for (i = 0; i < p->count - 1; i++)
{
for (j = 0; j < p->count - 1 - i; j++)
{
if (strcmp(p->num[j].name, p->num[j + 1].name) > 0)
{
callman tmp;
tmp = p->num[j];
p->num[j] = p->num[j + 1];
p->num[j + 1] = tmp;
}
}
}
}
void Free_data(status* p)
{
free(p->num);
p->v = 0;
p->count = 0;
}
void SaveData(status* p)//保存数据到文件流 ,SaveData 的调用放在退出程序之前
{
int i = 0;
FILE* pf = fopen("tongxunlu.txt", "w");
if (pf == NULL)
{
perror("open file for write");
exit(1);
}
for (i = 0; i < p->count; i++)
{
fwrite(&(p->num[i]), sizeof(callman), 1, pf);
}
fclose(pf);
}
void DownLoad(status* p)//从文件里读取数据
{
int i = 0;
callman tmp = { 0 };
FILE* pf = fopen("tongxunlu.txt", "r");
if (pf == NULL)
{
perror("open file for read");
exit(1);
}
while (fread(&tmp, sizeof(callman), 1, pf))
{
//check(p);
if (p->count == p->v)
{
callman* tmp = (callman*)realloc(p->num, sizeof(callman) * (p->v + 5));
if (tmp == NULL)
printf("%s", strerror(errno));
else
p->num = tmp;
p->v += 5;
}
p->num[i] = tmp;
i++;
p->count++;//每读入一个数据,当前数据数目count就增加一个;
}
}
test.c
#include "call.h"
status p;
void memu()
{
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 test()
{
int i = 0;
do
{
memu();
printf("shuru:");
scanf("%d", &i);
switch (i)
{
case 1:myadd(&p);
break;
case 2:mydele(&p);
break;
case 3:myfind(&p);
break;
case 4:myrevise(&p);
break;
case 5:mydisplay(&p);
break;
case 6:myempty(&p);
break;
case 7:mysort(&p);
break;
case 0:
SaveData(&p);//把数据保存到文件内
Free_data(&p);
exit(1);
break;
default:
printf("error\n");
break;
}
} while (i);
}
int main()
{
myinit(&p);
test();
return 0;
}
end~