[C计划—04] 利用单链表实现通讯录管理系统

经过两周多的学习,把C语言的基本语法以及数据结构的链表部分复习了一遍,下面利用单链表实现一个通讯录的管理系统,里面涉及链表元素的插入(头插法、尾插法)、删除、查询、修改、打印这几个基础部分。

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

typedef struct address
{
	char name[10];
	long num;
	struct address* next;
}addr;

void add_new(addr **list);
void find_someone(addr* list);
void del_someone(addr** list);
void modify_someone(addr** list);
void show(addr* list);
void free_all(addr** list);

void show(addr* list)
{
	addr* L2;
	int count = 1;
	
	L2 = list;
	while (L2 != NULL)
	{
		printf("-----%d------\n", count);
		printf("%s: %u\n", L2->name, L2->num);
		L2 = L2->next;
		count++;
	}
	if (L2 = NULL)
	{
		printf("EMPTY!!!");
	}
}

void add_new(addr** list)
{
	addr *new;
	static addr *tail;//尾指针要定义成静态变量
	new = (addr*)malloc(sizeof(addr));

	printf("输入添加联系人的name:\n");
	scanf_s("%s", new->name, sizeof(new->name));
	printf("输入添加联系人的num:\n");
	scanf_s("%d", &(new->num));

	if ((*list) == NULL)
	{
		(*list) = new;
		new->next = NULL;
	}
	else
	{
		tail->next = new;
		new->next = NULL;
	}
	tail = new;
	
	show(*list);
}

void find_someone(addr *list)
{
	addr *target,*temp;
	target = (addr*)malloc(sizeof(addr));
	printf("输入查询联系人的name:\n");
	scanf_s("%s", target->name, sizeof(target->name));
	
	temp = list;
	while (temp != NULL)
	{
		if (!(strcmp(temp->name, target->name)))
		{
			printf("%s: %u\n", temp->name, temp->num);
			break;
		}
		else if((temp->next == NULL) && (strcmp(temp->name, target->name)))
		{
			printf("未查询到结果!\n");
			break;
		}
		temp = temp->next;
	}
}

void del_someone(addr** list)
{
	addr* old,*later,*temp,*previous;

	printf("输入你要删除的通讯name:\n");
	old = (addr*)malloc(sizeof(addr));
	scanf_s("%s",old->name,sizeof(old->name));

	previous = NULL;
	temp = *list;
	later = temp->next;
	while (temp != NULL)
	{
		if (!(strcmp(temp->name, old->name)))
		{
			
			if (previous != NULL)
			{
				later = temp->next;
				previous->next = later;
				temp = later;
			}
			else
			{
				*list = temp->next;
			}
			break;
		}
		else if (strcmp(temp->name, old->name))
		{
			previous = temp;
			temp = temp->next;
			later = temp->next;
			continue;
		}
		else if ((temp->next == NULL) && (strcmp(temp->name, old->name)))
		{
			printf("未查询到结果!\n");
			break;
		}
		
	}
	
	show(*list);
}

void modify_someone(addr** list)
{
	addr* target, * temp;
	target = (addr*)malloc(sizeof(addr));
	printf("输入修改的联系人的name:\n");
	scanf_s("%s", target->name, sizeof(target->name));

	temp = *list;
	while (temp != NULL)
	{
		if (!(strcmp(temp->name, target->name)))
		{
			printf("OK!!!\n");
			printf("输入修改联系人的新name:\n");
			scanf_s("%s", temp->name, sizeof(temp->name));
			printf("输入修改联系人的新num:\n");
			scanf_s("%d", &(temp->num));
			break;
		}
		else if ((temp->next == NULL) && (strcmp(temp->name, target->name)))
		{
			printf("未查询到结果!\n");
			break;
		}
		temp = temp->next;
	}
	show(*list);
}

void free_all(addr** list)
{
	addr* temp1,*temp2;
	temp1 = (*list)->next;
	while (temp1)
	{
		temp2 = temp1->next;
		free(temp1);
		temp1 = temp2;
	}

}

int main()
{
	printf("1.插入新的联系人。\n");
	printf("2.查找已有联系人。\n");
	printf("3.删除已有联系人。\n");
	printf("4.修改已有联系人。\n");
	printf("-1.退出程序。\n");
	printf("请输入要进行的操作编号:\n");

	int input;
	addr *list;
	list = (addr*)malloc(sizeof(addr));//分配内存
	list = NULL;

	while (scanf_s("%d", &input) != EOF)
	{
		switch (input)
		{
		case 1:
			add_new(&list); 		break;
		case 2:
			find_someone(list); 		break;
		case 3:
			del_someone(&list); 		break;
		case 4:
			modify_someone(&list); 		break;
		}
		if (input == -1) { free_all(&list); break; }
		printf("请输入要进行的操作编号:\n");
	}
	
	printf("程序退出,欢迎下次使用!");
	return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值