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

📄 address_list.cpp

📁 课程设计之通迅录
💻 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 + -