c++顺序表实现通讯簿管理

【问题描述】通讯簿是一个线性表,可以存储一定数量的联系人记录,提供查找、插入、删除和修改等操作。通讯簿的特点是以查找为主要操作,要求快速查找到指定对象的位置,故宜采用具有随机访问功能的顺序表。

【数据结构】使用顺序表SeqList建立通讯簿。作为表项的联系人记录,至少应包括以下属性:

{ 序号,姓名,与本人关系,电话号码}

其中序号具有唯一性。序号和姓名可作为查找的主要关键字。与本人关系可枚举为“亲人”、“朋友”和“同事”,主要作用是为联系人分组,并作为次要关键字。

将上述联系人记录定义为一个结构(struct),在主程序中建立模板类顺序表SeqList的对象时用该结构实例化表结点的类型。

【主要功能】程序应为用户提供操作选择界面,必要的操作包括:查找某人电话号码,添加新记录,修改记录,删除记录,打印亲人清单、朋友清单或同事清单以及退出等。另外,为初始化方便,原始数据可存储在磁盘文件中。

【编程环境】visual studio 2023

  •  控制台菜单:

 部分功能截图:

 

 

 头文件(通讯录.h)部分,包含全部内容的实现:

#pragma once
#include<iostream>
#include<stdlib.h>
#include<Windows.h>
using namespace std;
const int defaultSize = 100;
struct human {
	int Id;
	string Name;	//姓名
	string rela;	//与本人关系
	string phoneNum;//电话号码
};
class book {
protected:
	human* Hum;		
	int size;		//通讯录大小
	int last;		//当前已存表项的最后位置 从0开始
public:
	book(int sz = defaultSize) {
		if (sz > 0) {			//通过指定参数sz定义数组长度									
			size = sz; last =0;	//置表实际长度为空
			Hum = new human[size];		//创建顺序表存储数组
			if (sz == NULL)			//动态分配失败
			{
				cerr << "动态分配错误!" << endl;
				exit(1);
			}
			else
				cout << "构建成功,当前通讯录可容纳 " << sz << " 人" << endl;
		}
	}
	~book() { delete []Hum; }
	void Insert();	//输入项目
	void findNum();//查找某人电话
	void showAll();	//显示所有记录
	void showTong();	//显示所有同事
	void showFamly();	//显示所有亲人
	void showFriend();	//显示所有朋友
	void menu();		//显示菜单
	void endFunc();		//结束操作
	void change();		//修改记录
	void Delete();		//删除记录
	void Del(int aimId);		//打包删除部分代码
};

//打包删除部分代码/
void book::Del(int aimId)
{
	cout << "是否确认删除该对象?" << endl;
	cout << "1:是\t输入其他:否" << endl;
	int i;
	cin >> i;
	if (i == 1)
	{
		if (last == 1)
		{
			last--;
			cout << "删除成功,当前通讯录剩余" << last << "人" << endl;
			return;
		}
		for (int j = aimId; j < last; j++)
			Hum[j] = Hum[j + 1];		//前移填充
		last--;
		cout << "删除成功,当前通讯录剩余" << last << "人" << endl;
	}
	else {
		menu();
	}
}
/end of 删除部分代码//

//插入记录/
void book::Insert() {

	if (last == size)
	{
	
		cout << "空间已满,无法插入!" << endl;
		cout << "将在三秒后返回主菜单" << endl;
		Sleep(3 * 1000);
		menu();
	}
	string Name;	//姓名
	string rela;	//与本人关系
	string phoneNum;//电话号码
	Hum[last].Id = last;
	cout << "当前通讯录有 " << last << " 人"<<endl;
		
		cout << "请输入第 " << last+ 1 << " 号联系人的姓名: ";
		cin >> Name;
		Hum[last].Name = Name;
		cout << "请输入您与第 " << last + 1 << " 号联系人的关系: ";
		cin >> rela ;
		Hum[last].rela = rela;
		cout << "请输入第 " << last + 1 << " 号联系人的联系电话: ";
		cin >> phoneNum;
		Hum[last].phoneNum = phoneNum;
		last++;
		cout << "当前通讯录有 " << last << " 人" << endl;	
		
		cout << "输入“1”返回菜单或输入“2”继续添加联系人" << endl;
		int a;
		cin >> a;
		switch (a)
		{
		case(1):
			menu();
			break;
		case(2):
			Insert();
			break;
		}
}
///end of 插入记录//

/查找某人电话///
void book::findNum() {
	string name;		//需要查找的人的名字
	reCin2:			//goto标记 重新查找
	cout << "请输入需要查找的人的名字: " << endl;
	cin >> name;
	bool flag=0;	//标记查找是否成功
	for (int i = 0; i < last; i++)
	{
		if (Hum[i].Name == name)
		{
			cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
			cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
			flag = 1;	//标记已找到该对象
		}
	}
	if (flag == 0)
	{
		cout << "抱歉,未找到该对象" << endl;
		cout << "请选择:" << endl;
		cout << "1:重新输入\t2:返回主菜单";
		int n;
		cin >> n;
		if (n == 1)
		{
			goto reCin2;	//重新查找
		}
		else if (n == 2)
			menu(); 
		return;
	}
	else
	{
		cout << "查找完成" << endl;
		endFunc();
		return;
	}
}
end of 查找某人电话

///显示所有记录
void book::showAll() {
	cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话"<<endl;
	for (int i = 0; i < last; i++)
	{
		cout << Hum[i].Id <<" \t\t" << Hum[i].Name <<"\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum<<endl;
	}
	cout << "打印完成" << endl;
	endFunc();
}
//end of 显示所有记录

///显示所有同事
void book::showTong() {
	cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
	for (int i = 0; i < last; i++)
	{
		if(Hum[i].rela=="同事")
		cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
	}
	cout << "打印完成" << endl;
	endFunc();
}
//end of 显示所有同事

///显示所有亲人
void book::showFamly() {
	cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
	for (int i = 0; i < last; i++)
	{
		if (Hum[i].rela == "亲人")
			cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
	}
	cout << "打印完成" << endl;
	endFunc();
}
//end of 显示所有亲人

///显示所有朋友
void book::showFriend() {
	cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
	for (int i = 0; i < last; i++)
	{
		if (Hum[i].rela == "朋友")
			cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
	}
	cout << "打印完成" << endl;
	endFunc();
}
//end of 显示所有朋友

/显示菜单
void book::menu() {
	system("cls");
	cout << "当前通讯录可容纳 " << size << " 人" << endl;
	cout << "当前通讯录已存 " << last << " 人" << endl;
	cout << "*****************************************" << endl;
	cout << "*\t请输入数字选择所需功能\t\t*" << endl;
	cout << "*\t1:插入联系人\t\t\t*" << endl;
	cout << "*\t2:修改联系人\t\t\t*" << endl; 
	cout << "*\t3:删除联系人\t\t\t*" << endl;
	cout << "*\t4:打印所有联系人\t\t*" << endl;
	cout << "*\t5:打印所有亲人\t\t\t*" << endl;
	cout << "*\t6:打印所有朋友\t\t\t*" << endl;
	cout << "*\t7:打印所有同事\t\t\t*" << endl;
	cout << "*\t8:查找联系人\t\t\t*" << endl;
	cout << "*\t9:退出系统\t\t\t*" << endl;
	cout << "*****************************************" << endl;
	cout << "请输入数字选择功能:" ;
	int k;
	cin >> k;
	switch (k)
	{
	case(1):
	{
		Insert();
		break;
	}
	case(2):
	{
		change();
		break;
	}
	case(3):
	{
		Delete();
		break;
	}

	case(4):
	{
		showAll();
		break;
	}
	case(5):
	{
		showFamly();
		break;
	}case(6):
	{
		showFriend();
		break;
	}case(7):
	{
		showTong();
		break;
	}
	case(8):
	{
		findNum();
		break;
	}
	case(9):
	{
		ExitProcess;
	}
	}
}
///end of 显示菜单/

///结束操作//
void book::endFunc() {
	cout << "输入“1”返回菜单或输入“2”退出通讯录系统:" << endl;
	int a;
	cin >> a;
	switch (a)
	{
	case(1):
		menu();
		break;
	case(2):
		break;
	}

}
///end of 结束操作///

///修改记录/
void book::change() {
	cout << "请输入想要修改联系人的姓名:";		//这里考虑实际使用,查询姓名更为方便
	string name;
	int aimId;	//记录操作对象的ID
	cin >> name; 
	int flag=0;	//记录是否查询到该对象
	
	for (int i = 0; i < last; i++)
	{
		if (Hum[i].Name == name)
		{
			if(flag==0)
			cout << "该对象当前记录为:" << endl;
			aimId = Hum[i].Id;
			cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
			cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
			flag++;
		}
	}
	if (flag==0)
	{
		cout << "查无此人,请检查是否输入错误!" << endl;
		cout << "请输入“1”重新查询或输入“2”返回菜单: ";
		int i = 0;
		cin >> i;
		switch (i)
		{
		case(1):
		{
			change();
			break;
		}
		case(2):
		{
			menu();
			break;
		}
	
		}
	}
	else
	{
		if (flag == 1)	//只查询到一个对象时
		{
			cout << "您想要修改该对象的?" << endl;
			cout << "1:姓名\t2:关系\t3:联系电话" << endl;
			int i = 0;
			cin >> i;
			switch (i)
			{
			case(1):
			{
				cout << "您要将其姓名修改为:";
				string newName;
				cin >> newName;
				Hum[aimId].Name = newName;
				break;
			}
			case(2):
			{
				cout << "您要将其关系修改为:";
				string newRela;
				cin >> newRela;
				Hum[aimId].rela = newRela;
				break;
			}case(3):
			{
				cout << "您要将其电话修改为:";
				string newNum;
				cin >> newNum;
				Hum[aimId].phoneNum = newNum;
				break;
			}
			}
		}	  
		else       //查询到不止一个对象时
		{
			cout << "请输入想要修改对象的Id:";
			cin >> aimId;
			conChange:		//goto标记 继续修改
			cout << "您想要修改该对象的?" << endl;
			cout << "1:姓名\t2:关系\t3:联系电话" << endl;
			int i = 0;
			cin >> i;
			switch (i)
			{
			case(1):
			{
				cout << "您要将其姓名修改为:";
				string newName;
				cin >> newName;
				Hum[aimId].Name = newName;
				break;
			}
			case(2):
			{
				cout << "您要将其关系修改为:";
				string newRela;
				cin >> newRela;
				Hum[aimId].rela = newRela;
				break;
			}case(3):
			{
				cout << "您要将其电话修改为:";
				string newNum;
				cin >> newNum;
				Hum[aimId].phoneNum = newNum;
				break;
			}
			}

		}
		cout << "修改完成,该对象当前记录为:" << endl;
		cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
		cout << Hum[aimId].Id << " \t\t" << Hum[aimId].Name << "\t\t" << Hum[aimId].rela << "\t\t" << Hum[aimId].phoneNum << endl;
		cout << "输入1继续修改该对象或输入2返回主菜单:" << endl;
		int n;
		reCin:	//goto标记 重新输入
		cin >> n;
		if (n == 1)
			goto conChange;	//这里用goto语句较方便,回到修改处
		else if (n == 2)
			menu();
		else
		{
			cout << "输入有误,请重新选择:" << endl;
			goto reCin;			//回到选择处
		}

	}
	
}
///end of 修改记录//

//删除操作///
void book::Delete() {
	reDel:	//goto标记 重新输入
	cout << "请输入想要删除对象的姓名:";
	string name;
	cin >> name;
	int aimId;	//目标对象ID
	int flag = 0;	//查询结果数记录
	for (int i = 0; i < last; i++)
	{
		if (Hum[i].Name == name)
		{
			aimId = Hum[i].Id;
			if (flag == 0)
			cout << "该对象当前记录为:" << endl;
			cout << "联系人ID\t" << "联系人姓名\t" << "联系人关系\t" << "联系人电话" << endl;
			cout << Hum[i].Id << " \t\t" << Hum[i].Name << "\t\t" << Hum[i].rela << "\t\t" << Hum[i].phoneNum << endl;
			flag++;
		}
	}
	if (flag == 1)
	{
		Del(aimId);

	}
	else if (flag == 0) {
		cout << "查无此人,请选择" << endl;
		cout << "1:重新输入\t2:返回主菜单" << endl;
		reCin1:		//goto标记 重新选择
		int n;
		cin >> n;
		switch (n)
		{case(1):
			goto reDel;
			break;
		case(2):
			menu();
			break;
		default:
			cout << "输入有误,请重新选择" << endl;
			cout << "1:重新输入\t2:返回主菜单" << endl;
			goto reCin1;	//返回选择部分
		}
	}
	else
	{
		cout << "请输入想要修改对象的Id:";
		cin >> aimId;
		Del(aimId);
	}
	endFunc();
}
//end of 删除操作///a/

源文件部分:

#include"通讯录.h"


int main() {
	cout << "开始构建通讯录,请输入通讯录人数:" ;
	int k;
	cin >> k;
	book a(k);
	a.menu(); 
	
	return 0;
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
电话簿管理系统是一个用于存储和管理联系人信息的程序。在C语言,可以使用结构体和链表来实现电话簿管理系统。 首先,我们可以定义一个结构体来表示联系人的信息,包括姓名电话号码等字段。例如: ```c struct Contact { char name[50]; char phone[20]; // 其他字段... }; ``` 然后,我们可以使用链表来存储联系人信息。每个节点表示一个联系人,包含一个指向下一个节点的指针。可以定义一个指向链表头节点的指针来表示整个电话簿。例如: ```c struct Node { struct Contact contact; struct Node* next; }; struct Node* phoneBook = NULL; // 链表头节点指针 ``` 接下来,我们可以实现一些基本的功能,如添加联系人、删除联系人、查找联系人等。以下是一个简单的示例: ```c // 添加联系人 void addContact(const char* name, const char* phone) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); strcpy(newNode->contact.name, name); strcpy(newNode->contact.phone, phone); newNode->next = phoneBook; phoneBook = newNode; } // 删除联系人 void deleteContact(const char* name) { struct Node* currNode = phoneBook; struct Node* prevNode = NULL; while (currNode != NULL) { if (strcmp(currNode->contact.name, name) == 0) { if (prevNode == NULL) { phoneBook = currNode->next; } else { prevNode->next = currNode->next; } free(currNode); return; } prevNode = currNode; currNode = currNode->next; } } // 查找联系人 struct Contact* findContact(const char* name) { struct Node* currNode = phoneBook; while (currNode != NULL) { if (strcmp(currNode->contact.name, name) == 0) { return &(currNode->contact); } currNode = currNode->next; } return NULL; } ``` 以上只是一个简单的电话簿管理系统的示例,你可以根据实际需求进行扩展和修改。例如,可以添加编辑联系人、显示所有联系人等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不似少年游'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值