题目:
/*
* 使用new和delete创建学生链表,以输入学号0作为结束;
* 然后输出链表,插入链表和删除指定学号以及销毁链表。这些功能做成菜单进行选择。且插入的学号按从小到大存储在链表中。
*/
代码(用户友好版):
#include<iostream>
#include<iomanip>
using namespace std;
typedef struct stu
{
int num;
char name[10];
}stu;
typedef struct LNode
{
stu data;
struct LNode* next;
}LNode,*LinkList;
void CreateList(LinkList& head)
{//创建链表
LinkList q, rear;
rear = head;
stu s = { 1 };
cout << "请输入学号:";
cin >> s.num;
cout << "请输入姓名:";
cin >> s.name;
while (s.num != 0)
{
q = new LNode;
q->data = s;
q->next = NULL;
rear->next = q;
rear = q;
rear->next = NULL;
cout << "请输入学号:";
cin >> s.num;
cout << "请输入姓名:";
cin >> s.name;
}
rear->next = NULL;
}
void PrintList(LinkList &head)
{//打印链表数据
LinkList p = head->next;
if (p == NULL) {
cout << "没有学生信息!";
}
else {
cout << "Id" << '\t' << "name" << endl;
while (p) {
cout << p->data.num << '\t' << p->data.name << endl;
p = p->next;
}
}
system("pause");
}
void InsertList(LinkList& head,LinkList &p0)
{//按学号大小插入链表
LinkList p, pFront;
pFront = head;
p = head->next;
while (p) {
if (p0->data.num > p->data.num) { //当要插入的学号大于当前结点
pFront = p;
if (p->next == NULL) //当当前结点是最后一个结点,跳出循环
break;
else
p = p->next;
}
if (p0->data.num < p->data.num) { //当要插入的结点学号小于当前结点,且当前结点不是
//最后一个结点,跳出循环
break;
}
if (p0->data.num == p->data.num) { //当要插入的结点的学号已存在
cout << "学号已存在!";
system("pause");
return;
}
}
if (pFront->next == NULL) { //尾插
p0->next = NULL;
p->next = p0;
}
else {
p0->next = p;
pFront->next = p0;
}
system("pause");
}
void DeleteList(LinkList& L, int num)
{//删除链表
LinkList p, Frontp;
Frontp = L;
p = L->next;
if (L->next == NULL) {
cout << "链表为空!无法删除!" << endl;
system("pause");
return;
}
while (p)
{
if (p->data.num == num) {
Frontp->next = p->next;
delete p;
break;
}
else {
Frontp = p;
p = p->next;
}
}
}
void DestroyList(LinkList& L)
{//销毁链表
LinkList p;
while (L) {
p = L;
L = L->next;
delete p;
}
}
void Menu(LinkList &L)
{
LinkList p = new LNode;
cout << " *********************" << endl;
cout << "| 1.插入学生信息 |" << endl;
cout << "| 2.删除学生信息 |" << endl;
cout << "| 3.初始学生信息 |" << endl;
cout << "| 4.浏览学生信息 |" << endl;
cout << "| 5.退出系统 |" << endl;
cout << "| (请选择1~6) |" << endl;
cout << " *********************" << endl;
int choice;
int id;
int choice_2;
cin >> choice;
switch (choice)
{
case 1:
cout << "请输入学号:";
cin >> p->data.num;
cout << "请输入姓名:";
cin >> p->data.name;
InsertList(L,p);
break;
case 2:
cout << "请输入你想删除学生信息的学号:";
cin >> id;
DeleteList(L, id);
break;
case 3:
cout << "此操作会丢失所有学生信息,请谨慎操作!" << endl;
cout << "输入1继续操作,任意键返回";
cin >> choice_2;
if (choice_2 == 1) {
DestroyList(L);
exit(0);
}
else
return;
break;
case 4:
PrintList(L);
break;
case 5:
exit(0);
default:
cout << "输入错误!";
break;
}
}
int main()
{
LinkList head = new LNode;
head->next = NULL;
CreateList(head);
system("cls");
while (1) {
Menu(head);
system("cls");
}
}