⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doublelinklist.h

📁 利用线性表知识实现的通讯录,毕业设计题目
💻 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 + -