大一c语言课程设计:通讯录(顺序表)

#include<stdio.h>
#include<string.h>
#define N 12  //文件通讯录条数。 
void menu()//菜单界面 
{
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t**************菜单界面**************\n");
	printf("\t\t\t\t ---------------------------------- \n");
	printf("\t\t\t\t|         1.添加联系人信息         |\n");
	printf("\t\t\t\t|         2.显示所有联系人信息     |\n");
	printf("\t\t\t\t|         3.删除部分联系人         |\n");
	printf("\t\t\t\t|         4.清空所有联系人         |\n");
	printf("\t\t\t\t|         5.修改联系人             |\n");
	printf("\t\t\t\t|         6.精确查找联系人         |\n");
	printf("\t\t\t\t|         7.模糊关键字查找         |\n");
	printf("\t\t\t\t|         8.导出通讯录             |\n");
	printf("\t\t\t\t|         9.导入通讯录             |\n");
	printf("\t\t\t\t|         10.按条件排序            |\n");
	printf("\t\t\t\t|         11.重复删除              |\n");
	printf("\t\t\t\t|         12.误清空恢复            |\n");
	printf("\t\t\t\t|         0.退出                   |\n");
	printf("\t\t\t\t ----------------------------------\n");
}
typedef struct link
{
	char name[10];
	char sex[10];
	char age[10];
	char  addr[20];
	char tel[20];
}linkman;
typedef struct PEOPLE
{
	int num;
	linkman count[1000];
}*people;
int add_linkman(people cou)//添加联系人。 
{
	if(cou->num==1000)
	{
		printf("通讯录已满,无法录入"); 
		return(cou->num);
	}
	else
	{
		printf("please input name:\n");
		scanf("%s",cou->count[cou->num].name);
		printf("please input sex:\n");
		scanf("%s",cou->count[cou->num].sex);
		printf("please input age:\n");
		scanf("%s",cou->count[cou->num].age);
		printf("please input address:\n");
		scanf("%s",cou->count[cou->num].addr);
		printf("please input telphone\n");
		scanf("%s",cou->count[cou->num].tel);
		cou->num++;
		printf("添加成功\n");
		return(cou->num);
	}
}
void display_linkman(people cou)//显示所有联系人 
{
	int i=0;
	if(cou->num==0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	else
	{
		printf("姓名\t性别\t年龄\t地址\t电话号码\n");
		for(i=0;i<cou->num;i++)	
		{
			printf("%s\t%s\t%s\t%s\t%s",
			cou->count[i].name,
			cou->count[i].sex,
			cou->count[i].age,
			cou->count[i].addr,
			cou->count[i].tel);
			printf("\n");
		}
		return;
	}
}
void delete_linkman(people cou)//删除联系人。 
{
	printf("\t\t\t\t*********注意:删除后无法恢复***********\n");
	char name[10];
	int i=0,flag=0;
	if(cou->num==0)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	else
	{
		printf("请输入需要删除的人的名字>:");
		scanf("%s",name);
		printf("\n");
		for(i=0;i<=cou->num;i++)
		{
			if(!strcmp(name,cou->count[i].name))
			{
				while(i<cou->num)
				{
					cou->count[i]=cou->count[i+1];
					i++;
				}
				cou->num--;
				flag=0;	
				printf("删除成功\n");
				return;
			}		
		}
		printf("未找到此联系人,删除失败\n");
		return;
	}
}
void clear_linkman(people cou)//清空联系人 
{
	if(cou->num==0)
	{
		printf("联系人已空,无需再次清空\n");
		return;
	}
	else
	{
		cou->num=0;
		printf("清空完成\n");
		return;
	}
}
void modify_linkman(people cou)//修改联系人。 
{
	char name[10];
	int i;
	if(cou->num==0)
	{
		printf("联系人为空,请新建联系人\n");
		return;
	}
	else
	{
		printf("请输入需要修改的联系人的名字>:");
		scanf("%s",name);
		for(i=0;i<=cou->num;i++)
		{
			if(!strcmp(name,cou->count[i].name))
			{
				printf("please input name:\n");
				scanf("%s",cou->count[i].name);
				printf("please input sex:\n");
				scanf("%s",cou->count[i].sex);
				printf("please input age:\n");
				scanf("%s",cou->count[i].age);
				printf("please input address:\n");
				scanf("%s",cou->count[i].addr);
				printf("please input telphone\n");
				scanf("%s",cou->count[i].tel);
				printf("修改成功\n");
				break;		
			}
			else if(i==cou->num)
			{
				printf("未找到相应联系人\n");	
			}
		}
		return;
	}
}
void search_linkman(people cou)//查找联系人 
{
	char name[10];
	int i;
	if(cou->num==0)
	{
		printf("联系人为空,无法查找,请新建联系人\n");
		return;
	}
	else
	{
		printf("请输入查找人的名字>:");
		scanf("%s",name);
		for(i=0;i<=cou->num;i++)
		{
			if(!strcmp(name,cou->count[i].name))
			{
				printf("%s\t%s\t%s\t%s\t%s\n",
				cou->count[i].name,
				cou->count[i].sex,
				cou->count[i].age,
				cou->count[i].addr,
				cou->count[i].tel);	
				break;	
			}
			else if(i==cou->num)
			{
				printf("未找到联系人\n");
			}
		}
		return;
	}
}
void derive_linkman(people cou)//导出通讯录。 
{
	FILE *fp;
	int i;
	if((fp=fopen("通讯录2.txt","wt+"))==NULL)
	{
		printf("open file error!\n");
		return;
	}
		fprintf(fp,"姓名\t性别\t年龄\t地址\t电话号码\n");
		for(i=0;i<=cou->num;i++)
		{
			fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",
			cou->count[i].name,
			cou->count[i].sex,
			cou->count[i].age,
			cou->count[i].addr,
			cou->count[i].tel);
		}
		printf("导出成功\n");
		fclose(fp);
		return;
}
int load_linkman(people cou)//载入通讯录。(载入测试数据) 
{
	FILE *fp;
	int i;
	if((fp=fopen("通讯录1.txt","rb"))==NULL)
	{
		printf("open file error!\n");
		return(cou->num);
	}
	rewind(fp);
	if(cou->num==0)
	{
		for(i=0;i<N;i++)
		{
			fscanf(fp,"%s%s%s%s%s\n",
			cou->count[i].name,
			cou->count[i].sex,
			cou->count[i].age,
			cou->count[i].addr,
			cou->count[i].tel);
			cou->num++;
		}
		printf("导入成功\n");
	}
	else
	{
	  for(i=0;i<N;i++)
	   {
		    fscanf(fp,"%s%s%s%s%s\n",
		    cou->count[cou->num].name,
		    cou->count[cou->num].sex,
		    cou->count[cou->num].age,
		    cou->count[cou->num].addr,
		    cou->count[cou->num].tel);
		    cou->num++;
	   }
	   printf("导入成功\n");
	}
	fclose(fp);
	return(cou->num);
}
void number_linkman(people cou)//通讯录容量记录。 
{
	printf("\t\t\t\t通讯录总条数1000条,已用条数%d,剩余可用条数%d\n",cou->num,1000-cou->num);
	printf("\t\t\t\t注意:退出程序请按8号功能键导出联系人防止联系人丢失\n");
	printf("\t\t\t\t注意:误清空后可以按12号功能键恢复\n");
	printf("\t\t\t\t注意:清空后可恢复,删除不可恢复。\n");
	printf("\t\t\t\t注意:请严格按照功能序号输入,否则程序可能出错。\n");
	return;
}
void keyworld_search(people cou)//关键字查找。 
{
	char ch[20];
	int i,j=0;
	if(cou->num==0)
	{
		printf("通讯录为空,无法搜索\n");
		return;
	}
	else
	{
		printf("请输入要查找的关键字>:");
		scanf("%s",ch);
		for(i=0;i<cou->num;i++)
		{
			if((strstr(cou->count[i].name,ch)!=NULL)||
			(strstr(cou->count[i].sex,ch)!=NULL)||
			(strstr(cou->count[i].tel,ch)!=NULL)||
			strstr(cou->count[i].addr,ch)!=NULL)
			{
				printf("%s\t%s\t%s\t%s\t%s\n",
				cou->count[i].name,
				cou->count[i].sex,
				cou->count[i].age,
				cou->count[i].addr,
				cou->count[i].tel);	
				j++;
			}	
		}
		if(j==0)
		{
			printf("未找到相关数据\n");
			return;
		}
		else
		{
		printf("共找到%d条数据\n",j);
		}
		return;
	}
}
void sort_linkman(people cou)//排序函数。 
{
	linkman temp;
	int i,j,x;
	if(cou->num==0)
	{
		printf("通讯录为空,无法排序\n");
		return;
	}
	else
	{
		printf("\t\t\t\t*************功能选项***************\n");
		printf("\t\t\t\t ---------------------------------- \n");
		printf("\t\t\t\t|         1.按名字排序             |\n");
		printf("\t\t\t\t|         2.按年龄排序             |\n");
		printf("\t\t\t\t|         3.按性别分类             |\n");
		printf("\t\t\t\t|         4.按地域分类             |\n");
		printf("\t\t\t\t ---------------------------------- \n");
		printf("请选择功能序号>:");
		scanf("%d",&x);
		switch(x)
		{
			case 1:
				for(i=0;i<cou->num-1;i++)
				{
					for(j=0;j<cou->num-1;j++)
					{
						if(strcmp(cou->count[j].name,cou->count[j+1].name)>0)
						{
							temp=cou->count[j];
							cou->count[j]=cou->count[j+1];
							cou->count[j+1]=temp;
						}
					}
				}
				printf("按名字排序完成\n");
				break;
			case 2:
				for(i=0;i<cou->num-1;i++)
				{
					for(j=0;j<cou->num-1;j++)
					{
						if(strcmp(cou->count[j].age,cou->count[j+1].age)>0)
						{
							temp=cou->count[j];
							cou->count[j]=cou->count[j+1];
							cou->count[j+1]=temp;
						}
					}
				}
				printf("按年龄排序完成\n");
				break;
			case 3:
				for(i=0;i<cou->num-1;i++)
				{
					for(j=0;j<cou->num-1;j++)
					{
						if(strcmp(cou->count[j].sex,cou->count[j+1].sex)<0)
						{
							temp=cou->count[j];
							cou->count[j]=cou->count[j+1];
							cou->count[j+1]=temp;
						}
					}
				}
				printf("按性别分类排序完成\n");
				break;
			case 4:
				for(i=0;i<cou->num-1;i++)
				{
					for(j=0;j<cou->num-1;j++)
					{
						if(strcmp(cou->count[j].addr,cou->count[j+1].addr)>0)
						{
							temp=cou->count[j];
							cou->count[j]=cou->count[j+1];
							cou->count[j+1]=temp;
						}
					}
				}
				printf("按地域分类成功\n");
				break;
			default:
				printf("输入有功能序号有误\n");
				break;	
		}
		return;
	}
}
void remove_linkman(people cou)//重复删除。 
{
	int i,j,k=0;
	if(cou->num==0)
	{
		printf("通讯录为空,请添加联系人\n");
		return;
	}
	else
	{
		for(i=0;i<cou->num-1;i++)
		{
			for(j=i+1;j<cou->num;j++)
			{
				if(!strcmp(cou->count[i].name,cou->count[j].name)&&
				!strcmp(cou->count[i].sex,cou->count[j].sex)&&
				!strcmp(cou->count[i].age,cou->count[j].age)&&
				!strcmp(cou->count[i].addr,cou->count[j].addr)&&
				!strcmp(cou->count[i].tel,cou->count[j].tel))
				{
					while(j<cou->num)
					{
						cou->count[j]=cou->count[j+1];
						j++;
					}
					cou->num--;
					k++;
				}
			}
		}
		if(k==0)
		{
			printf("通讯录没有重复联系人\n");
		}
		else
		{
			printf("删除重复成功\n");
		    printf("本次共删除%d条重复\n",k);
		}
		return;
	}
}
void recover_linkman(people cou,int p)
{
	cou->num=p;
	if(cou->num==0)
	{
		printf("联系人为空,恢复失败\n");
	}
	else
	{
		printf("恢复成功\n");
	}
	return;
}
int main()
{
	int opp=1,z=0;
	struct PEOPLE cou;
	cou.num=0;
	printf("通讯录初始化成功\n");
	while(opp)
	{
		menu();
		number_linkman(&cou);
		printf("请选择功能序号>:");
		scanf("%d",&opp);
		switch(opp)
		{
			case 0:
				break;
			case 1:
				z=add_linkman(&cou);
				break;	
			case 2:
				display_linkman(&cou);
				break;
			case 3:
				delete_linkman(&cou);
				break;
			case 4:
				clear_linkman(&cou);
				break;
			case 5:
				modify_linkman(&cou);
				break;
			case 6:
				search_linkman(&cou);
				break;
			case 7:
				keyworld_search(&cou);
				break; 
			case 8:
				derive_linkman(&cou);
				break;
			case 9:
				z=load_linkman(&cou);
				break;
			case 10:
				sort_linkman(&cou);
				break;
			case 11:
				remove_linkman(&cou);
				break;
			case 12:
				recover_linkman(&cou,z);
				break;
			default:
				printf("输入有功能序号误\n");
				break;
		}
	}    
	getchar();
	return 0;
}
发布了9 篇原创文章 · 获赞 24 · 访问量 7537
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览