#include <iostream>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
void ShowMenu() {
system("pause");
system("cls");
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 << "****** 其他-退出 ********" << endl;
cout << "***************************" << endl << endl;
cout << "请输入你的选择:";
}
struct Book {
string Id;
string Name;
double Price;
};
typedef struct LNode{
Book Data;
struct LNode* Next;
}LNode,*LinkList;
int Length = 0;
//1.初始化
Status InitList_L(LinkList& L) {
L = new LNode; //开辟一个空间给链表
L->Next = NULL; //使其最开始的指向为NULL
cout << "初始化成功!" << endl;
return OK;
}
//2.新建
Status CreateList(LinkList& L) {
Status CreateList_H(LinkList & L);
Status CreateList_R(LinkList & L);
system("cls");
cout << "***************************" << endl;
cout << "****** 1-前插法 ********" << endl;
cout << "****** 2-后插法 ********" << endl;
cout << "***************************" << endl;
int Choose_Create = 0;
cout << "请输入你的选择:"; cin >> Choose_Create;
if (Choose_Create < 1 || Choose_Create>2) {
cout << "输入数据有误!" << endl;
return ERROR;
}
switch (Choose_Create)
{
case 1:
CreateList_H(L);
break;
case 2:
CreateList_R(L);
break;
default:
break;
}
return OK;
}
//前插法
Status CreateList_H(LinkList& L) {
//判断是否初始化成功
if (InitList_L(L) != OK) {
cout << "初始化失败!无法新建!" << endl;
return ERROR;
}
cout << "输入新建链表中节点的个数:";
int Num = 0; cin >> Num;
//判断输入是否非法
if (Num < 1) {
cout << "输入数据有误!" << endl;
return ERROR;
}
for (int i = 0; i < Num; i++) {
LinkList p = new LNode;
cout << "请输入第" << i + 1 << "个节点的IBSN:"; cin >> p->Data.Id;
cout << "请输入第" << i + 1 << "个节点的Name:"; cin >> p->Data.Name;
cout << "请输入第" << i + 1 << "个节点的Price:"; cin >> p->Data.Price;
p->Next = L->Next;
L->Next = p;
Length++;
}
cout << "前插法新建链表成功!" << endl;
return OK;
}
//后插法
Status CreateList_R(LinkList& L) {
//判断是否初始化成功
if (InitList_L(L) != OK) {
cout << "初始化失败!无法新建!" << endl;
return ERROR;
}
int Num = 0;
cout << "输入新建链表中节点的个数:"; cin >> Num;
//判断输入是否非法
if (Num < 1) {
cout << "输入数据有误!" << endl;
return ERROR;
}
Length = 0;
LinkList r = L;//尾指针
for (int i = 0; i < Num; i++) {
LinkList p = new LNode;
cout << "请输入第" << i + 1 << "个节点的IBSN:"; cin >> p->Data.Id;
cout << "请输入第" << i + 1 << "个节点的Name:"; cin >> p->Data.Name;
cout << "请输入第" << i + 1 << "个节点的Price:"; cin >> p->Data.Price;
p->Next = NULL;
r->Next = p;
r = p;
Length++;
}
cout << "后插法新建链表成功!" << endl;
return OK;
}
//3.删除
Status DeleteList(LinkList& L) {
int Num = 0;
cout << "请输入需要删除节点的位序:"; cin >> Num;
if (Num<1 || Num>Length) {
cout << "输入数据有误!" << endl;
return ERROR;
}
LinkList temp;
LinkList p = L;
//循环使p节点为被删节点的前一个节点
for (int i = 0; i < Num - 1; i++) {
p = p->Next;
}
temp = p->Next;
p->Next = temp->Next;
delete temp;
Length--;
cout << "删除成功!" << endl;
return OK;
}
//4.插入
Status InsertList(LinkList& L) {
int Num = 0;
cout << "请输入需要插节点的位序:"; cin >> Num;
if (Num<1 || Num>Length) {
cout << "输入数据有误!" << endl;
return ERROR;
}
LinkList p = new LNode;//插入的节点
LinkList temp_1 = L; //临时节点
LinkList temp_2;
cout << "请输入插入节点的数据:" << endl;
cout << "IBSN:"; cin >> p->Data.Id;
cout << "Name:"; cin >> p->Data.Name;
cout << "Price:"; cin >> p->Data.Price;
//循环使temp_1为插入位序的前一个节点
for (int i = 0; i < Num - 1; i++) {
temp_1 = temp_1->Next;
}
temp_2 = temp_1->Next;
temp_1->Next = p;
p->Next = temp_2;
Length++;
cout << "插入节点成功!" << endl;
return OK;
}
//5.更改
Status ChangeList(LinkList& L) {
int Num = 0;
cout << "输入需要更改数据节点的位序:"; cin >> Num;
if (Num<1 || Num>Length) {
cout << "输入数据有误!" << endl;
return ERROR;
}
LinkList p = L;
for (int i = 0; i < Num; i++) {
p = p->Next;
}
cout << "请输入更改节点的数据:" << endl;
cout << "IBSN:"; cin >> p->Data.Id;
cout << "Name:"; cin >> p->Data.Name;
cout << "Price:"; cin >> p->Data.Price;
cout << "更改成功!" << endl;
return OK;
}
//6.查询
Status EnquireList(LinkList& L) {
system("cls");
Status EnquireList_Num(LinkList L);
Status EnquireList_Id(LinkList L);
Status EnquireList_Name(LinkList L);
Status EnquireList_Price(LinkList L);
cout << "****************************" << endl;
cout << "****** 选择查询方式 ********" << endl;
cout << "****** 1-位序 ********" << endl;
cout << "****** 2-IBSN ********" << endl;
cout << "****** 3-Name ********" << endl;
cout << "****** 4-Price ********" << endl;
cout << "****************************" << endl;
int Choose_Enquire = 0;
cout << "请输入你的选择:"; cin >> Choose_Enquire;
if (Choose_Enquire < 1 || Choose_Enquire>4) {
cout << "输入数据有误!" << endl;
return ERROR;
}
switch (Choose_Enquire)
{
case 1:
EnquireList_Num(L);
break;
case 2:
EnquireList_Id(L);
break;
case 3:
EnquireList_Name(L);
break;
case 4:
EnquireList_Price(L);
break;
default:
break;
}
return OK;
}
//根据位序查询
Status EnquireList_Num(LinkList L) {
int Num = 0;
cout << "请输入需要查询节点的位序:"; cin >> Num;
if (Num<1 || Num>Length) {
cout << "输入数据有误!" << endl;
return ERROR;
}
LinkList p = L;
for (int i = 0; i < Num; i++) {
p = p->Next;
}
cout << "查询节点的信息为:" << endl;
cout << "ISBN:" << p->Data.Id << "\t\t" <<
"Name:" << p->Data.Name << "\t\t" <<
"Price:" << p->Data.Price << endl;
return OK;
}
//根据IBSN查询
Status EnquireList_Id(LinkList L) {
LinkList p = L;
LinkList temp = L;
int Num = 0;
cout << "请输入查询节点的IBSN:"; cin >> p->Data.Id;
for (int i = 0; i < Length; i++) {
p = p->Next;
if (temp->Data.Id == p->Data.Id) {
Num++;
cout << "查询到第" <<Num<<"个符合条件节点:"<< endl;
cout << "ISBN:" << p->Data.Id << "\t\t" <<
"Name:" << p->Data.Name << "\t\t" <<
"Price:" << p->Data.Price << endl;
}
}
cout << "检索完毕!" << endl;
if (Num == 0) {
cout << "未查询到相关节点!" << endl;
return ERROR;
}
return OK;
}
//根据Name查询
Status EnquireList_Name(LinkList L) {
LinkList p = L;
LinkList temp = L;
int Num = 0;
cout << "请输入查询节点的Name:"; cin >> p->Data.Name;
for (int i = 0; i < Length; i++) {
if (temp->Data.Name == p->Data.Name) {
p = p->Next;
Num++;
cout << "查询到第" << Num << "个符合条件节点:" << endl;
cout << "ISBN:" << p->Data.Id << "\t\t" <<
"Name:" << p->Data.Name << "\t\t" <<
"Price:" << p->Data.Price << endl;
}
}
cout << "检索完毕!" << endl;
if (Num == 0) {
cout << "未查询到相关节点!" << endl;
return ERROR;
}
return OK;
}
//根据Price查询
Status EnquireList_Price(LinkList L) {
LinkList p = L;
LinkList temp = L;
int Num = 0;
cout << "请输入查询节点的Price:"; cin >> p->Data.Price;
for (int i = 0; i < Length; i++) {
if (temp->Data.Price == p->Data.Price) {
p = p->Next;
Num++;
cout << "查询到第" << Num << "个符合条件节点:" << endl;
cout << "ISBN:" << p->Data.Id << "\t\t" <<
"Name:" << p->Data.Name << "\t\t" <<
"Price:" << p->Data.Price << endl;
}
}
cout << "检索完毕!" << endl;
if (Num == 0) {
cout << "未查询到相关节点!" << endl;
return ERROR;
}
return OK;
}
//7.显示
Status ShowAll(LinkList& L) {
if (Length == 0) {
cout << "表中无数据!" << endl;
return ERROR;
}
LinkList p = L;
for (int i = 0; i < Length; i++) {
p = p->Next;
cout << "第" << i + 1 << "个数据为:";
cout << "ISBN:" << p->Data.Id << "\t\t" <<
"Name:" << p->Data.Name << "\t\t" <<
"Price:" << p->Data.Price << endl;
}
cout << "显示完毕!" << endl;
return OK;
}
//8.退出
void ExitList() {
cout << "告辞" << endl;
exit(0);
}
int main() {
LinkList L;
int Choose_Main = 0;
ShowMenu(); cin >> Choose_Main;
while (true) {
switch(Choose_Main) {
case 1://初始化
InitList_L(L);
ShowMenu(); cin >> Choose_Main;
break;
case 2://新建
CreateList(L);
ShowMenu(); cin >> Choose_Main;
break;
case 3://删除
DeleteList(L);
ShowMenu(); cin >> Choose_Main;
break;
case 4://插入
InsertList(L);
ShowMenu(); cin >> Choose_Main;
break;
case 5://更改
ChangeList(L);
ShowMenu(); cin >> Choose_Main;
break;
case 6://查询
EnquireList(L);
ShowMenu(); cin >> Choose_Main;
break;
case 7://显示
ShowAll(L);
ShowMenu(); cin >> Choose_Main;
break;
default://退出
ExitList();
break;
}
}
return 0;
}
单链表的基本操作
于 2022-04-11 21:13:55 首次发布