C++通讯录设计-链表实现

通讯录设计-链表实现

功能如下:

1添加学生信息
2删除学生信息
3显示学生信息
4查询学生信息
5学生信息排序
6清空屏幕信息
7清空文档信息
8退出管理系统
上代码!
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>//读写文件的头文件
using namespace std;

struct ElementType;
struct Node;
struct Queue;
typedef struct Queue* MyQueue;

struct ElementType {
	int id;
	string name;
	int num;
};

struct Node {
	ElementType data;
	Node* next;
};

struct Queue {
	Node* front;
	Node* rear;
};

MyQueue Init(MyQueue& q);//Initialize queue
bool IsEmpty(MyQueue q);//Determine if the queue is empty
bool Insert(ElementType x, MyQueue q);//Insert the data to the end of the queue
bool Delete(const int message, MyQueue q);//Find some data in the queue, and then delete the corresponding node
void Print(const Node* q);//Prints all the information in a node
void PrintAll(const MyQueue q);//Prints information from all nodes
bool FindByName(const string massage, const MyQueue q);//Prints information from all nodes
void Input(MyQueue q);//When the address book is empty, re-enter the information into the address book 
void Write(MyQueue q);//Write the information from the queue to the document 
MyQueue Read();//Write the information from the queue to the document
MyQueue ReadOrClear(MyQueue& q);//Whether to empty all the information 
void Swap(ElementType& x, ElementType& y);//Swap functions in sort
MyQueue BubbleSort(MyQueue q);//Sort by student ID using bubble sort 
void Menu(MyQueue q);//main menu

//初始化队列 
MyQueue Init(MyQueue& q) {
	q = new Queue();
	if (q == NULL) return NULL;
	q->front = NULL;
	q->rear = NULL;
	return q;
}

//查看队列是否为空 
bool IsEmpty(MyQueue q) {
	return q->front == NULL;
}

//添加信息 
bool Insert(ElementType x, MyQueue q) {
	Node* temp = new Node();
	if (temp == NULL) return false;
	temp->data = x;//这里需要改成需要的内容,最好(必须)改成一个函数的形式,赋值的时候调用函数,打印的时候也调用函数
	temp->next = NULL;
	if (IsEmpty(q)) {
		q->front = temp;
		q->rear = temp;
		return true;
	}
	else {
		q->rear->next = temp;
		q->rear = temp;
		return true;
	}
}

//删除功能 
bool Delete(const int message, MyQueue q) {
	Node* temp = new Node();
	if (temp == NULL) return false;//申请储存空间失败
	bool pd = 0;
	//先是找到这个id再进行删除
	//先判断是不是头节点,若不是再把头节点当首节点进行使用
	if (q->front->data.id == message) {//如果删除头节点
		temp = q->front;
		q->front = q->front->next;
		delete temp;
		temp = NULL;
		pd = 1;
	}
	else if (q->rear->data.id == message) {//如果删除尾节点
		//先找到尾节点的前一个结点
		temp = q->front;
		while (temp->next->data.id != message) temp = temp->next;
		q->rear = temp;
		q->rear->next = NULL;
		pd = 1;
	}
	else {//如果删除中间节点
		temp = q->front;
		while (temp->next != NULL && temp->next->data.id != message) temp = temp->next;
		if (temp->next == NULL) return false;//判断是不是没有找到,没有找到返回false
		Node* mp = new Node();
		mp = temp->next;
		temp->next = temp->next->next;
		delete mp;
		mp = NULL;
		pd = 1;
	}
	if (pd == 1) {
		Write(q);
		cout << "已成功删除该学生信息!" << endl;
		return true;
	}
}

//通过姓名进行查找 
bool FindByName(const string massage, const MyQueue q) {//此函数只有查找功能,没有打印功能,打印功能在另一个函数
	Node* temp = new Node();
	bool pd = 0;
	if (q->front->data.name == massage) {
		temp = q->front;
		Print(temp);
		return true;
	}
	else {
		temp = q->front;
		while (temp->next != NULL && temp->next->data.name != massage) temp = temp->next;
		if (temp->next == NULL) return false;//没有找到这个人的姓名,返回false
		Print(temp->next);
		return true;
	}
}

//单个进行打印 
void Print(const Node* q) {
	cout << "该学生的信息为:" << endl;
	cout << "学号: " << q->data.id << " 姓名:" << q->data.name << " 电话号码:" << q->data.num << endl;
}

//打印全部的学生信息 
void PrintAll(const MyQueue q) {
	cout << "学号";
	for (int i = 0; i < 10; i++) {
		cout << "-";
	}
	cout << "姓名";
	for (int i = 0; i < 10; i++) {
		cout << "-";
	}
	cout << "电话号码" << endl;

	Node* temp;
	temp = q->front;
	while (temp != NULL) {
		cout << " " <<temp->data.id << "	      " << temp->data.name << "           " << temp->data.num << endl;
		temp = temp->next;
	}
	//cout << endl;
}

//实现排序的功能函数 
void Swap(ElementType& x, ElementType& y) {
	ElementType temp;
	temp = x;
	x = y;
	y = temp;
}

MyQueue BubbleSort(MyQueue q) {
	if (q->front == NULL || q->front->next == NULL) return NULL;
	for (Node* i = q->front; i->next != NULL; i = i->next) {
		for (Node* j = q->front; j->next != NULL; j = j->next) {
			if (j->data.id > j->next->data.id) {
				Swap(j->data, j->next->data);
			}
		}
	}
	return q;
}

//把全部信息存入到文档中
void Write(MyQueue q) {
	//先根据学号进行排序,再进行存储
	q=BubbleSort(q);
	ofstream writeIt;
	writeIt.open("data.txt");
	if (writeIt.fail()) {
		cout << "该文件没有找到!" << endl;
		cout << "程序已退出!" << endl;
		exit(1);
	}

	Node* temp = new Node();
	if (q!= NULL) {
		temp= q->front;
		while (temp != NULL) {
			writeIt << temp->data.id << " " << temp->data.name << " " << temp->data.num << endl;;
			temp = temp->next;
		}
	}
	writeIt.close();
}

//从文档中读出所有的信息
MyQueue Read() {
	ifstream readIt("data.txt");
	if (readIt.fail()) {
		cout << "该文件没有找到!" << endl;
		cout << "程序已退出!" << endl;
		exit(1);
	}
	int id1;
	string name1;
	int num1;
	MyQueue q=new Queue();
	ElementType x;
	while (!readIt.eof()) {
		readIt >> id1 >> name1 >> num1;
		if (readIt.eof()) break;
		x.id = id1;
		x.name = name1;
		x.num = num1;
		Insert(x, q);
	}
	readIt.close();
	return q;
}

//读入文档中的信息
MyQueue ReadOrClear(MyQueue& q) {
	q=Read();
	return q;
}

//使整个队列置空
void MakeEmpty(MyQueue& q) {
	while (q->front != NULL) {
		Node* temp = new Node();
		temp = q->front;
		q->front = q->front->next;
		delete temp;
	}
}

//主菜单
void Menu(MyQueue q) {
	q=ReadOrClear(q);
	while (1) {
		cout << endl;
		cout << "|--------------------学生通讯录系统---------------------|" << endl;
		cout << "|--------------------1 添加学生信息---------------------|" << endl;
		cout << "|--------------------2 删除学生信息---------------------|" << endl;
		cout << "|--------------------3 显示学生信息---------------------|" << endl;
		cout << "|--------------------4 查询学生信息---------------------|" << endl;
		cout << "|--------------------5 学生信息排序---------------------|" << endl;
		cout << "|--------------------6 清空屏幕信息---------------------|" << endl;
		cout << "|--------------------7 清空文档信息---------------------|" << endl;
		cout << "|--------------------8 退出管理系统---------------------|" << endl;
		cout << "|-------------------------------------------------------|" << endl;
		int n;
		cout << "输入您的选择:" << endl;
		cin >> n;
		switch (n) {
			case 1: {
				ElementType x;
				cout << "请输入该学生的信息:学号 姓名 电话号码" << endl;
				cin >> x.id >> x.name >> x.num;
				Insert(x, q);
				Write(q);
				cout << "已成功添加该学生信息!" << endl;
				break;
			}
			case 2: {
				cout << "请输入该学生的学号:" << endl;
				int num1;
				cin >> num1;
				if (!Delete(num1, q)) {
					cout << "该系统中不存在该学生!" << endl;
				};
				break;
			}
			case 3: {
				cout << "正在打印全部学生信息中.......请稍等!" << endl;
				cout << "全部学生的信息为:" << endl;
				PrintAll(q);
				break;
			}
			case 4: {
				cout << "请输入该学生的姓名:" << endl;
				string name1;
				cin >> name1;
				if (!FindByName(name1, q)) {
					cout << "该系统中不存在该学生!" << endl;
				}
				break;
			}
			case 5: {
				cout << "正在根据学生的学号对学生进行排序....." << endl;
				cout << "排完序后,结果为:" << endl;
				BubbleSort(q);
				PrintAll(q);
				break;
			}
			case 6: {
				system("cls");
				break;
			}
			case 7: {
				cout << "请您在三确认是否要清空文档中的全部学生信息!清空请输入“yes”,不清空请输入“no”。" << endl;
				string s;
				cin >> s;
				if (s == "yes") { 
					//先把队列中的全部节点都delete掉,再进行写入文档中
					MakeEmpty(q);
					q = Init(q);
					Write(q);
					cout << "已经成功清空文档中的全部学生信息!" << endl;
				}
				break;
			}
			case 8: {
				cout << "退出成功!" << endl;
				exit(0);
			}
			default:
				cout << "输入的选项序号有误,请重新输入!" << endl;
		}
	}
}

int main() {
	MyQueue q;
	q = Init(q);
	Menu(q);
	return 0;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值