数据结构练习题之尾插法之下的链表各项操作

第一题:

定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后将读入的图书逆序存储,逐行输出逆序存储后每本图书的信息。

输入:

8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00

输出样式:

9787822234110 The-C-Programming-Language 38.00
9787811234923 Compiler-Principles 62.00
9787302257800 Data-Structure 62.00
9787810827430 Discrete-Mathematics 36.00
9787302203513 Database-Principles 36.00
9787302219972 Software-Engineer 32.00
9787302164340 Operating-System 50.00
9787302257646 Data-Structure 35.00

代码:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;

#define OK 1
#define fault 0
#define Maxsize 
typedef struct
{
	string IBNS;
	string NAME;
	float PRICE;
}Book;

typedef struct LNode
{
	int length;
	Book data;
	struct LNode* next;
}LNode, * LinkList;

int InitList(LinkList& L);
int InsertList(LinkList& L);
int TraveralList(LinkList& L);
int ModifyList(LinkList& L);
int PrintList(LinkList L);

int main()
{
	LinkList L;
	InitList(L);
	InsertList(L);
	TraveralList(L);
	//ModifyList(L);
	PrintList(L);
}

int ModifyList(LinkList& L)
{
	LinkList p = L->next;//指向首元结点
	float Sum = 0, Ave = 0;
	while (p)
	{
		Sum += p->data.PRICE;
		p = p->next;
	}
	Ave = Sum / L->length;
	cout << fixed << setprecision(2) << Ave << endl;
	p = L->next;//p指向链表的首元结点
	while (p)
	{
		if (p->data.PRICE < Ave)
			p->data.PRICE = p->data.PRICE * 1.2;
		else
			p->data.PRICE = p->data.PRICE * 1.1;
		p = p->next;
	}
	return OK;
}
int InitList(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

int InsertList(LinkList& L)
{
	int n;
	cin >> n;
	while (n--)
	{
		LinkList p = new LNode;
		cin >> p->data.IBNS >> p->data.NAME >> p->data.PRICE;
		p->next = L->next;
		L->next = p;
	}
	return OK;
}

int TraveralList(LinkList& L)
{
	LinkList p = L;//头指针赋值给p,指向头结点
	L->length = 0;
	while (p->next)
	{
		L->length++;
		p = p->next;
	}
	return OK;
}

int PrintList(LinkList L)
{
	LinkList p = L;
	while (p->next)
	{
		cout << p->next->data.IBNS << " " << p->next->data.NAME << " " << fixed << setprecision(2) << p->next->data.PRICE << endl;
		p = p->next;
	}
	return OK;
}

第二题:查找最贵图书

输出样式:

2
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00

代码:

#include<iostream>
#include<string>
#include<iomanip>
#define OK 1
using namespace std;

typedef struct
{
	string IBNS;
	string NAME;
	float PRICE;
}Book;

typedef struct LNode
{
	int length;
	Book data;
	struct LNode* next;
}LNode,*LinkList;

int Init(LinkList& L);//初始化链表
int Insert(LinkList& L);//尾插法插入
int Traveral(LinkList& L);//遍历函数
int Print(LinkList L);
int Find(LinkList L);

int main()
{
	LinkList L;
	Init(L);
	Insert(L);
	Traveral(L);
	Find(L);
	//Print(L);
	return 0;
}

int Init(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

int Find(LinkList L)
{
	LinkList p = L->next;//定义头指针指向首元结点
	int count = 0;
	float max = L->data.PRICE;//将链表首元结点的价格赋给max
	while (p->next)
	{
		if (max < p->next->data.PRICE)
			max = p->next->data.PRICE;
		p = p->next;
	}
	p = L->next;//指针p指向首元结点
	while (p)
	{
		if (p->data.PRICE == max)
			count++;
		p = p->next;
	}
	cout << count << endl;
	p = L->next;
	while (p)
	{
		if(p->data.PRICE==max)
			cout << p->data.IBNS << " " << p->data.NAME << " " << fixed << setprecision(2) << p->data.PRICE << endl;
		p = p->next;
	}
	return OK;
}

int Insert(LinkList& L)//头插法
{
	LinkList p = L;//p存储链表L的头指针,指向头结点
	string IBNS;
	string NAME;
	float PRICE;
	int n;
	cin >> n;

	while (n--)
	{
			LinkList NewNode = new LNode;
			cin >> IBNS >> NAME >> PRICE;
			NewNode->data.IBNS = IBNS;
			NewNode->data.NAME = NAME;
			NewNode->data.PRICE = PRICE;
			NewNode->next = NULL;
			p->next = NewNode;
			p = NewNode;//p指向NewNode
	}
	return OK;
}

int Traveral(LinkList& L)
{
	LinkList p = L;//定义头指针,指向头结点
	L->length = 0;
	while (p->next)
	{
		L->length++;
		p = p->next;
	}
	return OK;
}

int Print(LinkList L)
{
	LinkList p = L;//定义头指针指向头结点
	while (p->next)
	{
		cout << p->next->data.IBNS << " " << p->next->data.NAME << " " << fixed << setprecision(2) << p->next->data.PRICE << endl;
		p = p->next;
	}
	return OK;
}

第三题 查找最爱图书

输入样例:

8
9787302257646 Data-Structure 35.00
9787302164340 Operating-System 50.00
9787302219972 Software-Engineer 32.00
9787302203513 Database-Principles 36.00
9787810827430 Discrete-Mathematics 36.00
9787302257800 Data-Structure 62.00
9787811234923 Compiler-Principles 62.00
9787822234110 The-C-Programming-Language 38.00
2
Java-Programming-Language
Data-Structure

 输出样例:

Sorry,there is no your favourite!
2
9787302257646 Data-Structure 35.00
9787302257800 Data-Structure 62.00
//查找最爱图书
#include<iostream>
#include<string>
#include<iomanip>
#include<string.h>
#define OK 1
using namespace std;

typedef struct
{
	string IBNS;
	string NAME;
	float PRICE;
}Book;

typedef struct LNode
{
	int length;
	Book data;
	struct LNode* next;
}LNode,*LinkList;

int Init(LinkList& L);//初始化链表
int Insert(LinkList& L);//尾插法插入
int Traveral(LinkList& L);//遍历函数
int Print(LinkList L);
int Find(LinkList L);

int main()
{
	LinkList L;
	Init(L);
	Insert(L);
	Traveral(L);
	Find(L);
	//Print(L);
	return 0;
}

int Init(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

int Find(LinkList L)//这个函数只适用于求解这个题,不具有广泛性,因为我错了好久才发先一个问题--那就是string类型的变量
{
	int n;
	cin >> n;
	LinkList p = L->next;//指针p指向首元结点
	int flag = 0;
	int i = 0;
	int j = 0;
		string name1;
		string name2;
		cin >> name1;
		while (p)
		{
			if (name1.compare(p->data.NAME) == 0)
			{
				flag = 1;
				i++;
			}
			p = p->next;
		}
		if (flag)
		{
			cout << i << endl;
			p = L->next;
			while (p)
			{
				if (name1 == p->data.NAME)
					cout << p->data.IBNS << " " << p->data.NAME << " " << fixed << setprecision(2) << p->data.PRICE << endl;
				p = p->next;
			}
		}
		else
		{
			cout << "Sorry,there is no your favourite!" << endl;
		}
		p = L->next;
		cin >> name2;
		while (p)
		{
			if (name2.compare(p->data.NAME) == 0)
			{
				flag = 1;
				j++;
			}
			p = p->next;
		}
		if (flag)
		{
			cout << j << endl;
			p = L->next;
			while (p)
			{
				if (name2 == p->data.NAME)
					cout << p->data.IBNS << " " << p->data.NAME << " " << fixed << setprecision(2) << p->data.PRICE << endl;
				p = p->next;
			}
		}
		else
		{
			cout << "Sorry,there is no your favourite!" << endl;
		}
	return OK;
}

int Insert(LinkList& L)//头插法
{
	LinkList p = L;//p存储链表L的头指针,指向头结点
	string IBNS;
	string NAME;
	float PRICE;
	int n;
	cin >> n;
	while (n--)
	{
			LinkList q = new LNode;
			cin >> IBNS >> NAME >> PRICE;
			q->data.IBNS = IBNS;
			q->data.NAME = NAME;
			q->data.PRICE = PRICE;
			q->next = NULL;
			p->next = q;
			p = q;//p指向NewNode
	}
	return OK;
}

int Traveral(LinkList& L)
{
	LinkList p = L;//定义头指针,指向头结点
	L->length = 0;
	while (p->next)
	{
		L->length++;
		p = p->next;
	}
	return OK;
}

int Print(LinkList L)
{
	LinkList p = L;//定义头指针指向头结点
	while (p->next)
	{
		cout << p->next->data.IBNS << " " << p->next->data.NAME << " " << fixed << setprecision(2) << p->next->data.PRICE << endl;
		p = p->next;
	}
	return OK;
}

下面是比较正确一点的算法,之前算法出错是因为while循环结束时忘记把指针p回溯到首元结点,导致第二次循环判断的时候p直接指向的是NULL才导致出错

//查找最爱图书
#include<iostream>
#include<string>
#include<iomanip>
#include<string.h>
#define OK 1
using namespace std;

typedef struct
{
	string IBNS;
	string NAME;
	float PRICE;
}Book;

typedef struct LNode
{
	int length;
	Book data;
	struct LNode* next;
}LNode, * LinkList;

int Init(LinkList& L);//初始化链表
int Insert(LinkList& L);//尾插法插入
int Traveral(LinkList& L);//遍历函数
int Print(LinkList L);
int Find(LinkList L);

int main()
{
	LinkList L;
	Init(L);
	Insert(L);
	Traveral(L);
	Find(L);
	//Print(L);
	return 0;
}

int Init(LinkList& L)
{
	L = new LNode;
	L->next = NULL;
	return OK;
}

int Find(LinkList L)//寻找最爱图书
{
	int n;
	cin >> n;
	LinkList p = L->next;//指针p指向首元结点
	int flag = 0;
	int k = 0;
	while (n--)
	{
		string name;
		int i = 0;
		cin >> name;
		k++;
		while (p)
		{

			if (name.compare(p->data.NAME) == 0)
			{
				if (n == 0)
					flag = 1;
				i++;
			}
			p = p->next;//指针指向下一个结点
		}
		if (flag)
		{
			cout << i << endl;
			p = L->next;//重新将p指向首元结点再遍历
			while (p)
			{
				if (name == p->data.NAME)
					cout << p->data.IBNS << " " << p->data.NAME << " " << fixed << setprecision(2) << p->data.PRICE << endl;
				p = p->next;
			}
		}
		else
		{
			cout << "Sorry,there is no your favourite!" << endl;
		}
		p = L->next;
	}
	return OK;
}

int Insert(LinkList& L)//头插法
{
	LinkList p = L;//p存储链表L的头指针,指向头结点
	string IBNS;
	string NAME;
	float PRICE;
	int n;
	cin >> n;
	while (n--)
	{
		LinkList q = new LNode;
		cin >> IBNS >> NAME >> PRICE;
		q->data.IBNS = IBNS;
		q->data.NAME = NAME;
		q->data.PRICE = PRICE;
		q->next = NULL;
		p->next = q;
		p = q;//p指向NewNode
	}
	return OK;
}

int Traveral(LinkList& L)
{
	LinkList p = L;//定义头指针,指向头结点
	L->length = 0;
	while (p->next)
	{
		L->length++;
		p = p->next;
	}
	return OK;
}

int Print(LinkList L)
{
	LinkList p = L;//定义头指针指向头结点
	while (p->next)
	{
		cout << p->next->data.IBNS << " " << p->next->data.NAME << " " << fixed << setprecision(2) << p->next->data.PRICE << endl;
		p = p->next;
	}
	return OK;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值