数据结构课程设计——电话号码查询系统(C语言)

1、项目实现的主要功能

1、通过文件导入和手动输入两种方式录入个人的基本信息(姓名、电话、QQ、微信)

2、可通过输入姓名或者电话号码来查询录入的人的基本信息

3、也可通过该系统修改和删除信息

2、操作界面演示

1、菜单界面

 2、读取文件(这里需要先创建一个txt文件)

 3、手动添加信息

 4、查询个人信息

 5、修改信息

 6、删除信息

3、代码介绍

1、利用结构体定义结点

typedef struct
{
	char name[20];        //姓名
	char number[20];      //电话号码
	char wechat[20];      //微信号
	char QQ[20];          //QQ号
}information;        //初始化要录入的个人信息的所有内容
typedef struct node
{
	information data;
	struct node *next;
}Elem,*Link;

2、手动输入信息和文件读取信息

在文件读取中需要自己先创建一个txt文件,并根据自己创建的文件修改代码中的文件路径

int Init(Link elem[13],Link elem2[13],int t)
{
	Link j,k,L,m;
	int i,p,q,r,a,b,c,d,e;
	for(i=0;i<t;i++)
	{
		L=(Link)malloc(sizeof(Elem));     //定义一个结点
		L->next=NULL;
		printf("请输入第%d个人的姓名:",i+1);
		scanf("%s",&L->data.name);
		printf("请输入第%d个人的电话号码:",i+1);
		scanf("%s",&L->data.number);
		printf("请输入第%d个人的微信号:",i+1);
		scanf("%s",&L->data.wechat);
		printf("请输入第%d个人的QQ号:",i+1);
		scanf("%s",&L->data.QQ);

		p=strlen(L->data.name);                    //用名字存储
		q=L->data.name[p-1];
		r=q%13;    //将初始化录入的人的姓名的最后一个字的ASCII码值对13求余,得到的结果存入相应的位置
		if(elem[r]->next==NULL)
		{
			elem[r]->next=L;
			L->next=NULL;
		}
		else
		{
			for(j=elem[r];j->next!=NULL;j=j->next);
			j->next=L;
			L->next=NULL;

		}
		//将用名字存储的方式得到的结点存入相应的位置
		a=strlen(L->data.number);       //用电话号码存储
		d=L->data.number[a-1];
		e=L->data.number[a-2];        //d,e分别获取电话号码的最后一位和倒数第二位
		b=d+10*e;
		c=b%13;        //通过计算他们的ASCII码值对13求余的结果存到相应的位置
		m=(Link)malloc(sizeof(Elem));
		m->next=NULL;
		m=L;
		if(elem2[c]->next==NULL)
		{
			elem2[c]->next=m;
			m->next=NULL;
		}
		else
		{
			for(k=elem2[c];k->next!=NULL;k=k->next);
			k->next=m;
			m->next=NULL;
		}
	}
	//将结点存入相应的位置
	printf("------------------信息录入完成!-----------------\n");
	printf("\n");
	return OK;

}
int Init2(Link elem[13],Link elem2[13])        //文件读写初始化
{
	Link j,k,L,m;
	char st[20];
	FILE *fp;
	int i,p,q,r,a,b,c,d,e,t;
		if((fp=fopen("d:\\test.txt","r"))==NULL)
		{
			printf("打开失败!\n");
			getchar();
			exit(0);
		}
		for(i=1;i<=3;i++)
		{
			L=(Link)malloc(sizeof(Elem));
			L->next=NULL;
			fgets(st,20,fp);
			t=strlen(st);
			st[t-1]='\0';
			memcpy(L->data.name,st,20);
			fgets(st,20,fp);
			t=strlen(st);
			st[t-1]='\0';
			memcpy(L->data.number,st,20);
			fgets(st,20,fp);
			t=strlen(st);
			st[t-1]='\0';
			memcpy(L->data.wechat,st,20);
			fgets(st,20,fp);
			t=strlen(st);
			st[t-1]='\0';
			memcpy(L->data.QQ,st,20);
			p=strlen(L->data.name);                    //用名字存储
			q=L->data.name[p-1];
			r=q%13;
			//将初始化录入的人的姓名的最后一个字的ASCII码值对13求余,得到的结果存入相应的位置
			if(elem[r]->next==NULL)
			{
				elem[r]->next=L;
				L->next=NULL;
			}
			else
			{
				for(j=elem[r];j->next!=NULL;j=j->next);
				j->next=L;
				L->next=NULL;
			}
			//将用名字存储的方式得到的结点存入相应的位置
			a=strlen(L->data.number);       //用电话号码存储
			d=L->data.number[a-1];
			e=L->data.number[a-2];        //d,e分别获取电话号码的最后一位和倒数第二位
			b=d+10*e;
			c=b%13;        //通过计算他们的ASCII码值对13求余的结果存到相应的位置
			m=(Link)malloc(sizeof(Elem));
			m->next=NULL;
			m=L;
			if(elem2[c]->next==NULL)
			{
				elem2[c]->next=m;
				m->next=NULL;
			}
			else
			{
				for(k=elem2[c];k->next!=NULL;k=k->next);
				k->next=m;
				m->next=NULL;
			}
		}
	//将结点存入相应的位置
	return OK;
}

3、两种查询方式

int searchname(Link elem[13],char name[20])          //用名字查找
{
	int a,b,c;
	Link d;
	a=strlen(name);
	b=name[a-1];
	c=b%13;
	//采用和存储相同的方法查找名字
	if(strcmp(elem[c]->next->data.name,name)==0)   //判断指针指向的名字与输入的名字是否相同,相同则返回0
	{
		printf("------------------以下为查找的人的所有信息--------------------\n");
		printf("姓名:%s\n",elem[c]->next->data.name);
		printf("电话号码:%s\n",elem[c]->next->data.number);
		printf("微信:%s\n",elem[c]->next->data.wechat);
		printf("QQ:%s\n",elem[c]->next->data.QQ);
	}        //输出所有的个人信息
	else
	{
		for(d=elem[c];d->next!=NULL;d=d->next)     //如果第一个结点不是,则需要通过移动到下一个结点的方式直至找到对应的信息
		{
			if(strcmp(d->next->data.name,name)==0)
			{
				printf("------------------以下为查找的人的所有信息---------------------\n");
				printf("姓名:%s\n",d->next->data.name);
				printf("电话号码:%s\n",d->next->data.number);
				printf("微信:%s\n",d->next->data.wechat);
				printf("QQ:%s\n",d->next->data.QQ);
				break;
			}
		}

		if(d->next==NULL)
			printf("不存在要找的元素!\n");
		//如果遍历到最后仍然没有相同的,则说明不存在要查找的元素
	}
	return OK;
}
 //用电话号码查找
int searchnumber(Link elem2[13],char number[20])          
{
	int a,b,c;
	Link d;
	a=strlen(number);
	b=number[a-1]+10*number[a-2];
	c=b%13;        //采用和存储号码相同的方式查找信息
	if(strcmp(elem2[c]->next->data.number,number)==0)//判断指针指向的电话号码和输入的电话号码的值是否相同
	{
		printf("------------------以下为查找的人的所有信息--------------------\n");
		printf("姓名:%s\n",elem2[c]->next->data.name);
		printf("电话号码:%s\n",elem2[c]->next->data.number);
		printf("微信:%s\n",elem2[c]->next->data.wechat);
		printf("QQ:%s\n",elem2[c]->next->data.QQ);
	}
	else
	{
		for(d=elem2[c];d->next!=NULL;d=d->next)   //依次遍历存储结构中的每一个结点
		{
			if(d->next->data.number==number)
			{
				printf("以下为查找的人的所有信息\n");
				printf("姓名:%s\n",d->next->data.name);
				printf("电话号码:%s\n",d->next->data.number);
				printf("微信:%s\n",d->next->data.wechat);
				printf("QQ:%s\n",d->next->data.QQ);
				break;
			}
		}
		if(d->next==NULL)
			printf("不存在要找的元素\n");
		//表明查找失败,不存在相应的信息
	}
	return OK;
}

4、修改信息

int change(char number1[20],char number2[20],Link elem2[13]) 
{        
	int a,b,c,f,g;
	Link e;
	a=strlen(number1);
	f=number1[a-1];
	g=number1[a-2];
	b=f+10*g;
	c=b%13;
	//修改信息之前要找到对应的要修改的信息的位置
	if(strcmp(elem2[c]->next->data.number,number1)==0)
	{
		memcpy(elem2[c]->next->data.number,number2,strlen(number2));
		printf("修改成功!\n");
	}
	else
	{
		for(e=elem2[c];e->next!=NULL;e=e->next)
		{
			if(strcmp(e->data.number,number1)==0)
			{
				memcpy(e->data.number,number2,strlen(number2));
				printf("修改成功!\n");
				break;
			}
		}
		//找到对应的电话号码并对其进行修改
		printf("不存在要修改的电话号码!\n");
	}
	printf("更改后的号码查询只能通过名字查找!\n");
	//表明查找失败不存在要修改的电话号码
	printf("\n");
	return OK;
}

5、删除信息

int numberdelete(char number[20],Link elem2[13])    
{
	int a,b,c,e,f;
	Link d,g;
	a=strlen(number);
	e=number[a-1];
	f=number[a-2];
	b=e+10*f;
	c=b%13;
	//要删除,也同样要先通过存储的方式查找到对应的电话号码
	for(d=elem2[c];d->next!=NULL;d=d->next)
	{
		if(strcmp(d->next->data.number,number)==0)
		{
			g=elem2[c]
			while(g->next!=d->next)
				g=g->next;

			if(g->next->next==NULL)
			{
				g->next=NULL;
				free(d->next);
				printf("删除成功!\n");
				break;
			}
			else
			{
				g->next=g->next->next;
				free(d->next);
				printf("删除成功!\n");
				break;
			}
			//查找到对应的号码对其进行删除
		}
	}
	printf("删除完的只能通过电话号码查找有效\n");
	printf("\n");
	return OK;
}

6、主函数

void main()     //主函数
{
	int j=0,selection,b,i,t;
	char z[4]="yes";
	Link elem[13],elem2[13];
	for(i=0;i<=12;i++)
	{
		elem[i]=(Link)malloc(sizeof(Elem));
		elem2[i]=(Link)malloc(sizeof(Elem));
		elem[i]->next=NULL;
		elem2[i]->next=NULL;
	}
	//定义两个数组用来存储姓名和电话
	char name[20],number[20],number1[20],number2[20],number3[20];
	while(j==0)
	{
		printf("----------------------------------------\n");
		printf("|           电话号码查询系统           |\n");
		printf("|--------------------------------------|\n");
		printf("|                                      |\n");
		printf("|             1.从文件导入信息         |\n");
		printf("|                                      |\n");
		printf("|             2.添加信息               |\n");
		printf("|                                      |\n");
		printf("|             3.查询                   |\n");
		printf("|                                      |\n");
		printf("|             4,修改信息               |\n");
		printf("|                                      |\n");
		printf("|             5.删除电话               |\n");
		printf("|                                      |\n");
		printf("|             6.退出系统               |\n");
		printf("|                                      |\n");
		printf("----------------------------------------\n");
		printf("请选择操作:");
		scanf("%d",&selection);
		switch(selection)
		{
			case 2:
			{
				printf("请输入要导入的人的个数:");
				scanf("%d",&t);
				Init(elem,elem2,t);
				//调用导入信息的函数
			}
			break;
		case 1:
			{
				Init2(elem,elem2);
				printf("--------------文件导入完成!---------------\n");
				printf("\n");
				//调用导入信息的函数
			}
			break;
		case 3:
			{
				printf("-----------------------------------\n");
				printf("   1.姓名查询         2.电话查询   \n");
				printf("-----------------------------------\n");
				//提供了两种方法查询信息
				printf("请选择查询方式:");
				scanf("%d",&b);
				if(b==1)
				{
					printf("请输入要查找的人的名字:");
					scanf("%s",name);
					printf("\n");
					searchname(elem,name);
					//调用查找姓名的函数
				}
				else
				{
					printf("请输入要查找的电话号码:");
					scanf("%s",number);
					searchnumber(elem2,number);
					//调用查找电话号码的函数
				}
			}
			break;

		case 4:
			{
				printf("请输入要修改的电话号码:");
				scanf("%s",number1);
				printf("请输入修改后的电话号码:");
				scanf("%s",number2);
				change(number1,number2,elem2);
				//调用修改电话号码的函数
			}
			break;

		case 5:
			{
				printf("请输入要删除的电话号码:");
				scanf("%s",number3);        //判断是否要执行删除操作
				printf("请确认是否删除(yes/no):");
				scanf("%s",z);        //判断字符数组中的元素与输入的是否一致
				if(strcmp(z,"yes")==0)
				{
					//执行删除操作
					numberdelete(number3,elem2);
				}
				else if(strcmp(z,"no")==0)
				{
					printf("已取消删除操作!\n");
				}
				else
				{
					printf("输入错误!\n");
				}
				//调用删除电话号码的函数
			}
			break;
		case 6:
			{
				j=1;
				printf("欢迎使用!\n");
				//令j等于1,让switch语句结束,也让整个程序结束
			}
			break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/ZY594358676/article/details/127398449