1、修改了主界面。
2、将int ID改变成char ID[20],便于存储进文件。
2、添加了文件存储功能,再次运行./a.out可以读出上次操作存入文件内的联系人。
/**************************************
电子通讯录:
内容:序号,姓名,电话,住址。
功能:添加好友、删除好友、清空联系人、好友排序、搜索好友、显示所有联系人。
添加好友:如果重名,可选择覆盖或新建。
好友排序:可选择按姓氏正序排或逆序排。
删除好友:若遇到重名好友,则按序号删除。
****************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
typedef structPeople{
char ID[10]; //序号
char name[10]; //姓名
char phone[20]; //号码
char add[20]; //住址
struct People *next;
}List;
/********主界面**********/
int menu()
{
int choice;
printf("\n");
printf("0----添加好友\n");
printf("1----显示好友列表\n");
printf("2----搜索好友\n");
printf("3----删除好友\n");
printf("4----好友排序\n");
printf("5----清空联系人\n");
printf("6----保存联系人至文件\n");
printf("7----读取文件中联系人\n");
printf("8----退出\n");
scanf("%d",&choice);
return choice;
}
//添加联系人
void Add(List*people)
{
List *p,*r;
r = people;
p = (List *)malloc(sizeof(List));
printf("请输入序号:\n");
scanf("%s",p->ID);
printf("请输入姓名:\n");
scanf("%s",p->name);
printf("请输入电话:\n");
scanf("%s",p->phone);
printf("请输入地址:\n");
scanf("%s",p->add);
while(r->next != NULL)
{
r = r->next;
}
r->next = p;
p->next = NULL;
printf("\n添加成功!\n");
}
//显示
void Display(List*people)
{
List *p;
p = people->next;
printf("好友列表:\n");
printf("序号\t\t姓名\t\t电话\t\t住址\n");
while(p != NULL)
{
printf("%s\t\t",p->ID);
printf("%s\t\t",p->name);
printf("%s\t\t",p->phone);
printf("%s\t\t",p->add);
p = p->next;
printf("\n");
}
}
//搜索好友
void Search(List*people)
{
List *p;
char name[10]; //搜索人的姓名
p = people->next;
if(p != NULL)
{
printf("请输入要搜索人的姓名:\n");
scanf("%s",name);
while(p != NULL)
{
if(strcmp(p->name,name) == 0)
{
printf("%s ",p->ID);
printf("%s ",p->name);
printf("%s ",p->phone);
printf("%s ",p->add);
printf("\n");
}
p = p->next;
}
}
else
{
printf("联系人为空,无法搜索!\n");
}
}
//删除联系人
void Delete(List*people)
{
char name[10];
List *p,*r;
int count = 0;
char ID[10];
p = people->next;
if(p != NULL)
{
printf("\n请输入要删除人的姓名:\n");
scanf("%s",name);
while(p != NULL)
{
if(strcmp(p->name,name) == 0)
{
count++;
}
p = p->next;
}
if(count == 1)
{
p = people;
r = people->next;
while(r != NULL)
{
if(strcmp(r->name,name) ==0)
{
p->next = r->next;
break;
}
p = p->next;
r = r->next;
}
}
if(count > 1)
{
r = people->next;
while(r != NULL)
{
if(strcmp(r->name,name) ==0)
{
printf("%s %s %s%s\n",r->ID,r->name,r->phone,r->add);
}
r = r->next;
}
printf("请选择序号删除;\n");
scanf("%s",ID);
p = people;
r = people->next;
while(r != NULL)
{
if(strcmp(r->ID,ID) == 0)
{
p->next = r->next;
r = p->next;
}
else
{
p = p->next;
r = r->next;
}
}
}
printf("删除成功!\n");
}
else
{
printf("联系人为空,无法删除!\n");
}
}
//排序
void Sort(List*people)
{
List *pre,*p,*tail,*temp;
tail = NULL;
p = people->next;
if(p != NULL)
{
while(tail != people->next->next)
{
pre = people;
p = people->next;
while(p->next != tail)
{
if(strcmp(p->name,p->next->name) == 1)
{
pre->next = p->next;
p->next =pre->next->next;
pre->next->next = p;
p = pre->next;
}
pre = pre->next;
p = p->next;
}
tail = p;
}
printf("排序成功!\n");
}
else
{
printf("联系人为空,无法排序!\n");
}
}
//清空联系人
void Clear(List*people)
{
List *p,*q;
p = people->next;
if(p != NULL)
{
while(p != NULL)
{
q = p->next;
free(p);
p = q;
}
people->next = NULL;
printf("清空成功!\n");
}
else
{
printf("联系人为空!\n");
}
}
//将联系人保存至文件
void FileSave(List*people)
{
int fd;
List *p;
int len;
p = people->next;
fd = open("ContactList.c",O_RDWR| O_CREAT | O_TRUNC, 0666); //打开一个文件,没有则创建
if(fd < 0) //打开失败
{
printf("联系人保存至文件失败!\n");
exit(1);
}
while(p != NULL)
{
len = strlen(p->ID); //写ID
write(fd, p->ID, len);
write(fd, "\n", 1); //写换行
len = strlen(p->name); //写名字
write(fd, p->name, len);
write(fd, "\n", 1); //写换行
len = strlen(p->phone); //写号码
write(fd, p->phone, len);
write(fd, "\n", 1); //写换行
len = strlen(p->add); //写地址
write(fd, p->add, len);
write(fd, "\n", 1); //写换行
p = p->next;
}
printf("存储成功!\n");
close(fd);
}
//将文件中的数据读出来,并放到一个链表中
void FileRead(List*people, FILE *F)
{
List *q,*r; //用来创建新的节点,存放读取的信息
char s[20];
char *p;
int len;
r = people;
F =fopen("ContactList.c","r");
p = fgets(s, 20, F);
if(p == NULL)
{
printf("读取失败!\n");
exit(1);
}
while(p != NULL)
{
q = (List *)malloc(sizeof(List));
r->next = q;
q->next = NULL;
r = r->next;
len = strlen(s);
s[len - 1] = '\0';
strcpy(q->ID,s);
fgets(s, 20, F);
len = strlen(s);
s[len - 1] = '\0';
strcpy(q->name,s);
fgets(s, 20, F);
len = strlen(s);
s[len - 1] = '\0';
strcpy(q->phone,s);
fgets(s, 20, F);
len = strlen(s);
s[len - 1] = '\0';
strcpy(q->add,s);
p = fgets(s, 20, F);
}
printf("读取成功!\n");
fclose(F);
}
//主函数
int main()
{
int choice;
List people;
FILE *F;
people.next = NULL;
while(1)
{
choice = menu();
switch(choice)
{
case 0: Add(&people);
break;
case 1: Display(&people);
break;
case 2: Search(&people);
break;
case 3: Delete(&people);
break;
case 4: Sort(&people);
break;
case 5: Clear(&people);
break;
case 6: FileSave(&people);
break;
case 7: FileRead(&people,F);
break;
case 8: exit(1);
default: printf("\n无效指令,请重新输入!\n");
break;
}
}
return 0;
}