c语言双向链表通讯录?

2025-02-14 04:26:07
推荐回答(2个)
回答1:

#include
#include
#include
typedef struct txl
{
char name[15];
char street[30];
char city[20];
char eip[20];
char state[20];
}dtxl; /*建立通讯录信息结构体;*/
typedef struct dlnode
{
dtxl data;
struct dlnode *prior;
struct dlnode *next;
}dnode; /*建立双向链表结构体;*/dnode *head;void enter(void)
{
dnode *p,*rear;
char flag='Y';
head=(dnode *)malloc(sizeof(dnode));
rear=head;
head->next=head;
head->prior=head; /*建立双链表空头节点;*/
while(flag=='Y'||flag=='y')
{
p=(dnode *)malloc(sizeof(dnode));
printf(" 姓名 街道 城市 邮编 国家\n");
printf("-----------------------------------------------\n");
scanf("%s %s %s %s %s",&p->data.name,&p->data.street,&p->data.city,&p->data.eip,&p->data.state);
rear->next=p;
p->prior=rear;
rear=p;
p->next=head; /*向双链表中动态增加节点数据;*/
printf("-----------------------------------------------\n");
printf("继续输入吗?(Y/N)\n");
scanf("%s",&flag);
}
printf("\n");
}void load(dnode *head)
{
FILE *fp;
int n,i;
dnode *p,*rear;
rear=head;
head->next=head;
head->prior=head;
if((fp=fopen("file.txt","rb"))==NULL)
{
printf("打开文件失败!!!\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i {
p=(dnode *)malloc(sizeof(dnode));
fscanf(fp,"%s%8s%8s%8s%8s",&p->data.name,&p->data.street,&p->data.city,&p->data.eip,&p->data.state);
rear->next=p;
p->prior=rear;
rear=p;
p->next=head; /*从文件中动态载入节点数据;*/
}
fclose(fp);
printf("下载数据成功!!!\n\n");
}
void display(dnode *head)
{
dnode *p;
p=head->next;
printf("显示所有记录如下:\n");
printf("-----------------------------------------------\n");
printf(" 姓名 街道 城市 邮编 国家\n");
printf("-----------------------------------------------\n");
while(p!=head)
{
printf("%s %8s %8s %8s %8s",p->data.name,p->data.street,p->data.city,p->data.eip,p->data.state);
printf("\n");
printf("-----------------------------------------------\n\n");
p=p->next;
}
}
dnode *search(dnode *head)
{
dnode *p;
char name[9];
p=head->next;
scanf("%s",name);
while(p!=head&&p&&strcmp(p->data.name,name)!=0)
{p=p->next;}
return p;
}void delete(dnode *head)
{
char f;
dnode *p;
p=search(head);
if(p==head)
{
printf("没有找到要删除的数据!!!\n\n");
return;
}
else
{
printf("确定要删除吗?(Y/N)\n");
scanf("%s",&f);
if(f=='Y'||f=='y')
{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
printf("Success to delete!\n");
}
}
}void save(dnode *head)
{
FILE *fp;
dnode *p;
int n=0,i;
if((fp=fopen("file.txt","wb"))==NULL)
{
printf("打开文件失败!!!\n");
exit(1);
}
p=head->next;
if(p!=head)
{
while (p!=head)
{
p=p->next;
n++;
}
fprintf(fp,"%d",n); /*写入节点个数;*/
fprintf(fp,"\r\n"); /*写入回车符;*/
p=head->next;
for(i=0;i {
fprintf(fp,"%s %8s %8s %8s %8s",p->data.name,p->data.street,p->data.city,p->data.eip,p->data.state);
fprintf(fp,"\r\n");
p=p->next;
} /*向文件中写入节点数据;*/
}
else
printf("Please make sure the data is not NULL!!");
fclose(fp);
printf("存盘成功!!!\n");
}
void quit(void)
{
exit(0);
}
void main()
{ char flag='Y';
for(;;)
{
dnode *q;
int ch;
printf("通讯录系统:\n");
printf("=================================\n");
printf(" 输入纪录-----------------0\n");
printf(" 下载纪录-----------------1\n");
printf(" 显示所有纪录-------------2\n");
printf(" 查询纪录-----------------3\n");
printf(" 删除纪录-----------------4\n");
printf(" 存盘---------------------5\n");
printf(" 退出---------------------6\n"); /*通讯录提示信息;*/
printf("=================================\n");
printf("请输入数字(0~6):\n");
scanf("%d",&ch);
switch(ch)
{
case 0:
enter();break;
case 1:
head=(dnode *)malloc(sizeof(dnode));
load(head);break;
case 2:
display(head);break;
case 3:
jmp: printf("请输入姓名进行查询:\n");
q=search(head);
if(q!=head)
{
printf("-----------------------------------------------\n");
printf(" 姓名 街道 城市 邮编 国家\n");
printf("-----------------------------------------------\n");
printf("%s %8s %8s %8s %8s",q->data.name,q->data.street,q->data.city,q->data.eip,q->data.state);
printf("\n-----------------------------------------------\n");
printf("查询成功!\n");
printf("\n继续查询?(Y/N)\n");
scanf("%s",&flag);
if(flag=='Y'||flag=='y')
goto jmp;
}
else
printf("对不起,没有此数据相关的纪录!!!\n\n");
break;
case 4:
printf("请输入姓名删除纪录:\n");
delete(head);break;
case 5:
save(head);break;
case 6:
quit();break;
default:
printf("警告!!!请输入数字0-6!\n");
} /*用SWITCH函数选择菜单;*/
}
}

回答2:

自己做吧。挺简单的。