通讯录程序(链表版)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1024

struct node
{
	int num ;
	char name[N];
	char telephone[N];
	char address[N];
	struct node * next;
};

typedef struct node Node;
typedef struct node * Link;

void creat_empty_link(Link *head)
{
	*head = (Link)malloc(sizeof(Node));
	(*head)->next = NULL;
}

void insert_node(Link *head,Link new_node)
{
	Link temp = *head;
	
	new_node = (Link)malloc(sizeof(Node));
	if(new_node == NULL)
	{
		printf("malloc error!\n");
		exit(-1);
	}

	printf("请输入联系人姓名:");
	scanf("%s",new_node->name);
	printf("请输入联系人号码:");
	scanf("%s",new_node->telephone);
	printf("请输入联系人住址:");
	scanf("%s",new_node->address);

	if((*head)->next == NULL)
	{
		(*head)->next = new_node;
		new_node->next = NULL;
		return;
	}

	while(temp->next != NULL)
	{
		temp = temp->next;
		(new_node->num)++;
	}
	temp->next = new_node;
	new_node->next = NULL;

}

void del_node(Link *head)
{
	char name[N];
	Link temp;
	Link p;
	temp = *head;
	p = temp;
	temp = temp->next;

	scanf("%s",name);

	while(temp != NULL)
	{
		if((strcmp((temp->name),name)) == 0)
		{
			p->next = temp->next;
			free(temp);
			printf("删除成功!\n");
			break;
		}
		else
		{
			p = temp;
			temp = temp->next;
		}
	}
	if(temp == NULL)
	{
		printf("无该联系人!\n");
		return;
	}

}

void display_node(Link * head)
{
	Link temp;
	temp = (*head)->next;

	if((*head)->next == NULL)
	{
		printf("还未添加联系人!\n");
		return ;
	}
	printf("序号       姓名       联系方式        家庭住址\n");
	while(temp != NULL)
	{
		printf("%4d  %5s  %15s   %15s\n",temp->num,temp->name,temp->telephone,temp->address);
		temp = temp->next;
	}
	printf("\n");

}

void search(Link *head,char name[])
{
	Link temp;
	temp = *head;
	while(temp != NULL)
	{
		if((strcmp((temp->name),name)) == 0)
		{	printf("序号      姓名      联系方式        家庭住址\n");
			printf("%4d    %5s    %15s     %15s\n",temp->num,temp->name,temp->telephone,temp->address);
			break;
		}
		else
		{
			temp = temp->next;
		}
	}
	if(temp == NULL)
	{
		printf("查无此人!\n");
		return;
	}
}

void menu()
{
	printf("*******欢迎使用通讯录*******\n");
	printf("*                                      *\n");
	printf("*1.          添加联系人信息            *\n");
	printf("*2.          显示联系人信息            *\n");
	printf("*3.          删除联系人信息            *\n");
	printf("*4.          修改联系人信息            *\n");
	printf("*5.          查找联系人信息            *\n");
	printf("*6.            退出通讯录              *\n");
	printf("*********************\n");
	printf("请选择您需要的操作(1~6):");
}

void change(Link *head,Link new_node)
{
	Link temp;
	temp = *head;
	int i;
	char name[N];
	char telephone[N];
	char address[N];

	printf("请输入您需要修改的联系人姓名:");
	scanf("%s",name);
	
	while(temp != NULL)
	{
		if((strcmp((temp->name),name)) == 0)
		{
			printf("请选择要修改的选项:\n");
			printf("1.姓名\n");
			printf("2.联系方式\n");
			printf("3.家庭住址\n");
			scanf("%d",&i);
			switch(i)
			{
				case 1:
					{
						printf("请输入新的姓名:");
						scanf("%s",name);
						strcpy((temp->name),name);
					}
					break;
				case 2:
					{
						printf("请输入新的联系方式:");
						scanf("%s",telephone);
					 	strcpy((temp->telephone),telephone);
					}
					 break;
				case 3:
					{ 
					 	printf("请输入新的家庭住址:");
						scanf("%s",address);
						strcpy((temp->address),address);
					}
					printf("修改成功!\n");
					break;
				default:
					printf("输入有误!\n");
			}
			break;
		}
		else
			temp = temp->next;
	}
	if(temp == NULL)
	{
		printf("无该联系人!\n");
	}
}

int choose(Link *head,Link new_node)
{
	Link temp;
	int n;
	int data;
	int choice;
	char name[N];
	temp = *head;
	scanf("%d",&n);
	switch(n)
	{
		case 1:
 				{  
 				 	insert_node(head,new_node);
					printf("添加成功!\n");
					for(data = 0;;data++)
					{
						printf("是否继续添加?(1/0):");
						scanf("%d",&choice);
						if(choice == 1)
						{
							insert_node(head ,new_node);
							printf("添加成功!\n");
						}
						else 
						{
							system("clear");
							menu();
							choose(head,new_node);
							break;
						}
					}
				}
			   break;
		case 2:
			   {
					display_node(head);
					printf("\n");
					printf("请选择您接下来的操作:");
					choose(head,new_node);
			   }
			   break;
		case 3:
			   {
				   if((*head)->next == NULL)
				   {
						printf("无联系人可删除,请先添加!\n");
						system("clear");
						menu();
					 	choose(head,new_node);
				   }
				   else
				   {
					 	printf("请输入需要删除的联系人姓名:");
						del_node(head);
						printf("\n");
						printf("请选择您接下来的操作:");
						choose(head,new_node);
				   } 
			   }
			   break;
		case 4:
			   {
					if((*head)->next ==  NULL)
					{
						printf("无联系人可修改,请先添加!\n");
						system("clear");
						menu();
					}
					else
					{
						change(head,new_node);
						printf("\n");
						printf("请选择接下来的操作:");
						choose(head,new_node);
					}
			   }
			   break;
		case 5:
			   {
					if((*head)->next == NULL) 
					{
						printf("无联系人可查找,请先添加!\n");
						printf("\n");
					  	printf("请选择您接下来的操作:");
						choose(head,new_node);
						return;
					}
					printf("请输入要查找的联系人姓名:");
					scanf("%s",name);
					search(head,name);
					printf("\n");
					printf("请选择接下来的操作:");
					choose(head,new_node);
			   }
		case 6:
			   {
				   system("clear");
			 	   printf("*********************\n");
				   printf("*                                      *\n");
				   printf("*            谢谢使用通讯录            *\n");
				   printf("*                                      *\n");
				   printf("*********************\n");
			   }
			   break;

		default:
			   {
					printf("输入有误,请重新输入!\n");
					choose(head,new_node);
			   }
			   break;

	}
}



int main()
{	
	Link head = NULL;
	Link new_node = NULL;
	system("clear");
	menu();
	creat_empty_link(&head);
	choose(&head,new_node);
	
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值