C语言简单项目 通讯录(使用文件操作实现保存,代码量1000+)

本程序使用单向循环列表,拥有基本功能

1.增加联系人,

2.删除联系人,

3.修改联系人信息,

4.显示所有联系人,

5.排序显示所有联系人 (堆排序法)

除了简单的功能外,还完善了许多的小bug,如

1.输入指令时如果输入字符个数多了或者不是想要的字符,会报相应错误,并要求重新输入

2.显示联系人时,只需要输入前几位信息就会显示所有符合的联系人,(如拥有联系人menglinggong,只需输入meng即可查找出)

3.添加联系人时,如果联系人已存在,会提示是否继续添加,若继续添加则自动生成后缀(_1,_2,_3.......)

4.修改联系人信息时,会要求输入指定选项以修改该联系人相应信息,然后提示是否继续修改该联系人信息,直至退出修改

本程序使用文件操作来保存联系人信息,并没用数据库

源码如下:

/*****************************************************
 > File name:tongxunlu.c
 > Author: Mr Meng 
 > 日期:2018-08-03 14:02
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define T 1
#define F 0

typedef char elementype;
typedef int status;

typedef struct tongxue
{
	char name[20];
	elementype xuehao[20];
	elementype shoujihao[20];
	elementype qqhao[20];
}link;

typedef struct node
{
	struct node* next;
	link data;

}*node;


//初始化以及输入
void gongneng(node head);
void zhiling(char* i);
status init(node* p);
void scan1(char* l);
void scan2(elementype* x);
void scan3(elementype* s);
void scan4(elementype* qq);
void tou();


//计算长度
int length(node p);

//添加联系人,当联系人已存在时提示是否继续添加,若继续添加则自动生成后缀
status insert_head(node p,char* l,elementype* x,elementype* s,elementype* qq);

//查找联系人,当联系人信息不完全记得时,只需输入前几位,系统会自动显示出所有符合条件的联系人
status query_name(node p,char* g);

//显示所有联系人
void print(node p);

//删除联系人,先调用查找联系人函数,再根据查找到的联系人信息指定删除某联系人
status delete_name(node p,char* z);

//更新联系人信息,先调用查找函数,在根据查找到的信息指定修改某联系人的信息,可单独修改指定信息,也可全部修改
status update_name(node p,char* z);
status update_no();


//用堆排序法排序显示
void heapadjust1(node* arr,int n,int m);
int heap(node p,char* z);
void heapadjust2(node* arr,int n,int m);
void heapadjust3(node* arr,int n,int m);
void heapadjust4(node* arr,int n,int m);
void swap(node* arr,int i,int j);


//文件操作实现通讯录的保存
void write(node p);
void read(node p);
int Insert_Last(node h,link data);


int main()
{
	FILE* file = fopen("cmd.txt", "a+");
	if(NULL == file)
	{
		perror("fopen");
		return 1;
	}
	node head;
	init(&head);

	read(head);
	system("clear");
	tou();
	gongneng(head);
	write(head);
	fclose(file);
	return 0;  
}

void gongneng(node head)
{
	char i[10];
	printf("请输入一位操作指令:");
	zhiling(i);

	getchar();

	char l[20];
	elementype x[20];
	elementype s[20];
	elementype qq[20];
	char z[10];
	while(i != 0)
	{	
		switch(i[0])
		{
			case'1':scan1(l);//添加联系人
					node newhead = head;
					int ff = 0;
					while(newhead != head->next)
					{
						if(strcmp(head->next->data.name , l) == 0)
						{
							ff++;
						}
						head = head->next;
					}
					if(ff != 0)
					{
						printf("联系人已存在是否继续添加,1.添加,0.取消\n");
						printf("请输入:");
						int kk;
						scanf("%d",&kk);
						head = newhead;
						if(kk == 0)
						{
							int clear;
							printf("输入任意数字继续:");
							scanf("%d",&clear);
							system("clear");
							tou();
							break;
						}
						int tt = strlen(l);
						static int mm = 48;
						mm++;
						l[tt] = '_';
						l[tt+1] = mm;
						l[tt+2] = '\0';
						
					}
					head = newhead;
					scan2(x);
					scan3(s);
					scan4(qq);
					insert_head(head,l,x,s,qq);
					printf("添加成功\n");
					int clear;
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
					break;
			
			case'2':printf("1:按联系人姓名查找 2:按学号查找 3:按手机号查找 4:按QQ号查找\n");//查找联系人
					printf("请输入操作编号:");
					zhiling(z);
					query_name(head,z);
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
					break;
			
			case'3':print(head);//显示所有联系人
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
					break;
			
			case'4':printf("1:按联系人姓名删除 2:按学号删除 3:按手机号删除 4:按QQ号删除\n");//删除联系人
					int re;
					int rp;
					printf("请输入操作编号:");
					zhiling(z);
					rp = query_name(head,z);

					if(rp != 0)
					{
						printf("请输入1.删除,0.不删除\n");
						printf("请输入:");
						scanf("%d",&re);
						if (re == 1)
						{
							delete_name(head,z);
						}
					}
					
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
					break;
			
			case'5':printf("1:按联系人姓名更新 2:按学号更新 3:按手机号更新 4:按QQ号更新\n");//更新联系人
					printf("请输入操作编号:");
					zhiling(z);
				 	rp = query_name(head,z);
				 	if(rp != 0)
				 	{
					 	printf("请输入1.更新,0.不更新\n");
					 	printf("请输入:");
						scanf("%d",&re);
						if(re == 1)
						{
							update_name(head,z);
						}
					}
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
					break;
			
			case'6':printf("1:按联系人姓名排序 2:按学号排序 3:按手机号排序 4:按QQ号排序\n");
					printf("请输入操作编号:");
					zhiling(z);
					heap(head,z);
					printf("输入任意数字继续:");
					scanf("%d",&clear);
					system("clear");
					tou();
			 		break;
			
		 	case'7':return;

			default:printf("输入错误\n");
					break;
	
		}
		printf("请输入一位操作指令:");
		zhiling(i);
		getchar();
	}

}

void tou()
{
	printf("*******************************欢迎进入164班通讯录**************************************\n");
	printf("*                                                                                      *\n");
	printf("*               1:添加联系人                         2:查找联系人                      *\n");
	printf("*                                                                                      *\n");
	printf("*               3:显示所有联系人                     4:删除联系人                      *\n");
	printf("*                                                                                      *\n");
	printf("*               5:修改联系人信息                     6:排序显示                        *\n");
	printf("*                                                                                      *\n");
	printf("*               7:退出                                                                 *\n");
	printf("*                                                                                      *\n");
	printf("****************************************************************************************\n");
}

void zhiling(char* i)
{
	scanf("%s",i);
	int pp = 0;

	while(i[pp] != '\0')
	{
		pp++;
	}

	if(pp > 1)
	{
		printf("指令过长,请重新输入一位指令:");
		zhiling(i);
	}
}

status init(node* p)
{
	node newnode = (node)malloc(sizeof(struct node));
	if(NULL == newnode)
	{
		return F;
	}
	newnode->next = newnode;
	*p = newnode;
	return T;
}

void print(node p)
{
	node head = p;

	while(head != p->next->next)
	{
		printf("联系人:%-15s\t",p->next->data.name);
		printf("学号  :%-15s\t",p->next->data.xuehao);
		printf("手机号:%-15s\t",p->next->data.shoujihao);
		printf("qq号  :%-15s\n",p->next->data.qqhao);
		printf("\n");

		p = p->next;
	}
}

int length(node p)
{
	int i = 0;
	node head = p;
	while(head != p->next)
	{
		i++;
		p = p->next;
	}
	return i;
}

status insert_head(node p,char* l,elementype* x,elementype* s,elementype* qq)
{
	node newnode = (node)malloc(sizeof(struct node));
	if(NULL == newnode)
	{
		return F;
	}

	strcpy(newnode->data.name,l);	
	strcpy(newnode->data.xuehao , x);
	strcpy(newnode->data.shoujihao,s);
	strcpy(newnode->data.qqhao,qq);
	newnode->next = p->next;
	p->next = newnode;
	return T;
}

void scan1(char* l)
{
	printf("请输入联系人姓名:");
	scanf("%s",l);
}

void scan2(elementype* x)
{
	printf("请输入学号(无空格):");
	scanf("%s",x);
	int i = 0;

	while(x[i] != '\0')
	{
		i++;
	}
	int n;

	for(n = 0;n < i;n++)
	{
		if(x[n] > 57 || x[n] < 48)
		{
			printf("输入有非数字字符,请重新输入\n");
			scan2(x);
			break;
		}
	}
	
}

void scan3(elementype* s)
{
	printf("请输入手机号(无空格):");
	scanf("%s",s);
	int i = 0;

	while(s[i] != '\0')
	{
		i++;
	}
	int n;

	for(n = 0;n < i;n++)
	{
		if(s[n] > 57 || s[n] < 48)
		{
			printf("输入有非数字字符,请重新输入\n");
			scan3(s);
			break;
		}
	}
}

void scan4(elementype* qq)
{
	printf("请输入qq号(无空格):");
	scanf("%s",qq);
	int i = 0;

	while(qq[i] != '\0')
	{
		i++;
	}
	int n;

	for(n = 0;n < i;n++)
	{
		if(qq[n] > 57 || qq[n] < 48)
		{
			printf("输入有非数字字符,请重新输入\n");
			scan4(qq);
			break;
		}
	}
}


status  query_name(node p,char* g)//显示所有符合条件的联系人
{
	node head = p;
	char l[20];
	elementype s[20];
	int i = 0;

	while(g != 0)
	{	
		switch(g[0])
		{
			case'1':scan1(l);
					int zzz = strlen(l);
					//printf("zzz = %d \n",zzz);
					char* buf;

					while(head != p->next)
					{
						strncpy(buf,p->next->data.name,zzz);
						buf[zzz] = '\0';
						//printf("buf = %s\n",buf);
						if(strcmp(buf ,l) == 0)
						{
							printf("联系人:%-15s\t",p->next->data.name);
							printf("学号  :%-15s\t",p->next->data.xuehao);
							printf("手机号:%-15s\t",p->next->data.shoujihao);
							printf("qq号  :%-15s\n",p->next->data.qqhao);
							i++;
						}
						p = p->next;
					}

					if(i == 0)
					{
						printf("没有找到满足条件的联系人\n");
						return F;
					}

					printf("满足条件的联系人有 %d 位\n",i);
					return T;
			
			case'2':scan2(s);
					zzz = strlen(s);

					while(head != p->next)
					{
						strncpy(buf,p->next->data.xuehao,zzz);
						buf[zzz] = '\0';

						if(strcmp(buf,s) == 0)
						{
							printf("联系人:%-15s\t",p->next->data.name);
							printf("学号  :%-15s\t",p->next->data.xuehao);
							printf("手机号:%-15s\t",p->next->data.shoujihao);
							printf("qq号  :%-15s\n",p->next->data.qqhao);
							i++;
						}

						p = p->next;
					}

					if(i == 0)
					{
						printf("没有找到满足条件的联系人\n");
						return F;
					}

					printf("满足条件的联系人有 %d 位\n",i);
					return T;

			case'3':scan3(s);
					zzz = strlen(s);

					while(head != p->next)
					{
						strncpy(buf,p->next->data.shoujihao,zzz);
						buf[zzz] = '\0';

						if(strcmp(buf,s) == 0)
						{
							printf("联系人:%-15s\t",p->next->data.name);
							printf("学号  :%-15s\t",p->next->data.xuehao);
							printf("手机号:%-15s\t",p->next->data.shoujihao);
							printf("qq号  :%-15s\n",p->next->data.qqhao);
							i++;
						}
						p = p->next;
					}

					if(i == 0)
					{
						printf("没有找到满足条件的联系人\n");
						return F;
					}

					printf("满足条件的联系人有 %d 位\n",i);

					return T;

			case'4':scan4(s);
					zzz = strlen(s);

					while(head != p->next)
					{
						strncpy(buf,p->next->data.qqhao,zzz);
						buf[zzz] = '\0';

						if(strcmp(buf,s) == 0)
						{
							printf("联系人:%-15s\t",p->next->data.name);
							printf("学号  :%-15s\t",p->next->data.xuehao);
							printf("手机号:%-15s\t",p->next->data.shoujihao);
							printf("qq号  :%-15s\n",p->next->data.qqhao);
							i++;
						}
						p = p->next;
					}

					if(i == 0)
					{
						printf("没有找到满足条件的联系人\n");
						return F;
					}

					printf("满足条件的联系人有 %d 位\n",i);
					return T;

			default:printf("输入错误");
					break;

		}

		printf("请重新输入操作指令:");
		zhiling(g);

	}
}

status delete_name(node p,char* z)
{
	if(p != NULL)
	{
		char l[20];
		elementype s[20];
		node head = p;

		while(z !=0)
		{
			switch(z[0])
			{
				case'1':printf("请输入需要删除的联系人的姓名:");
						scanf("%s",l);
						int a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.name ,l) == 0)
							{
								node temp = p->next;
								p->next = temp->next;
								free(temp);
								a++;
							}
							else
								p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						else
							printf("删除成功\n");

						return T;

				case'2':printf("请输入需要删除的联系人的学号:");
						scanf("%s",s);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.xuehao ,s) == 0)
							{
								node temp = p->next;
								p->next = temp->next;
								free(temp);
								a++;
							}
							else
								p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				case'3':printf("请输入需要珊除的联系人的手机号:");
						scanf("%s",s);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.shoujihao ,s) == 0)
							{
								node temp = p->next;
								p->next = temp->next;
								free(temp);
								a++;
							}
							else
								p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				case'4':printf("请输入需要删除的联系人的qq号:");
						scanf("%s",s);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.qqhao,s) == 0)
							{
								node temp = p->next;
								p->next = temp->next;
								free(temp);
								a++;
							}
							else
								p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}
						return T;

				default:printf("输入错误请重新输入\n");
						break;
			}

			zhiling(z);
		}
	}
}

status update_name(node p,char* z)
{
	if(NULL != p)
	{
		node head = p;
	 	char l[20];
		elementype mm[20];
		z[0] = '1';

		while(z != 0)
		{
			switch(z[0])
			{
				case'1':printf("请输入需要修改的联系人的姓名:");
						scanf("%s",l);
						int a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.name ,l) == 0)
							{
								char* pp;
								printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
								printf("请输入操作编号:");
								zhiling(pp);
								update_no(p,pp);
								a++;
							}
							p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				case'2':printf("请输入需要修改的联系人的学号:");
						scanf("%s",&mm);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.xuehao ,mm) == 0)
							{
								char* pp;
								printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
								printf("请输入操作编号:");
								zhiling(pp);
								update_no(p,pp);
								a++;
							}
							p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				case'3':printf("请输入需要修改的联系人的手机号:");
						scanf("%s",&mm);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.shoujihao ,mm) == 0)
							{
								char* pp;
								printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
								printf("请输入操作编号:");
								zhiling(pp);
								update_no(p,pp);
								a++;
							}
							p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				case'4':printf("请输入需要修改的联系人的qq号:");
						scanf("%s",&mm);
						a = 0;

						while(head != p->next)
						{
							if(strcmp(p->next->data.qqhao ,mm) == 0)
							{
								char* pp;
								printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
								printf("请输入操作编号:");
								zhiling(pp);
								update_no(p,pp);
								a++;
							}
							p = p->next;
						}

						if(a == 0)
						{
							printf("没有找到满足条件的联系人\n");
						}

						return T;

				default:printf("输入错误请重新输入\n");
						break;
			}
			zhiling(z);
		}
	}
}

status update_no(node p,char* pp)
{
	char l[20];
	elementype x[20];
	elementype s[20];
	elementype qq[20];

	while(pp != 0)
	{
		switch(pp[0])
		{
			case'1':scan1(l);
					strcpy(p->next->data.name,l);
					break;

			case'2':scan2(x);
					strcpy(p->next->data.xuehao,x);
					break;

			case'3':scan3(s);
					strcpy(p->next->data.shoujihao,s);
					break;

			case'4':scan4(qq);
					strcpy(p->next->data.qqhao,qq);
					break;

			default:printf("输入错误修改未成功\n");
					break;
		}

		printf("是否继续修改,1.修改,0.不修改\n");
		printf("请输入:");
		int gg;
		scanf("%d",&gg);

		if(gg == 1)
		{
			printf("1.更新姓名,2.更新学号,3.更新手机号,4.更新qq号\n");
			printf("请输入操作编号:");
			zhiling(pp);
		}
		else
			return T;
	}
}

int heap(node p,char* z)
{
	int len = length(p);
	node arr[len];
	int i;

	for(i = 0;i < len;i++)
	{
		arr[i] = p->next;
		p = p->next;
	}

	while(z != 0)
	{
		switch(z[0])
		{
			case'1':for(i = (len-3)/2;i >= 0;i--)
					heapadjust1(arr,i,len-2);

					for(i = len-2;i >= 0;i--)
					{
						swap(arr,0,i);
						heapadjust1(arr,0,i-1);
						printf("联系人:%-15s\t",arr[i]->data.name);
						printf("学号  :%-15s\t",arr[i]->data.xuehao);
						printf("手机号:%-15s\t",arr[i]->data.shoujihao);
						printf("qq号  :%-15s\n",arr[i]->data.qqhao);
						printf("\n");
					}
					return T;


			case'2':for(i = (len-3)/2;i >= 0;i--)
					heapadjust2(arr,i,len-2);

					for(i = len-2;i >= 0;i--)
					{
						swap(arr,0,i);
						heapadjust2(arr,0,i-1);
						printf("学号  :%-15s\t",arr[i]->data.xuehao);
						printf("联系人:%-15s\t",arr[i]->data.name);
						printf("手机号:%-15s\t",arr[i]->data.shoujihao);
						printf("qq号  :%-15s\n",arr[i]->data.qqhao);
						printf("\n");
					}
					return T;


			case'3':for(i = (len-3)/2;i >= 0;i--)
					heapadjust3(arr,i,len-2);

					for(i = len-2;i >= 0;i--)
					{
						swap(arr,0,i);
						heapadjust3(arr,0,i-1);
						printf("手机号:%-15s\t",arr[i]->data.shoujihao);
						printf("联系人:%-15s\t",arr[i]->data.name);
						printf("学号  :%-15s\t",arr[i]->data.xuehao);
						printf("qq号  :%-15s\n",arr[i]->data.qqhao);
						printf("\n");
					}
					return T;


			case'4':for(i = (len-3)/2;i >= 0;i--)
					heapadjust4(arr,i,len-2);

					for(i = len-2;i >= 0;i--)
					{
						swap(arr,0,i);
						heapadjust4(arr,0,i-1);
						printf("qq号  :%-15s\t",arr[i]->data.qqhao);
						printf("联系人:%-15s\t",arr[i]->data.name);
						printf("学号  :%-15s\t",arr[i]->data.xuehao);
						printf("手机号:%-15s\n",arr[i]->data.shoujihao);
						printf("\n");
					}
					return T;


			default:printf("输入错误请重新输入:");
					break;

		}
		zhiling(z);
	}

}

void swap(node* arr,int i,int j)
{
	node temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

void heapadjust1(node* arr,int n,int m)
{
	node temp = arr[n];
	int i;

	for(i = 2*n+1;i <= m;i = 2*i+1)
	{
		if(i < m && arr[i]->data.name[0] > arr[i+1]->data.name[0])
			i++;
		if(arr[i]->data.name[0] > temp->data.name[0])
		{
			break;
		}
		arr[n] = arr[i];
		n = i;
	}

	arr[n] = temp;
}

void heapadjust2(node* arr,int n,int m)
{
	node temp = arr[n];
	int i;

	for(i = 2*n+1;i <= m;i = 2*i+1)
	{
		if(i < m && arr[i]->data.xuehao[0] > arr[i+1]->data.xuehao[0])
			i++;
		if(arr[i]->data.xuehao[0] > temp->data.xuehao[0])
		{
			break;
		}
		arr[n] = arr[i];
		n = i;
	}

	arr[n] = temp;
}

void heapadjust3(node* arr,int n,int m)
{
	node temp = arr[n];
	int i;

	for(i = 2*n+1;i <= m;i = 2*i+1)
	{
		if(i < m && arr[i]->data.shoujihao[0] > arr[i+1]->data.shoujihao[0])
			i++;
		if(arr[i]->data.shoujihao[0] > temp->data.shoujihao[0])
		{
			break;
		}
		arr[n] = arr[i];
		n = i;
	}

	arr[n] = temp;
}

void heapadjust4(node* arr,int n,int m)
{
	node temp = arr[n];
	int i;

	for(i = 2*n+1;i <= m;i = 2*i+1)
	{
		if(i < m && arr[i]->data.qqhao[0] > arr[i+1]->data.qqhao[0])
			i++;
		if(arr[i]->data.qqhao[0] > temp->data.qqhao[0])
		{
			break;
		}
		arr[n] = arr[i];
		n = i;
	}

	arr[n] = temp;
}

void write(node p)
{
	FILE* file = fopen("cmd.txt", "w+");
	if(NULL == file)
	{
		perror("fopen");
		return;
	}

	node head = p;
	fseek(file,0,0);

	while(p->next != head)
	{
	   	fprintf(file, "%-15s\t", p->next->data.name);
	   	fprintf(file, "%-15s\t", p->next->data.xuehao);
	   	fprintf(file, "%-15s\t", p->next->data.shoujihao);
	   	fprintf(file, "%-15s\r\n", p->next->data.qqhao);
		p = p->next;
	}

	fclose(file);

}

void read(node p)
{
    FILE* file = fopen("cmd.txt", "r");
    if(NULL == file)
	{
		perror("fopen");
		return;
	}

   	fseek(file,0,0);
   	node head = p;

    while(!feof(file)) 
	{
		node newnode = (node)malloc(sizeof(struct node));
		p->next = newnode;
		newnode->next = head;
		fscanf(file, "%s", p->next->data.name);
		fscanf(file, "%s", p->next->data.xuehao);
		fscanf(file, "%s", p->next->data.shoujihao);
		fscanf(file, "%s", p->next->data.qqhao);
		p = p->next;
	}

	fclose(file);
}






猜你喜欢

转载自blog.csdn.net/qq_42720695/article/details/82423893
今日推荐