题:
程序主菜单包含以下几个功能:
(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;
}