用单链表的写一个通讯录管理系统

本文介绍了如何使用C++实现一个基于单链表的通讯录管理系统。系统包括创建头结点、创建节点、插入节点等基本操作,并实现了添加、删除、修改、查找和显示联系人信息的功能。通过用户交互菜单,用户可以方便地进行各种操作。代码结构清晰,适合初学者巩固链表操作和实践结构体应用。
摘要由CSDN通过智能技术生成

本人前几天刚刚自学了单链表,趁热打铁,赶紧写一个小小的项目练练手。
单链表的实现在本人之前的博客中有:https://blog.csdn.net/weixin_57023347/article/details/117224051?spm=1001.2014.3001.5501

通讯录管理系统

保存人的信息有:	
名字   name
电话   telephone
性别   sex
年龄   age

用一个结构体来装这些信息:

struct infor{
	char name[20];
	int age;
	char sex[8];
	char telephone[16];
};
实现功能有:
增加联系人
删除联系人
修改联系人
寻找联系人
显示联系人

首先建立链表的基本功能创建头链表,创建节点,插入节点

struct addre* Creathead(){                        //创建头链表
	struct addre *headnode = (struct addre*)malloc(sizeof(struct addre));
	if (headnode == NULL){
		printf("malloc error\n");
	}
	headnode->next = NULL;
	return headnode;

}

struct addre* Creatlist(struct infor *list){      //创建节点
	struct addre *node = (struct addre*)malloc(sizeof(struct addre));
	if (node == NULL){
		printf("malloc error\n");
	}
	node->next = NULL;
	node->people.age = list->age;
	strcpy(node->people.name, list->name);
	strcpy(node->people.sex, list->sex);
	strcpy(node->people.telephone, list->telephone);

	return node;
}

void Addlist(struct addre *headnode,struct infor *list){ //插入节点
	struct addre *t = headnode;
	while (t->next != NULL){
		t = t->next;
	}
	struct addre *nodelist = Creatlist(list);
	t->next = nodelist;
	nodelist->next = NULL;
}

然后在实现通讯录的功能

void Addpeople(struct addre* node){                     //添加人的信息
	struct infor *a=malloc(sizeof(struct infor));       // 创建动态信息结构体指针
	if (a == NULL){
		printf("malloc error\n");
	}
	printf("请输入名字\n");
	scanf("%s", a->name);
	printf("请输入年龄\n");
	scanf("%d", &a->age);
	printf("请输入性别\n");
	scanf("%s", a->sex);
	printf("请输入电话号码\n");
	scanf("%s", a->telephone);
	Addlist(node, a);                        //用尾插法插入该人信息
	printf("添加成功!\n");
}
void Deletepeople(struct addre *node){                //删除人的信息
	char *str = malloc(sizeof(char)* 10);
	if (str == NULL){                                 //通过名字寻找
		printf("malloc error\n");
	}
	printf("请输入要删除人的姓名\n");
	scanf("%s", str);
	struct addre *strat = node;
	struct addre *end = node->next;
	int flag = 0;                                    //判断是否找到 0为未找到,1 找到
	while (end){                    //判断end的  不然会越界
		if (strcmp(end->people.name, str) == 0){
			flag = 1;
			break;
		}
		node = node->next;                           //到下一个链表
		strat = node;                               //一个指向前面 一个指向后面,删除将end删除,前面那个直接指向end的指向
		end = node->next;
	}
	if (flag){
		strat->next = end->next;
		printf("删除成功\n");
		free(end);
	}
	else{
		printf("没找到!\n");
	}
}

void Modifyinfor(struct addre *node){              //修改人的信息
	char *str = malloc(sizeof(char)* 10);          //通过名字寻找
	if (str == NULL){
		printf("malloc error\n");
	}
	printf("请输入要修改人的姓名\n");
	scanf("%s", str);
	int flag = 0;
	while (node){
		if (strcmp(node->people.name, str) == 0){
			flag = 1;
			break;
		}
		node = node->next;
	}
	if (flag){
		printf("请重新输入该人信息\n");
		printf("请输入名字\n");
		scanf("%s", node->people.name);
		printf("请输入年龄\n");
		scanf("%d", &node->people.age);
		printf("请输入性别\n");
		scanf("%s", node->people.sex);
		printf("请输入电话号码\n");
		scanf("%s", node->people.telephone);
		printf("修改成功\n");
	}
	else{
		printf("没找到\n");
	}
}
void Foundpeople(struct addre *node){                //找到某人的信息并打印出来
	char *str = malloc(sizeof(char)* 10);            //通过名字寻找
	if (str == NULL){
		printf("malloc error\n");
	}
	printf("请输入要查找人的姓名\n");
	scanf("%s", str);
	int flag = 0;
	while (node){
		if (strcmp(node->people.name, str) == 0){
			flag = 1;
			break;
		}
		node = node->next;
	}
	if (flag){
		printf("name\tage\tsex\ttelephone\n");
		printf("%s\t", node->people.name);
		printf("%d\t", node->people.age);
		printf("%s\t", node->people.sex);
		printf("%s\t", node->people.telephone);
	}
	else{
		printf("没找到!\n");
	}
}

void Display(struct addre *node){
	struct addre *pmove = node->next; //要从头节点的下一个节点显示信息
	printf("name\tage\tsex\ttelephone\n");
	while (pmove){
		printf("%s\t%d\t%s\t%s\n", pmove->people.name, pmove->people.age, pmove->people.sex, pmove->people.telephone);
		pmove = pmove->next;
	}
}

其它代码
菜单:

void Menu(){
	printf("+-----------------+\n");
	printf("+-1.add   2.delet-+\n");
	printf("+-3.modify 4.seek-+\n");
	printf("+-5.display6.exit-+\n");
	printf("+-----------------+\n");
	printf("Please Enter Your Select\n");
}

本人使用的时多文件的方式上面的代码都在函数定义的源文件里实现
main函数的源文件代码:

#include"addressbank.h"

/***********************
信息:
名字   name
年龄   age
电话   telephone
性别   sex
功能:
	增加
	删除
	修改
	寻找
	打印
	显示
***********************/
int main(){
	struct addre* node = Creathead();
	int quit = 0;
	while (!quit){
		
		Menu();
		int select = 0;
		scanf("%d", &select);
		switch (select){
		case 1:
			Addpeople(node);
			break;
		case 2:
			Deletepeople(node);
			break;
		case 3:
			Modifyinfor(node);
			break;
		case 4:
			Foundpeople(node);
			break;
		case 5:
			Display(node);
			break;
		case 6:
			quit = 1;
			break;
		default:
			printf("Enter Error!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

声明的头文件:

#ifndef __ADDRESSBANK_H__
#define __ADDRESSBANK_H__

#include<stdio.h>
#include<string.h>
struct infor{//信息结构体
	char name[20];
	int age;
	char sex[8];
	char telephone[16];
};
struct addre{ //链表
	struct infor people;
	struct addre *next;
};
//功能函数
extern void Menu();
extern void Addpeople(struct addre *node);
extern void Deletepeople(struct addre *node);
extern void Modifyinfor(struct addre *node);
extern void Foundpeople(struct addre *node);
extern void Display(struct addre *node);
//下面未链表函数
extern struct addre* Creatlist(struct infor *list);
extern struct addre* Creathead();
extern void Addlist(struct addre *headnode, struct infor *list);

#endif

代码可直接复制使用,如有不足请提出,后续修改谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值