#include<stdlib.h>
#include<string.h>
struct TXL{
char name[30];
char qq[15];
char city[30];
char Email[30];
char num[12];
struct TXL *next;
struct TXL *prior;
};
struct TXL *start;
struct TXL *last;
struct TXL *find1(char *);
struct TXL *find2(char *);
void enter();
void search1();
void search2();
void save();
void load();
void list();
void mldelete(struct TXL **,struct TXL **);
void dls_store(struct TXL *i,struct TXL **start,struct TXL **last);
void inputs(char *,char *,int);
void display(struct TXL *);
int menu_select(void);
//菜单
int menu_select(void)
{
char s[80];
int c;
printf("***********欢迎使用通讯录系统***********\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");
printf("*****************************************\n");
do{
printf("\n请输入你要进行的操作(1-8):");
gets(s);
c = atoi(s);
}
while(c<0||c>8);
return c;
}
int main(void)
{
start = last = NULL;
for(;;)
{
switch(menu_select())
{
case 1:enter(); //输入信息
continue;
case 2:mldelete(&start,&last); //删除信息
continue;
case 3:list(); //显示信息
continue;
case 4:search1(); //姓名查找
continue;
case 5:search2(); //号码查找
continue;
case 6:save(); //保存
continue;
case 7:load(); //读档
continue;
case 8:exit(0); //退出
}
}
}
void enter()
{
struct TXL *info;
for(;;)
{
info=(struct TXL *)malloc(sizeof(struct TXL));
if(!info)
{
printf("\n Out of memory");
exit(0);
}
printf("\n输入空姓名结束!\n");
inputs("输入姓名:",info->name,30);
if(!info->name[0])
break;
inputs("输入城市:",info->city,30);
inputs("输入号码:",info->num,12);
inputs("输入QQ:",info->qq,100);
inputs("输入电子邮箱:",info->Email,30);
dls_store(info,&start,&last);
}
}
void inputs(char *prompt,char *s,int count)
{
char p[255];
do
{
printf(prompt);
fgets(p,254,stdin);
if(strlen(p)>count)
printf("\n输入过长!\n");
}
while(strlen(p)>count);
p[strlen(p)-1]=0;
strcpy(s,p);
}
void dls_store(struct TXL *i,struct TXL **start,struct TXL **last)
{
struct TXL *old,*p;
if(*last==NULL)
{
i->next=NULL;
i->prior=NULL;
*last=i;
*start=i;
return;
}
p=*start;
old=NULL;
while(p)
{
if(strcmp(p->name,i->name)<0)
{
old=p;
p=p->next;
}
else
{
if(p->prior)
{
p->prior->next=i;
i->next=p;
i->prior=p->prior;
p->prior=i;
return;
}
i->next=p;
i->prior=NULL;
p->prior=i;
*start=i;
return;
}
}
old->next=i;
i->next=NULL;
i->prior=old;
*last=i;
}
//删除信息
void mldelete(struct TXL **start,struct TXL **last)
{
struct TXL *info;
char s[80];
inputs("输入姓名:",s,30);
info=find1(s);
if(info)
{
printf("删除中......\n");
if(*start==info)
{
*start=info->next;
if(*start)
(*start)->prior=NULL;
else
*last=NULL;
}
else
{
info->prior->next=info->next;
if(info!=*last)
info->next->prior=info->prior;
else
*last=info->prior;
}
free(info);
printf("Ok,删除成功!\n");
}
}
//姓名查找
struct TXL *find1(char *name)
{
struct TXL *info;
info=start;
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
printf("\n");
return NULL;
}
//号码查找
struct TXL *find2(char *num)
{
struct TXL *info;
info=start;
while(info)
{
if(!strcmp(num,info->num))
return info;
info=info->next;
}
printf("\n");
return NULL;
}
//显示信息
void list(void)
{
struct TXL *info;
info=start;
if(info==NULL)
printf("没有任何信息!");
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
void display(struct TXL *info)
{
printf("姓名:%s\n",info->name);
printf("城市:%s\n",info->city);
printf("号码:%s\n",info->num);
printf("QQ:%s\n",info->qq);
printf("电子邮箱:%s\n",info->Email);
printf("\n");
}
//输出姓名查找结果
void search1(void)
{
char name[40];
struct TXL *info;
printf("查找的姓名:");
gets(name);
info=find1(name);
if(!info)
printf("没有该姓名任何信息!\n\n");
else
display(info);
}
//输出号码查找结果
void search2(void)
{
char num[12];
struct TXL *info;
printf("查找的号码:");
gets(num);
info=find2(num);
if(!info)
printf("没有该号码任何信息!\n\n");
else
display(info);
}
//保存
void save(void)
{
struct TXL *info;
FILE *fp;
fp=fopen("D:\\项目.txt","w");
if(!fp)
{
printf("打开文件失败!\n");
return;
}
printf("\n保存中 ……\n");
info=start;
while(info)
{
fwrite(info,sizeof(struct TXL),1,fp);
info=info->next;
}
printf("已完成!\n");
fclose(fp);
}
//读档
void load()
{
register int t, size;
struct TXL *info,*temp=0;
char *p;
FILE *fp;
if((fp=fopen("D:\\项目.txt","r"))==NULL)
{
printf("不能打开文件!\n");
exit(0);
}
printf("\n请稍等...\n");
size=sizeof(struct TXL);
start==malloc(size);
if(!start)
{
printf("内存不足!\n");
exit(0);
}
info=start;
p=(char*)info;
while((*p++=getc(fp))!=EOF)
{
for(t=0;t<size-1;++t)
*p++=getc(fp);
info->next==malloc(size);
if(!info->next)
{
printf("内存不足!\n");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=(char*)info;
}
temp->next=0;
last=temp;
start->prior=0;
fclose(fp);
printf("OK!打开成功!\n");
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^