数据结构通过链表实现班级同学通讯录

题:

程序主菜单包含以下几个功能:
(1)添加记录:通过键盘输入信息,添加一条通讯录记录。
(2)删除记录:通过键盘输入学号,删除该学号的记录。
(3)输出记录:输出通讯录全部记录。
(4)按姓名查找:通过键盘输入姓名,输出该同学的所有信息。
(5)保存记录:把通讯录中所有的记录保存到文件中。
(6)清空记录:删除通讯录中的全部记录,并删除文件。
(7)退出

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;

struct Node; //存储学生信息的结构体
typedef struct Node* PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

//存储学生信息节点
typedef struct Node
{
	int Student_id;//存储学生学号
	char Name[8]; // 存储学生姓名
	char Telephone[12]; //存储学生电话号码
	int Record;
	Position Next; //指向下一个节点的指针
};

//添加学生信息
void AddStudent(List& L)
{
	Position Tmpcell;
	Tmpcell = (PtrToNode)malloc(sizeof(struct Node));
	if (Tmpcell == NULL)
	{
		cout << "Out of space!" << endl;
	}
	Tmpcell->Next = NULL;

	char name1[8];//添加学生姓名
	int record1;//添加学生成绩
	int id1;//添加学生学号
	char tel[12];//添加学生电话号码

	//将学生信息传入到暂存节点Tmpcell,有点赘序,可删减
	cout << "请输入姓名:";
	cin >> name1;
	strcpy_s(Tmpcell->Name, name1);
	cout << "请输入分数:";
	cin >> record1;
	Tmpcell->Record = record1;
	cout << "请输入该生学号:";
	cin >> id1;
	Tmpcell->Student_id = id1;
	cout << "请输入该生电话:";
	cin >> tel;
	strcpy_s(Tmpcell->Telephone, tel);
	
	Position P;//创建工作指针
	P = L;//将工作指针指向头指针(头指针没有数据域,有指针域)
	while (P->Next != NULL) P = P->Next;//找到链表最后一个地址
	P->Next = Tmpcell;//将链表最后一个元素的Next指向暂存学生节点,链起来
}

//删除学生信息
void DeleteStudent(List& L)
{
	Position Tmpcell;//设置一个暂时的存储学生节点
	cout << "请输入删除学生学号:";
	int id;
	cin >> id;//输入要删除的学生的学号
	Position P = L->Next;//将链表的位于1的指针赋值给工作指针,因为头指针L位于0,没有数据域
	if (P->Student_id == id)//当第一个有数据的指针的id=要删除同学的id时(下面有解释为什么要单独判断第一个)
	{
		Tmpcell = P;//将要删除的同学的地址给Tmpcell,便于后面删除
		L->Next = P->Next;
		free(P);
	}
	else//当第二个及之后的学生的student_id==id时(现在已排除第一个,即位于1的同学student_id不等于id
	{
		while (P != NULL)
		{
			if (P->Next->Student_id == id)//删除操作时,总是通过(P->Next)来判断是否等于要删除的学生,
			//(继上一句)P->Next可赋值给Tmpcell然后freeTmpcell,不影响P和链表连接,所以上面要单独判断第1个是否就是要删除的学生
			{
				Tmpcell = P->Next;
				P->Next = P->Next->Next;
				free(Tmpcell);
				break;
			}
			P = P->Next;
		}
	}
}

//显示所有学生信息
void ShowStudent(List& L)
{
	cout << setw(4) << "姓名" << setw(6) << "学号" << setw(6) << "成绩" << setw(13) << "电话" << endl;
	Position P = L->Next;//因为L是头结点,无数据,只有地址。L->Next的地址有数据了,下面的P=L->Next同理
	while (P  != NULL)
	{
		cout << setw(4) <<P->Name << setw(6) << P->Student_id << setw(6) << P->Record << setw(13) << P->Telephone << endl;
		P = P->Next;
	}
}

//查找学生
void FindStudent(List& L)
{
	cout << "请输入要查找学生姓名:";
	char name3[8];
	cin >> name3;//输入学生姓名
	Position P = L->Next;//上面已说明,懂的都懂
	while (P != NULL && strcmp(P->Name,name3))//不能用“=="来判断名字是否相同,因为是char类型,只能用strcmp函数来判断是否相同
		P = P->Next;
	cout << "姓名" << P->Name << "学号" << P->Student_id << "成绩" << P->Record << "电话" << P->Telephone << endl;
}

//保存学生信息到文件中
void SaveStudent(List L)
{
	ofstream output;//创建输入信息的方式
	output.open("student2.txt");
	Position P = L->Next; //上面已说明,dddd
	while (P!= NULL)
	{
		output << P->Name << " " << P->Student_id << " " << P->Record << " " << P->Telephone << endl;
		P = P->Next;
	}
	output.close();
}

//清空学生信息
void Clear(List& L)
{
	Position p, tmp;
	p = L->Next;//上面已说明,dddd
	L->Next = NULL;//释放头指针空间
	while (p != NULL)
	{
		tmp = p->Next;
		free(p);
		p = tmp;
	}
}

void ShowMenu()
{
	cout << "|----------------------------------|" << endl;
	cout << "           (1)添加记录                     " << endl;
	cout << "           (2)删除记录                     " << endl;
	cout << "           (3)输出记录                    " << endl;
	cout << "           (4)按姓名查找                    " << endl;
	cout << "           (5)保存记录                     " << endl;
	cout << "           (6)清空记录                     " << endl;
	cout << "           (7)退出                     " << endl;
	cout << "|-----------------------------------|" << endl;
	cout << endl;
}

int main()
{
	ShowMenu();
	List L = (PtrToNode)malloc(sizeof(struct Node));
	L->Next = NULL;
	char in;//输入进行选择
	do
	{
		cin >> in;
		switch (in)//输入进行选择功能
		{
		case '1':
			AddStudent(L);
			system("cls");//清屏
			ShowMenu();
			break;
		case '2':
			DeleteStudent(L);
			system("cls");
			ShowMenu();
			break;
		case '3':
			ShowStudent(L);
			break;
		case '4':
			FindStudent(L);
			break;
		case '5':
			SaveStudent(L);
			break;
		case '6':
			Clear(L);
			break;
		case '7':
			break;
		default:cout << "输入错误,请重新输入。" << endl;
		}
	} while (in != '7');//输入7退出程序*/

	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值