C语言实现,最终稿:
/*链表法实现C语言通讯录。*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define LEN sizeof(struct information)
typedef struct information
{
char name[20];
char id[20];
char phone[20];
char home[20];
struct information *next;
}INFO;
/*face()用来显示通讯录的基本功能选择。*/
void face()
{
printf("*****************************\n");
printf("请输入你需要进行的操作号码:\n");
printf("\t1:显示通讯录已有信息。\n");
printf("\t2:添加通讯录人员。\n");
printf("\t3:删除通讯录人员。\n");
printf("\t4:修改通讯录人员信息。\n");
printf("\t5:查找通讯录人员信息。\n");
printf("\t6:保存通讯录至record.txt。\n");
printf("\t7:显示文件内保存的通讯录。\n");
printf("\t8:删除文件内保存的通讯录。\n");
printf("\t9:清屏。\n");
printf("\t0:退出通讯录。\n");
printf("*****************************\n");
}
/*print()用来显示通讯录已有信息。*/
void print(INFO *head)
{
INFO *p;
p = head;
system("clear");
if(head!=NULL)
{
printf("已有成员如下:\n");
do
{
printf("姓名:%s\n",p->name);
printf("ID:%s\n",p->id);
printf("电话号码:%s\n",p->phone);
printf("家庭住址:%s\n\n",p->home);
p=p->next;
}while(p!=NULL);
}
else
{
printf("对不起!!没有任何联系人记录!!\n\n");
printf("****************************\n");
}
}
/*add()添加通讯录信息,将信息存入p0节点*/
INFO *add(INFO *head)
{
INFO *p0 = NULL, *p1, *p2;
p0 = (INFO *)malloc(LEN);
p1 = head;
p2 = head;
printf("请输入你需要添加的成员信息:\n");
printf("****************************\n");
printf("姓名:");
scanf("%s",p0->name);
printf("ID:");
scanf("%s",p0->id);
printf("电话号码:");
scanf("%s",p0->phone);
printf("家庭住址:");
scanf("%s",p0->home);
/*再将p0节点按姓名顺序存入通讯录。*/
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while((strcmp(p0->name,p1->name)>0)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if((strcmp(p0->name,p1->name))<=0)
{
if(head==p1)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
printf("恭喜你!!成功添加了联系人信息!!");
printf("\n************************************************************\n");
printf("\n\n");
}
return head;
/*
//在通讯录头部插入
if(head == NULL)
{
head = p0;
head->next = NULL;
}
else
{
p0->next = head->next;
head->next = p0;
}
return head;
//在通讯录尾部插入
if(head == NULL)
{
head = p0;
head->next = NULL;
}
else
{
while(p1->next!=NULL)
{
p2 = p1;
p1 = p1->next;
}
p1->next = p0;
p0->next = NULL;
}
return head;
*/
}
/*delete()删除通讯录人员信息。*/
INFO *delete(INFO *head)
{
INFO *p1, *p2;
char name[10];
p1 = head;
p2 = head;
printf("请以姓名为关键字,输入需要删除的成员信息:\n");
printf("****************************\n");
scanf("%s",name);
if (head==NULL)
{
printf("很抱歉!没有任何联系人纪录!\n");
printf("\n*******************************************************\n");
return(head);
}
while(p1!=NULL)
{
if(strcmp(p1->name,name)==0)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
free(p1);
printf("删除记录成功!\n");
return(head);
}
p2=p1;
p1=p1->next;
}
printf("对不起!没有要删除的联系人纪录!\n");
return head;
}
/*rev()修改通讯录人员信息。*/
void revise(INFO *head)
{
INFO *p1, *p2;
char name[10];
p1 = head;
p2 = head;
printf("请以姓名为关键字,输入需要修改的成员信息:\n");
printf("****************************\n");
scanf("%s",name);
while(p1!=NULL)
{
if(strcmp(p1->name,name)==0)
{
printf("请根据提示修改成员信息:\n");
printf("将姓名%s修改为:",p1->name);
scanf("%s",p1->name);
printf("将ID%s修改为:",p1->id);
scanf("%s",p1->id);
printf("将电话号码%s修改为:",p1->phone);
scanf("%s",p1->phone);
printf("将家庭住址%s修改为:",p1->home);
scanf("%s",p1->home);
printf("修改成功。\n");
break;
}
p2=p1;
p1=p1->next;
}
if(p1==NULL)
printf("对不起!!没有该联系人的纪录!!\n");
}
/*search()查找通讯录人员信息。*/
void search(INFO *head)
{
INFO *p1, *p2;
char name[10];
p1 = head;
p2 = head;
printf("请以姓名为关键字,输入需要查找的成员信息:\n");
printf("****************************\n");
scanf("%s",name);
while(p1!=NULL)
{
if(strcmp(p1->name,name)==0)
{
printf("查找到如下信息:\n");
printf("姓名:%s\n",p1->name);
printf("ID:%s\n",p1->id);
printf("电话号码:%s\n",p1->phone);
printf("地址:%s\n",p1->home);
break;
}
p2=p1;
p1=p1->next;
}
if(p1==NULL)
printf("对不起!!没有该联系人的纪录!!\n");
}
/*save()将本次运行产生的通讯录保存到文件内。*/
INFO *save(INFO *head)
{
INFO *p;
FILE *fp;
p = head;
fp = fopen("record.txt","a+");
if(NULL == fp)
{
printf("文件打开失败。\n");
return head;
}
while(p!=NULL)
{
fprintf(fp, "姓名:%s\n", p->name);
fprintf(fp, "ID:%s\n", p->id);
fprintf(fp, "电话号码:%s\n", p->phone);
fprintf(fp, "家庭住址:%s\n\n", p->home);
p=p->next;
}
fprintf(fp, "****************************\n");
printf( "保存成功!\n\n");
fclose(fp);
return head;
}
/*load()函数打印文件内保存的信息。*/
INFO *load(INFO *head)
{
FILE *fp;
fp = fopen("record.txt", "r");
if(NULL == fp)
{
printf("文件打开失败。\n");
return head;
}
if (feof(fp))
{
printf("文件内无通讯录。\n");
}
else
{
char a;
rewind(fp); //将光标跳回到文件开头
while(!feof(fp))
{
fscanf(fp,"%c",&a);
printf("%c", a);
}
}
fclose(fp);
return head;
}
/*reset()函数删除文件内保存的信息。*/
INFO *reset(INFO *head)
{
FILE *fp;
fp = fopen("record.txt", "w");
if(NULL == fp)
{
printf("文件打开失败。\n");
return head;
}
fclose(fp);
return head;
}
int main()
{
char choose;
INFO *head = NULL;
head = (INFO *)malloc(LEN);
system("clear");
while(1)
{
face();
scanf("%c",&choose);
switch(choose)
{
case '0':system("clear");return 0;
case '1':print(head);break;
case '2':head = add(head);break;
case '3':head = delete(head);break;
case '4':revise(head);break;
case '5':search(head);break;
case '6':save(head);break;
case '7':load(head);break;
case '8':reset(head);break;
case '9':system("clear");break;
default :printf("输入错误!\n");break;
}
}
}