📄 address_list.cpp
字号:
/*
程序说明:
本程序可输入通讯录,并按姓名的升序存放到磁盘文件中,
可显示指定的通讯录磁盘文件的所有内容,
可查找指定姓名的通讯地址,
可根据姓名删除记录,还可以一次性插入多个个记录。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
struct address
{
char name[10];
char street[40];
char city[10];
char province[10];
char zip[7];
struct address * next;
};
struct address *head;
int i;/*存放记录个数*/
int menu_select()
{
int a;
char c[20];
printf("\t请选择功能:\n\n");
printf("\t1.新建并输入通讯录\n");
printf("\t2.将刚输入的通讯录按姓名的升序按指定的文件名字存盘\n");
printf("\t3.显示指定的通讯录文件内容\n");
printf("\t4.在指定的通讯录文件中按姓名查找通讯地址\n");
printf("\t5.从指定的通讯录文件中根据姓名删除一个人的记录\n");
printf("\t6.在指定的通讯录文件中添加记录\n");
printf("\t7.退出\n");
do
{
printf("\t请输入数字选择对应的功能:");
scanf("%d",&a);
gets(c);/*接收回车等字符*/
}while(a<0||a>7);
return a;
}
void inputs(char * prompt,char *s,unsigned count)
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t太长了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
/*将结点i链接到以头结点head为最小名字的单向链表中,保持按名字的升序排列,返回头结点指针*/
struct address * put_in(struct address * i,struct address * head)
{
struct address * pbefore ,* p;
if(head==NULL)
{
head=i;
head->next=NULL;
return head;
}
p=head;
pbefore=NULL;
while(p)
{
if(strcmp(p->name,i->name)<0)
{
pbefore=p;
p=p->next;
}
else
{
if(p==head)
{
i->next=head;
head=i;
return head;
}
pbefore->next=i;
i->next=p;
return head;
}
}
pbefore->next=i;
i->next=NULL;
return head;
}
void enter()
{
struct address * info;
while(1)
{
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存已用完!\n");
return;
}
inputs("\t请输入姓名(为空时结束):",info->name,9);
if(!*info->name)
{
free(info);
printf("\n\n\t输入通讯记录结束!\n\n");
return;
}
inputs("\t请输入街名:",info->street,39);
inputs("\t请输入市(镇)名:",info->city,9);
inputs("\t请输入省名:",info->province,9);
inputs("\t请输入邮政编码:",info->zip,9);
head=put_in(info,head);
}
}
void save()/*将链表数据保存到指定磁盘文件*/
{
struct address *info;
FILE *fp;
char filename[80];
if(head)
{
inputs("\t请输入你要保存的文件的名字:",filename,79);
if(!(fp=fopen(filename,"wb")))
{
printf("\t创建保存文件失败!\n");
exit(0);
}
printf("\t正在保存文件!\n");
info=head;
while(info)
{
fwrite(info,sizeof(struct address),1,fp);
info=info->next;
}
printf("\t已成功保存了文件!\n");
fclose(fp);
}
else
printf("\t目前没有通讯信息可以保存!\n\n");
}
void display(struct address * info)
{
printf("\t%2d.姓名:%s\n",++i,info->name);
printf("\t 街道:%s\n",info->street);
printf("\t 城市:%s\n",info->city);
printf("\t 省份:%s\n",info->province);
printf("\t 邮篇:%s\n",info->zip);
printf("\n");
}
void load(char * filename)/*将指定磁盘文件调入内存*/
{
struct address *info,*pbefore=NULL;
FILE *fp;
/*先清除已有链表*/
while(head)
{
info=head;
head=head->next;
free(info);
}
if(!(fp=fopen(filename,"rb")))
{
printf("\t打开文件失败,可能是因为你指定的磁盘文件不存在!\n");
return;
}
printf("\t正在装入文件,请等待!\n");
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存已用完!\n");
return;
}
head=info;
while(!feof(fp))
{
if(fread(info,sizeof(struct address),1,fp)!=1)
break;
info->next=(struct address *)malloc(sizeof(struct address));
if(!info->next)
{
printf("\t内存已用完!\n");
return;
}
pbefore=info;
info=info->next;
}
pbefore->next=NULL;
free(info);
printf("\t已成功装入文件!\n\n");
fclose(fp);
}
void list()
{
struct address * info;
char filename[80];
inputs("\t请输入你要显示通讯录的名字:",filename,79);
load(filename);
i=0;
info=head;
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
struct address * find()
{
struct address * info;
char filename[80];
char name[20];
inputs("\t请输入待查询的通讯录文件的名字:",filename,79);
/*先清除已有链表*/
while(head)
{
info=head;
head=head->next;
free(info);
}
load(filename);
info=head;
inputs("\t请输入你想要找的姓名:",name,19);
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void search()
{
struct address * info;
if(info=find())
{
printf("\n\n\t查询结果为:\n\n");
printf("\t姓名:%s\n",info->name);
printf("\t街道:%s\n",info->street);
printf("\t城市:%s\n",info->city);
printf("\t省份:%s\n",info->province);
printf("\t邮篇:%s\n",info->zip);
printf("\n");
}
else
printf("\t没有找到这个姓名!\n\n");
}
struct address * tell(char * name)
{
struct address * info;
info=head;
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void resave(char * filename)/*将链表数据重新保存为原文件*/
{
struct address *info;
FILE *fp;
if(!(fp=fopen(filename,"wb")))
{
printf("\t重新保存为原文件失败!\n");
return;
}
if(head)
{
printf("\t正在重新保存为原文件!\n");
info=head;
while(info)
{
if(fwrite(info,sizeof(struct address),1,fp)!=1)
return;
info=info->next;
}
printf("\t成功重新保存为原文件!\n");
fclose(fp);
}
else
printf("\t已经没有了通讯录信息!\n\n");
}
void del()
{
struct address * info,*pbefore=NULL,*p;
char name[20],filename[80];
inputs("\t请输入待删除的通讯录文件的名字:",filename,79);
load(filename);
if(!head)return;
inputs("\t请输入要删除的姓名:",name,19);
info=tell(name);
if(info)
{
p=head;
while(p!=info)
{
pbefore=p;
p=p->next;
}
if(p==head)
head=head->next;
else
pbefore->next=p->next;
free(info);
resave(filename);/*重新保存文件*/
printf("\t已成功删除名字为“%s”的通讯记录!\n",name);
}
else
printf("\t没有找到该姓名!\n");
}
void insert()
{
char filename[80];
inputs("\t请输入你要添加记录的文件名字:",filename,79);
load(filename);
if(!head)return;
enter();
resave(filename);
}
void main()
{
head=NULL;
struct address * t=NULL;
while(1)
{
switch(menu_select())
{
case 1:enter();break;
case 2:save();break;
case 3:list();break;
case 4:search();break;
case 5:del();break;
case 6:insert();break;
case 7:
while(head)
{
t=head;
head=head->next;
free(t);
}
printf("\t程序已结束!\n");
exit(0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -