📄 doublelinklist.h
字号:
#include <stdio.h>
#include "stdlib.h"
#include <string.h>
#include <malloc.h>
typedef struct txl
{
char number[15];
char name[15];
char address[30];
char tel[20];
char QQ[20];
char E_mail[30];
}dtxl; /*建立通讯录信息结构体;*/
typedef struct dlnode
{
dtxl data;
struct dlnode *prior;
struct dlnode *next;
}dnode,*dlinklist; /*建立双向链表结构体;*/
void init(dlinklist *head)
{
dnode *p=(dnode *)malloc(sizeof(dnode));
p->next=p;
p->prior=p;
*head=p;
}
dnode *seek(dnode *head,char number[])
{
dnode *p;
p=head->next;
while(p!=head)
if(strcmp(p->data.number,number)==0)
return p;
else p=p->next;
if(p!=head) return p;
else return NULL;
}
void enter(dlinklist *head)
{
dnode *p,*rear,*q;
char flag='Y';
init(head);rear=*head;
while(flag=='Y'||flag=='y')
{
p=(dnode *)malloc(sizeof(dnode));
printf("编号:");
scanf("%s",&p->data.number);
q=seek(*head,p->data.number);
while(q!=NULL)
{
printf("编号重复,请重新输入编号!!!\n");
scanf("%s",&p->data.number);
q=seek(*head,p->data.number);
}
printf("姓名\t地址\t电话\tQQ\tE_mail\n");
printf("--------------------------------------------\n");
scanf("%s\t%s\t%s\t%s\t%s",&p->data.name,&p->data.address,&p->data.tel,&p->data.QQ,&p->data.E_mail);
rear->next=p;
p->prior=rear;
p->next=*head;
(*head)->prior=p;
rear=p; /*向双链表中动态增加节点数据;*/
printf("-----------------------------------------------\n");
printf("继续输入吗?(Y/N)\n");
flushall();
scanf("%c",&flag);
}
printf("\n");
}
void load(dlinklist *head,char filename[])
{
FILE *fp;
char yn;
dtxl e;
dnode *p,*rear;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("打开文件失败!!!是否要建立一个新的通讯录Y/N\n");
flushall();
scanf("%c",&yn);
if(yn!='y'&&yn!='Y')exit(0);
else enter(head);
}
else
{
init(head);
rear=*head;
while(fread(&e,sizeof(dtxl),1,fp))
{
p=(dnode *)malloc(sizeof(dnode));
p->data=e;
rear->next=p;
p->prior=rear;
rear=p;
(*head)->prior=p;
p->next=*head; /*从文件中动态载入节点数据;*/
}
fclose(fp);
printf("下载数据成功!!!\n");
}
}
void display(dnode *head)
{
dnode *p;
p=head->next;
printf("显示所有记录如下:\n");
printf("-----------------------------------------------\n");
printf("编号\t姓名\t地址\t电话\tQQ\tE-mail\n");
printf("-----------------------------------------------\n");
while(p!=head)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",&p->data.number,&p->data.name,&p->data.address,&p->data.tel,&p->data.QQ,&p->data.E_mail);
printf("-----------------------------------------------\n");
p=p->next;
}
}
dnode *search(dnode *head)
{
printf("输入1按编号进行查询\n输入2按姓名进行查询\n输入3按电话号码进行查询\n输入4按QQ号进行查询\n");
int search;
dnode *p;
scanf("%d",&search);
flushall();
switch(search)
{
case 1:
char number[9];
p=head->next;
printf("输入编号:");scanf("%s",number);
while(p!=head)
if(strcmp(p->data.number,number)==0)
return p;
else
p=p->next;
break;
case 2:
char name[9];
p=head->next;
printf("输入姓名:");scanf("%s",name);
while(p!=head)
if(strcmp(p->data.name,name)==0)
return p;
else
p=p->next;
break;
case 3:
char tel[9];
p=head->next;
printf("输入电话号码:");scanf("%s",tel);
while(p!=head)
if(strcmp(p->data.tel,tel)==0)
return p;
else
p=p->next;
break;
case 4:
char qq[9];
p=head->next;
printf("输入QQ号:");scanf("%s",qq);
while(p!=head)
if(strcmp(p->data.QQ,qq)==0)
return p;
else
p=p->next;
break;
}
if(p!=head)
return p;
else
return NULL;
}
void insert(dlinklist *head)
{
dnode *p,*rear;
dtxl e;
char flag='Y';
rear=(*head)->prior;
while(flag=='Y'||flag=='y')
{
printf("请输入要插入学生的编号\n");
scanf("%s",&e.number);
p=seek(*head,e.number);
while(p!=NULL)
{
printf("该编号的学生已存在,请重新输入!");
printf("请输入要插入学生的编号\n");
scanf("%s",&e.number);
p=seek(*head,e.number);
}
p=(dnode *)malloc(sizeof(dnode));
printf("姓名\t地址\t电话\tQQ\tE-mail\n");
printf("-----------------------------------------------\n");
scanf("%s %s %s %s %s",&p->data.name,&p->data.address,&p->data.tel,&p->data.QQ,&p->data.E_mail);
strcpy(p->data.number,e.number);
rear->next=p;
p->prior=rear;
p->next=*head;
(*head)->prior=p;
rear=p; /*向双链表中动态增加节点数据;*/
printf("-----------------------------------------------\n");
printf("继续插入吗?(Y/N)\n");
flushall();
scanf("%c",&flag);
}
}
void delete1(dlinklist *head)
{
char f;
dnode *p;
printf("删除之前首先查找该记录\n");
p=search(*head);
if(p==*head)
{
printf("没有找到要删除的数据!!!\n\n");
return;
}
else
{
printf("编号\t姓名\t地址\t电话\tQQ\tE-mail\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\n",&p->data.number,&p->data.name,&p->data.address,&p->data.tel,&p->data.QQ,&p->data.E_mail);
printf("确定要删除吗?(Y/N)\n");
flushall();
scanf("%c",&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,char filename[])
{
FILE *fp;
dnode *p;
char yn;
printf("你想建立一个新的文件么?Y/N\n");
scanf("%s",&yn);
if(yn=='Y'||yn=='y')
{
printf("请放入新的通讯录名:\n");
scanf("%s",filename);
}
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!!!\n");
exit(1);
}
p=head->next;
while (p!=head)
{
fwrite(&p->data,sizeof(dtxl),1,fp);
p=p->next;
}
fclose(fp);
printf("存盘成功!!!\n");
}
void modify(dlinklist *head)
{
txl e;
char f;
dlinklist p,q;
printf("请输入要修改学生的编号\n");
scanf("%s",e.number);
p=seek(*head,e.number);
if(p==NULL)
{
printf("该编号的学生不存在,不能进行修改");
}
else
{
printf("编号\t姓名\t地址\t电话\tQQ\tE-mail\n");
printf("%s\t%s\t%s\t%s\t%s\t%s",&p->data.number,&p->data.name,&p->data.address,&p->data.tel,&p->data.QQ,&p->data.E_mail);
printf("确定要修改吗?(Y/N)\n");
}
flushall();
printf("确定要修改吗?(Y/N)\n");
scanf("%c",&f);
if(f=='Y'||f=='y')
{
printf("原编号:%s新编号",p->data.number);
scanf("%s",e.number);
q=seek(*head,e.number);
if(q!=NULL&&(strcmp(p->data.number,e.number)!=0))
{
printf("已经存在该编号的学生!!\n");
printf("原编号:%s新编号",p->data.number);
scanf("%s",e.number);
}
strcpy(p->data.number,e.number);
printf("原姓名:%s新姓名",p->data.name);
scanf("%s",p->data.name);
printf("原电话号码:%s新电话号码",p->data.tel);
scanf("%s",p->data.tel);
printf("原地址:%s新地址",p->data.address);
scanf("%s",p->data.address);
printf("原信箱:%s新信箱:",p->data.E_mail);
scanf("%s",p->data.E_mail);
printf("原QQ号码:%s新QQ号码:",p->data.QQ);
scanf("%s",p->data.QQ);
}
}
void quit(void)
{
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -