第一题:
定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后将读入的图书逆序存储,逐行输出逆序存储后每本图书的信息。
输入:
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;
}