单链表的基本操作

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值