链表实现通讯录(2018年7月26日)

C语言实现,最终稿:

/*链表法实现C语言通讯录。*/

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

#define LEN sizeof(struct information)

typedef struct information
{
	char name[20];
	char id[20];
	char phone[20];
	char home[20];
	struct information *next;
}INFO;


/*face()用来显示通讯录的基本功能选择。*/
void face()
{
	
	printf("*****************************\n");
	printf("请输入你需要进行的操作号码:\n");
	printf("\t1:显示通讯录已有信息。\n");
	printf("\t2:添加通讯录人员。\n");
	printf("\t3:删除通讯录人员。\n");
	printf("\t4:修改通讯录人员信息。\n");
	printf("\t5:查找通讯录人员信息。\n");
	printf("\t6:保存通讯录至record.txt。\n");
	printf("\t7:显示文件内保存的通讯录。\n");
	printf("\t8:删除文件内保存的通讯录。\n");
	printf("\t9:清屏。\n");
	printf("\t0:退出通讯录。\n");
	printf("*****************************\n");
	
}


/*print()用来显示通讯录已有信息。*/
void print(INFO *head)
{
	INFO *p;
	p = head;
	system("clear");

	if(head!=NULL)
	{
		printf("已有成员如下:\n");
		do
		{
			printf("姓名:%s\n",p->name);
			printf("ID:%s\n",p->id);
			printf("电话号码:%s\n",p->phone);
			printf("家庭住址:%s\n\n",p->home);
			p=p->next;
		}while(p!=NULL);
	}
	else
	{
		printf("对不起!!没有任何联系人记录!!\n\n");
		printf("****************************\n");
	}
	
}


/*add()添加通讯录信息,将信息存入p0节点*/
INFO *add(INFO *head)
{
	INFO *p0 = NULL, *p1, *p2;
	
	p0 = (INFO *)malloc(LEN);
	p1 = head;
	p2 = head;
	
	printf("请输入你需要添加的成员信息:\n");
	printf("****************************\n");
	printf("姓名:");
	scanf("%s",p0->name);
	printf("ID:");
	scanf("%s",p0->id);
	printf("电话号码:");
	scanf("%s",p0->phone);
	printf("家庭住址:");
	scanf("%s",p0->home);
	
	/*再将p0节点按姓名顺序存入通讯录。*/
	if(head==NULL)
	{
		head=p0;
		p0->next=NULL;
	}
	else
	{
		while((strcmp(p0->name,p1->name)>0)&&(p1->next!=NULL))
		{
			p2=p1;
			p1=p1->next;
		}
		
		if((strcmp(p0->name,p1->name))<=0)
		{
			if(head==p1)
				head=p0;
			else
				p2->next=p0;
			p0->next=p1;
		}
		else
		{
			p1->next=p0;
			p0->next=NULL;
		}
		
		printf("恭喜你!!成功添加了联系人信息!!");
		printf("\n************************************************************\n");
		printf("\n\n");
	}
	
	return head;
	
			
	/*
	//在通讯录头部插入
	if(head == NULL)
	{
		head = p0;
		head->next = NULL;
	}
	else
	{
		p0->next = head->next;
		head->next = p0;
	}
	
	return head;
	
	//在通讯录尾部插入
	if(head == NULL)
	{
		head = p0;
		head->next = NULL;
	}
	else
	{
		while(p1->next!=NULL)
		{
			p2 = p1;
			p1 = p1->next;
		}
		p1->next = p0;
		p0->next = NULL;
	}
	
	return head;
	*/
	
}


/*delete()删除通讯录人员信息。*/
INFO *delete(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	
	p1 = head;
	p2 = head;
	
	printf("请以姓名为关键字,输入需要删除的成员信息:\n");
	printf("****************************\n");
	scanf("%s",name);
	
	if (head==NULL)
    {
		printf("很抱歉!没有任何联系人纪录!\n");
		printf("\n*******************************************************\n");
		return(head);
	}
	
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
			if(p1==head)
				head=p1->next;
			else
				p2->next=p1->next;
			free(p1);
			printf("删除记录成功!\n");
			return(head);
		}
		p2=p1;
		p1=p1->next;
	}
	
	printf("对不起!没有要删除的联系人纪录!\n");
	return head;
}


/*rev()修改通讯录人员信息。*/
void revise(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	
	p1 = head;
	p2 = head;
	
	printf("请以姓名为关键字,输入需要修改的成员信息:\n");
	printf("****************************\n");
	scanf("%s",name);
	
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
				printf("请根据提示修改成员信息:\n");
				printf("将姓名%s修改为:",p1->name);
				scanf("%s",p1->name);
				printf("将ID%s修改为:",p1->id);
				scanf("%s",p1->id);
				printf("将电话号码%s修改为:",p1->phone);
				scanf("%s",p1->phone);
				printf("将家庭住址%s修改为:",p1->home);
				scanf("%s",p1->home);
				printf("修改成功。\n");
				break;
		}
		p2=p1;
		p1=p1->next;
	}
	
	if(p1==NULL)
		printf("对不起!!没有该联系人的纪录!!\n");

	
}


/*search()查找通讯录人员信息。*/
void search(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	
	p1 = head;
	p2 = head;
	
	printf("请以姓名为关键字,输入需要查找的成员信息:\n");
	printf("****************************\n");
	scanf("%s",name);
	
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
			printf("查找到如下信息:\n");
			printf("姓名:%s\n",p1->name);
			printf("ID:%s\n",p1->id);
			printf("电话号码:%s\n",p1->phone);
			printf("地址:%s\n",p1->home);   
			break;
		}
		p2=p1;
		p1=p1->next;
	}
	
	if(p1==NULL)
		printf("对不起!!没有该联系人的纪录!!\n");

}


/*save()将本次运行产生的通讯录保存到文件内。*/
INFO *save(INFO *head)
{
	INFO *p;
	FILE *fp;
	
	p = head;
	
	fp = fopen("record.txt","a+");
	if(NULL == fp)
	{
		printf("文件打开失败。\n");
		return head;
	}
	
	while(p!=NULL)
	{
		fprintf(fp, "姓名:%s\n", p->name);
		fprintf(fp, "ID:%s\n", p->id);
		fprintf(fp, "电话号码:%s\n", p->phone);
		fprintf(fp, "家庭住址:%s\n\n", p->home);
		p=p->next;
	}
	
	fprintf(fp, "****************************\n");
	printf( "保存成功!\n\n");
	
	fclose(fp);
	return head;
	
}


/*load()函数打印文件内保存的信息。*/
INFO *load(INFO *head)
{
	FILE *fp;
	
	fp = fopen("record.txt", "r");
	if(NULL == fp)
	{
		printf("文件打开失败。\n");
		return head;
	}
	
	if (feof(fp))
    {
        printf("文件内无通讯录。\n");
    }
    else
    {
		char a;
        rewind(fp);      //将光标跳回到文件开头
		while(!feof(fp))
		{
			fscanf(fp,"%c",&a);
			printf("%c", a);
		}
    }
	
	fclose(fp);
	return head;
	
}


/*reset()函数删除文件内保存的信息。*/
INFO *reset(INFO *head)
{
	FILE *fp;
	
	fp = fopen("record.txt", "w");
	if(NULL == fp)
	{
		printf("文件打开失败。\n");
		return head;
	}
	
	fclose(fp);
	return head;
	
}


int main()
{
	char choose;
	INFO *head = NULL;
	
	head = (INFO *)malloc(LEN);
	system("clear");
	
	while(1)
	{
		face();
		scanf("%c",&choose);
		
		switch(choose)
		{
			case '0':system("clear");return 0;
			case '1':print(head);break;
			case '2':head = add(head);break;
			case '3':head = delete(head);break;
			case '4':revise(head);break;
			case '5':search(head);break;
			case '6':save(head);break;
			case '7':load(head);break;
			case '8':reset(head);break;
			case '9':system("clear");break;
			default :printf("输入错误!\n");break;
		}
	
	}
}

猜你喜欢

转载自blog.csdn.net/x18261294286/article/details/81226855
今日推荐