有文件存储的通讯录

1.对通讯录加入可以把联系人存入文件中,也可以从文件中读取联系人的信息。

#define  _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
//**********联系人的信息**********
struct person
{
	char name[32];
	int age;
	char sex[4];
	char phone[12];
	char address[100];
};

struct student 
{
	struct person man;
	struct student *next;
};

void Menu()
{
	printf("***********************************************\n");
	printf("****1. 添加指定联系人   2. 删除指定联系人  ****\n");
	printf("****3. 修改指定联系人   4. 显示所有联系人  ****\n");
	printf("****5. 查找指定联系人   6. 清空所有联系人  ****\n");
	printf("****7. 按名字排序       0. 退出            ****\n");
	printf("****8. 将信息存入文件中 9. 从文件中读取信息****\n");
	printf("***********************************************\n");
}
//*************添加联系人*****************
void Insert(struct student **p)
{
	int i = 0;
	int n = 0;
	struct student *q = (*p);
	printf("请输入要添加联系人的个数:");
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		q = malloc(sizeof(struct student));
		printf("\n请输入联系人的名字:");
		scanf("%s",  q->man.name);
		printf("\n请输入联系人的年龄:");
		scanf("%d", &q->man.age );
		printf("\n请输入联系人的性别:");
		scanf("%s", q->man.sex );
		printf("\n请输入联系人的电话:");
		scanf("%s", q->man.phone);
		printf("\n请输入联系人的地址:");
		scanf("%s", q->man.address);
		q->next = *p;
		*p = q;
	}

}
//***********显示所有联系人************
void show(struct student *p)
{
	do
	{
		if(p == NULL)
		{
			printf("您的通信录为空\n");
			break;
		}
		printf("姓名为%s  年龄为%d  性别为%s  电话为%s  住址为%s\n", p->man.name,p->man.age,p->man.sex,p->man.phone,p->man.address);
		p = p->next;
	}while(p != NULL);
}
//**************删除指定联系人************
void Drop(struct student **p)
{

	char a[20] = "0";
	struct student *q = *p;
	struct student *head = *p;
	assert(*p);
	printf("请输入你要删除的姓名:");
	scanf("%s", a);
	while(1)
	{
		if(!strcmp(q->man.name,a))
		{
			if(head == q)//删除第一个联系人
			{
				*p = (*p)->next;
			}
			else
			{
				head->next = q->next;
			}
			break;
		}
		head = q;
		q = q->next; 
	}
	free(q);
}
//***********修改指定联系人的信息**********
void Amend(struct student **p)
{

	char a[20] = "0";
	struct student *q = (*p) ;
	assert(*p);
	printf("请输入要修改的联系人的姓名:");
	scanf("%s", a);
	while(q != NULL)
	{
		if((!strcmp(q->man.name,a))&& q != NULL)
		{
			printf("\n请输入新联系人的名字:");
			scanf("%s", q->man.name);
			printf("\n请输入新联系人的年龄:");
			scanf("%d", &q->man.age);
			printf("\n请输入新联系人的性别:");
			scanf("%s", q->man.sex);
			printf("\n请输入新联系人的电话:");
			scanf("%s", q->man.phone);
			printf("\n请输入新联系人的地址:");
			scanf("%s", q->man.address);
			break;
		}
		q = q->next; 
	}
	if(q == NULL)
	{
		printf("通信录中没有这个人\n");
	}
}
//*************查找指定联系人*************
void Find(struct student *p)
{

	char a[20] = "0";
	struct student *q = p;
	assert(p);
	printf("请输入你要查找的姓名:");
	scanf("%s", a);
	while(q != NULL)
	{
		if(!strcmp(q->man.name,a)&& q != NULL)
		{
			printf("姓名为%s  年龄为%d  性别为%s  电话号为%s  住址为%s\n", q->man.name,q->man.age,q->man.sex,q->man.phone,q->man.address);
			break;
		}
		q = q->next; 
	}
	if(q == NULL)
	{
		printf("查无此人\n");
	}
}

//**************交换两个结构体里的内容***********
void Exchange(struct student **p,struct student **head)
{
	struct student *a = (struct student *)malloc(sizeof(struct student));
	strcpy(a->man.name , (*p)->man.name);
	strcpy((*p)->man.name , (*head)->man.name);
	strcpy((*head)->man.name , a->man.name);

	a->man.age = (*p)->man.age;
	(*p)->man.age = (*head)->man.age;
	(*head)->man.age = a->man.age;

    strcpy(a->man.sex , (*p)->man.sex);
	strcpy((*p)->man.sex , (*head)->man.sex);
	strcpy((*head)->man.sex , a->man.sex);

	strcpy(a->man.phone , (*p)->man.phone);
	strcpy((*p)->man.phone , (*head)->man.phone);
	strcpy((*head)->man.phone , a->man.phone);

	strcpy(a->man.address , (*p)->man.address);
	strcpy((*p)->man.address , (*head)->man.address);
	strcpy((*head)->man.address , a->man.address);
	free(a);
	a = NULL;
}
//**********按名字对所有联系人排序**********
void Sort(struct student **p)
{

	struct student *q = (*p);
	struct student *head = q;
	assert(*p);
	while(q!=NULL)
	{
		head = q;
		while(head != NULL)
		{
			if(strcmp(q->man.name ,head->man.name)>0)
			{
				Exchange(&q,&head);//交换两结构体内的东西
			}
			head = head->next;
		}
		q = q->next;
	}
}
//***********释放所有动态内存开辟的空间***********
void Allfree(struct student **p)
{
	struct student *q = (*p);
	while(q != NULL)
	{
		q = (*p)->next;
		free(*p);
		*p = NULL;
		q = *p;
	}
}
//*************写入文件中************
void Save(struct student *p)
{
	struct student *head = p;
	FILE* pf = fopen("text.txt","w");
	if(pf == NULL)
	{
		printf("打开文件失败\n");
		exit(1);
	}
	while(head != NULL)
	{
		fwrite(&head->man,sizeof(head->man),1,pf);//将链表的联系人信息写入文件中
		head = head->next ;
	}
	fclose(pf);
	
}
//************从文件中读取*************
void Load(struct student** p)
{
	struct person q;
	FILE* pf = fopen("text.txt","r");
	if(pf == NULL)
	{
		printf("文件无法打开\n");
		return ;
	}
	while(1)
	{
		struct student *head = (struct student *)malloc(sizeof(struct student));
		if(fread(&q,sizeof(struct person),1,pf) != 1)
			break;
		head->man = q;
		head->next = NULL;
		head->next = *p;
		*p = head;
	}
	fclose(pf);
}

int main()
{
	int i = 0;
	struct student *p = NULL;//首指针
	do
	{
		Menu();
		printf("请选择:");
		scanf("%d", &i);
		switch(i)
		{
			case 1:
				Insert(&p);
				break;
			case 2:
				Drop(&p);
				break;
			case 3:
				Amend(&p);
				break;
			case 4:
				show(p);
				break;
			case 5:
				Find(p);
				break;
			case 6:
				Allfree(&p);
				break;
			case 7:
				Sort(&p);
				break;
			case 8:
				Save(p);
				break;
			case 9:
				Load(&p);
				break;
			case 0://退出时,将链表内的信息存入文件中,并且释放动态开辟的空间
				Save(p);
				Allfree(&p);
				printf("退出通信录\n");
				break;
			default:
				printf("请重新输入\n");
				break;
		}
	}while(i);
	free(p);
	p = NULL;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ksaila/article/details/80555600