这一个通讯录系统是将之前那个做了一点修改,里面添加了文件存储功能
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
typedef struct Person//人员信息
{
int age;
char name[32];
char sex[5];
char phone[12];
char address[32];
}person;
typedef struct NODE//节点
{
person ren;
struct NODE *next;
}node;
int menu()
{
int choose = 0;
printf ("---------------------------通讯录系统-------------------------\n");
printf ("--------- 1、添加联系人 2、查找联系人 --------\n");
printf ("--------- 3、修改联系人信息 4、删除联系人 --------\n");
printf ("--------- 5、清空联系人 6、保存信息 --------\n");
printf ("--------- 7、查看联系人信息 0、退出 --------\n");
printf ("--------------------------------------------------------------\n");
printf ("请选择>");
scanf ("%d", &choose);
return choose;
}
void insert(node **phead)
{
node *p = (node *)malloc (sizeof (node) );
printf ("name>");
scanf ("%s", p->ren.name);
printf ("sex>");
scanf ("%s", p->ren.sex);
printf ("age>");
scanf ("%d", &(p->ren.age));
printf ("phone>");
scanf ("%s", p->ren.phone);
printf ("address>");
scanf ("%s", p->ren.address);
p->next = *phead;
*phead = p;
}
void show (node *phead)
{
assert (phead);
printf ("name\tsex\tage\tphone\t\taddress\n");
while (phead != NULL)
{
printf ("%s\t%s\t%d\t%s\t%s\n", phead->ren.name, phead->ren.sex, phead->ren.age, phead->ren.phone, phead->ren.address);
phead = phead->next;
}
}
void find (node *phead)
{
char name[32] = {0};
assert (phead);
printf ("请输入你要查找的人的姓名>");
scanf ("%s", name);
while (phead != NULL)
{
if (strcmp (name, phead->ren.name) == 0)
{
printf ("name\tsex\tage\tphone\t\taddress\n");
printf ("%s\t%s\t%d\t%s\t%s\n", phead->ren.name, phead->ren.sex, phead->ren.age, phead->ren.phone, phead->ren.address);
break;
}
phead = phead->next;
}
if(phead == NULL)
{
printf ("找不到此人!!!\n");
}
}
int modify_menu()
{
int choose = 0;
printf ("---------------------------------------------\n");
printf ("----1、姓名 2、性别 3、年龄 -----\n");
printf ("----4、手机号 5、地址 0、取消 -----\n");
printf ("---------------------------------------------\n");
scanf ("%d", &choose);
return choose;
}
void modify(node **phead)
{
char name[32] = {0};
int ret = 1;//选择要修改的项
node *p = *phead;
assert((*phead) != NULL);
printf ("请输入你要修改的联系人的姓名>");
scanf ("%s", name);
while (p != NULL && ret)
{
if (strcmp (name, (p)->ren.name) == 0)
{
printf ("请选择你要修给的信息>\n");
ret = modify_menu();
switch (ret)
{
case 0:
break;
case 1://姓名
printf ("new name>");
scanf ("%s", p->ren.name);
break;
case 2://性别
printf ("new sex>");
scanf ("%s", p->ren.sex);
break;
case 3://年龄
printf ("new age>");
scanf ("%d", &p->ren.age);
break;
case 4://手机号
printf ("new phone>");
scanf ("%s", p->ren.phone);
break;
case 5://地址
printf ("new address>");
scanf ("%s", p->ren.address);
break;
default :
printf ("输入错误!!!\n");
break;
}
break;
}
p = p->next;
}
if (p == NULL)
{
printf ("没有这个人!!!\n");
}
show (*phead);
}
void delete_person (node** phead)
{
char arr[32] = {0};
node *prede = NULL;//要删除的节点的前一个节点
node *de = *phead;//要删除的节点
printf ("请输入你要删除的联系人姓名:");
scanf ("%s", arr);
while (de != NULL)
{
if (strcmp (arr, (*phead)->ren.name) == 0)//要删除的节点是第一个结点
{
(*phead) = (*phead) ->next;
free (de);
de = NULL;
break;
}
else if (strcmp (arr, de->ren.name) == 0)//要删除的节点不是第一个节点
{
prede->next = de->next;
free (de);
de = NULL;
break;
}
prede = de;
de = de->next;
}
if (de == NULL)
{
printf ("没有找到此人, 操作失败!!!\n");
}
show (*phead);
}
void empty(node **phead)
{
node *cur = *phead;
node *pre = NULL;
while (cur != NULL)
{
pre = cur;
cur = cur->next;
free(pre);
pre = NULL;
}
if (cur == NULL)
{
printf ("清空成功!!!\n");
}
}
void save (node *phead)
{
FILE *fp;
node *cur = phead;
if ((fp = fopen ("1.txt", "w")) == NULL)
{
printf ("打开文件失败!!");
return ;
}
while (cur != NULL)
{
fwrite(&(cur->ren), sizeof (cur->ren), 1, fp);//把信息存入文件(二进制形式)
cur = cur->next;
}
if (cur == NULL)
{
printf ("保存成功!!!\n");
}
fclose (fp);
}
void read_from_file(node **phead)//从文件中读取联系人信息
{
person ren;
node *cur = NULL;
FILE *fp ;
if ((fp = fopen("1.txt", "r")) == NULL)
{
printf ("文件打开失败!!!\n");
return ;
}
while (1)
{
if (fread(&ren, sizeof (ren), 1, fp) != 1)
{
break;
}
cur = (node *)(malloc (sizeof (node)));
cur->ren = ren;
cur ->next = NULL;
cur->next = *phead;
*phead = cur;
}
show (*phead);
fclose (fp);//关闭文件
}
int main()
{
node *phead = NULL;
int ret = 0;
printf ("=================================================\n");
printf ("\t\t现有联系人信息\n");
printf ("=================================================\n");
read_from_file(&phead);
printf ("=================================================\n\n\n");
do
{
ret = menu();
switch(ret)
{
case 0:
/*quit(phead);*/
break;
case 1:
insert(&phead);
printf ("\n");
break;
case 2:
find (phead);
printf ("\n");
break;
case 3:
modify(&phead);
printf ("\n");
break;
case 4:
delete_person (&phead);
printf ("\n");
break;
case 5:empty(&phead);
break;
case 6:save(phead);
break;
case 7:show (phead);
break;
default:
break;
}
}while ( ret );
system ("pause");
return 0;
}