實(shí)驗(yàn)要求:
定義一個(gè)包含圖書(shū)信息(書(shū)號(hào)、書(shū)名、價(jià)格)的順序表或者鏈表。要求實(shí)現(xiàn)下面功能:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-733985.html
- 讀入相應(yīng)的圖書(shū)數(shù)據(jù)來(lái)完成圖書(shū)信息表的創(chuàng)建。然后,輸出圖書(shū)表中的圖書(shū)個(gè)數(shù),同時(shí)逐行輸出每本圖書(shū)的信息。
- 由于某種原因物價(jià)上漲,書(shū)店計(jì)劃提高圖書(shū)價(jià)格,要求計(jì)算所有圖書(shū)的平均價(jià)格,低于平均價(jià)格的圖書(shū)價(jià)格漲價(jià)10%,高于或等于平均價(jià)格的圖書(shū)價(jià)格漲價(jià)5%,并輸出調(diào)價(jià)后的圖書(shū)信息。
- 將讀入圖書(shū)的信息逆序存儲(chǔ),逐行輸出逆序存儲(chǔ)后的每本圖書(shū)的信息。反轉(zhuǎn)鏈表
- 找出最貴的圖書(shū),并輸出其信息。若有多本,則先輸出圖書(shū)個(gè)數(shù),再依次輸出圖書(shū)信息。
- 新近一批圖書(shū),插入到圖書(shū)表中的指定位置,并輸出插入后的圖書(shū)表信息。
- 如果圖書(shū)表中不允許存在書(shū)號(hào)相同的圖書(shū),請(qǐng)為圖書(shū)表去重,即刪除書(shū)號(hào)相同的圖書(shū)(只保留一本)。
實(shí)驗(yàn)環(huán)境: devc++
實(shí)現(xiàn)代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733985.html
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
//1.書(shū)的結(jié)構(gòu)定義
typedef struct Book{
string number;
string name;
float price;
}Book;
//2.鏈表的結(jié)構(gòu)定義,一個(gè)數(shù)據(jù)一個(gè)指針
typedef struct LinkNode{
Book *data;
struct LinkNode *next;
int length;
}LinkNode,*LinkList;
//3.初始化
//3.1 鏈表的初始化
LinkList init_list(){
LinkList l = new LinkNode;
l->next = NULL;
l->length = 0;
l->data = NULL;
return l;
}
//3.2 節(jié)點(diǎn)的初始化
LinkNode *init_node(Book *book){
LinkNode *node = new LinkNode;
node->data = book;
node->next = NULL;
node->length = 1;
return node;
}
//3.3 圖書(shū)的初始化
Book *init_book(string num1,string nam1,float price1){
Book *boo = new Book;
boo->number = num1;
boo->name = nam1;
boo->price = price1;
return boo;
}
//4.圖書(shū)信息表的創(chuàng)建
void creat_book_list(LinkList &l,int n){
l->length= n;
cout<<"請(qǐng)輸入您想要存放的數(shù)據(jù):"<<endl;
//4.1.輸入的數(shù)據(jù)是書(shū)這個(gè)數(shù)據(jù)結(jié)構(gòu)的內(nèi)容
string number;
float price;
string name;
LinkList r = l;
for(int i=0;i<n;i++){
cin>>number;
cin>>name;
cin>>price;
// cout<<number<<" "<<name<<" "<<price<<endl;
Book *my_book = init_book(number,name,price);
//4.2.得到書(shū)的數(shù)據(jù)類型后就可以將其插入到信息表中了
//4.2.1 初始化節(jié)點(diǎn)
LinkNode *tmp = init_node(my_book);
if(i == 0){
r->data = my_book;
}
// 4.2.2 尾插法插入元素,沒(méi)有虛擬頭節(jié)點(diǎn)
else{
r->next = tmp;
r = tmp;
}
}
r->next = NULL;
}
//5.展示鏈表
void display(LinkList l){
cout<<"=============== 展示:==============="<<endl;
int x = 1;
while(l){
cout<<x++<<" ";
cout<<l->data->number<<" "<<l->data->name<<" "<<l->data->price<<endl;
l = l->next;
}
cout<<"=============== over!! ==============="<<endl;
}
//6.漲價(jià)函數(shù) 有數(shù)據(jù)要改
void add_price(LinkList &l){
//6.1 計(jì)算鏈表里數(shù)據(jù)的平均值
int sum = 0;
LinkNode *r = l;
while(r){
sum += r->data->price;
r = r->next;
}
float average = sum / 10; //****一會(huì)這要進(jìn)行改變****
//低于平均價(jià)格的圖書(shū)價(jià)格漲價(jià)10%,高于或等于平均價(jià)格的圖書(shū)價(jià)格漲價(jià)5%,并輸出調(diào)價(jià)后的圖書(shū)信息。
r = l;
while(r){
if(r->data->price < average)
r->data->price = 1.1 * r->data->price;
else
r->data->price = 1.05 * r->data->price;
r = r->next;
}
}
//7.反轉(zhuǎn)鏈表里的內(nèi)容
LinkList reverse_real(LinkNode *pre,LinkNode *cur){
//1.遞歸結(jié)束的最終條件
if(cur == NULL) return pre;//cur為null,那它的前一個(gè)就說(shuō)明是原來(lái)鏈表的末尾結(jié)點(diǎn),也就是新鏈表的頭節(jié)點(diǎn),返回新的頭節(jié)點(diǎn)說(shuō)明鏈表反轉(zhuǎn)成功
//2.用一個(gè)結(jié)點(diǎn)來(lái)記錄當(dāng)前節(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)
LinkNode *tmp = cur->next;
//3.真正的反轉(zhuǎn)操作,讓當(dāng)前指針指向當(dāng)前指針的前一個(gè)指針,就是鏈表的反轉(zhuǎn)操作
cur->next = pre;
//4. 上面僅僅只是反轉(zhuǎn)了一次,重新調(diào)用反轉(zhuǎn)函數(shù)接著向后進(jìn)行操作
return reverse_real(cur,tmp);
/*
只需假想一下鏈表反轉(zhuǎn)的情況即可,一開(kāi)始傳入的是(null,head),head表示鏈表的真正頭節(jié)點(diǎn),執(zhí)行到return之前僅僅只是記錄了一下原來(lái)
的head->next指針,并讓頭部指向了pre也就是null;所以下一步要反轉(zhuǎn)的就是cur和記錄下head->next的指針進(jìn)行反轉(zhuǎn)然后依次......
*/
}
void reverse_link(LinkList &l){
int n = l->length;
l = reverse_real(NULL,l);
l->length = n;
// reverse_real(NULL,l) = reverse_real(l,tmp1) = reverse_real(tmp1,tmp2)= ...... = pre ,所以最后 l 得到的就是返回的 頭部節(jié)點(diǎn)
}
//8.在圖書(shū)中找出最貴的書(shū)
void find_most_dear(LinkList l){
//8.1用于遍歷
LinkNode *r = l->next;
//8.2用于記錄,因?yàn)榭赡軙?huì)出現(xiàn)多個(gè)值,所以將其設(shè)置為鏈表 ,但實(shí)質(zhì)上和LinkNode * 一致
//又開(kāi)辟了一個(gè)新的空間用于記錄,是為了避免原來(lái)的鏈表收到tmp的影響,只需將l的頭部數(shù)據(jù)賦值給tmp即可,并不是地址
LinkList my_list = init_node(l->data);
LinkNode* tmp = my_list; //此時(shí)tmp的next為空,說(shuō)明不是原來(lái)的鏈表了
while(r){
// cout<<tmp->data->price<<" "<< r->data->price <<endl;
if(tmp->data->price < r->data->price ){
//8.3如果當(dāng)前tmp所代表的價(jià)格要小于遍歷得到的,就更新
LinkNode *node = init_node(r->data); //意為創(chuàng)建一塊新的內(nèi)存空間,為了不影響原來(lái)的鏈表,
tmp = node;
my_list = tmp; //表示每次調(diào)用if里面時(shí),my_list的頭部都會(huì)改變
}
//8.4如果tmp的價(jià)格等于遍歷得到的就放到tmp的next指針
else if(tmp->data->price == r->data->price){
LinkNode *p = init_node(r->data);
tmp->next = p;
tmp->length += 1;
tmp = p;
}
//8.5用于控制循環(huán)次數(shù)
r = r->next;
}
tmp->next = NULL;
cout<<"共匹配到"<<my_list->length<<"本價(jià)格最高的圖書(shū):"<<endl;
display(my_list); //對(duì)新鏈表進(jìn)行展示
}
//9.將新來(lái)的圖書(shū)插入到指定位置
int insert_book(LinkList &l,int index,Book *book){
//9.1 條件判斷
// cout<<l->length<<endl;
if(index <= 0 || index > l->length) return -1;
//9.2 創(chuàng)建鏈表節(jié)點(diǎn)
LinkNode *my_book = init_node(book);
//9.3 要插入到指定位置就要 找到要插入位置的前一個(gè)結(jié)點(diǎn)
if(index == 0){
LinkNode *tmp = l;
l = my_book;
l->next = tmp;
// cout<<"222"<<endl;
}
else{
// cout<<"111"<<endl;
index = index - 1;
//定義一個(gè)結(jié)點(diǎn)指向真正的頭節(jié)點(diǎn)
LinkNode *p = l;
while(index--){
p = p->next; //循環(huán)完成之后,p指的就是要插入位置的前面一個(gè)節(jié)點(diǎn)
}
my_book ->next = p->next;
p->next = my_book;
}
l->length += 1;
return 0;
}
//10.將書(shū)號(hào)相同的數(shù)據(jù)進(jìn)行去重,如果有相同的刪去后面的那個(gè)
void delete_same_number(LinkList &l){
LinkNode *r = l;
LinkNode *inner = l;
cout<<l->length<<endl;
while(r){
//必須加上inner不為空這個(gè)條件,因?yàn)槿绻?dāng)前inner已經(jīng)為空就不存在inner->next這條語(yǔ)句,就會(huì)報(bào)錯(cuò)
//而如果inner不為空inner->next為空,則下面的比較就沒(méi)有意義
while(inner && inner->next){
// cout<<r->data->number<<" "<<inner->next->data->number<<endl;
if(r->data->number == inner->next->data->number){//意為當(dāng)外循環(huán)的序號(hào)與內(nèi)循環(huán)的下一個(gè)結(jié)點(diǎn)的序號(hào)相同時(shí)就刪除內(nèi)循環(huán)的那個(gè)結(jié)點(diǎn)
cout<<"相同編號(hào)"<<inner->next->data->number<<"去重成功??!"<<endl;
inner->next = inner->next->next;
l->length -= 1;
}
inner = inner->next;//循環(huán)變量
}
r = r->next;
inner = r;
}
//因?yàn)樘幚砹薼->length所以不能使用for循環(huán)
// for(int i=0;i<l->length;i++){//外循環(huán)進(jìn)行遍歷
// for(int j=i+1;j<l->length;j++){
//
// cout<<r->data->number<<" "<<inner->next->data->number<<endl;
// if(r->data->number == inner->next->data->number){//意為當(dāng)外循環(huán)的序號(hào)與內(nèi)循環(huán)的下一個(gè)結(jié)點(diǎn)的序號(hào)相同時(shí)就刪除內(nèi)循環(huán)的那個(gè)結(jié)點(diǎn)
// cout<<inner->next->data->number<<"去重成功!!"<<endl;
// inner->next = inner->next->next;
// l->length -= 1;
//
// }
// inner = inner->next;//循環(huán)變量
// }
// cout<<"111"<<endl;
// r = r->next;
// cout<<r->data->number<<endl;
// }
}
int main()
{
LinkList l1 = init_list();
int num = 0;
while(1){
//1.展示功能界面
cout<<"***歡迎來(lái)到圖書(shū)管理系統(tǒng)***"<<endl;
cout<<"******1.存入圖書(shū)信息******"<<endl;
cout<<"******2.圖書(shū)進(jìn)行漲價(jià)******"<<endl;
cout<<"******3.逆轉(zhuǎn)圖書(shū)信息******"<<endl;
cout<<"******4.找出最貴圖書(shū)******"<<endl;
cout<<"******5.插入指定圖書(shū)******"<<endl;
cout<<"******6.為圖書(shū)表去重******"<<endl;
cout<<"******7.展示當(dāng)前圖表******"<<endl;
cout<<"**************************"<<endl;
cout<<"請(qǐng)輸入您想使用的功能編號(hào)(輸入0退出):"<<endl;
int answer;
cin>>answer;
if(answer == 0)
break;
if(answer == 1){
cout<<"請(qǐng)輸入您想要傳入圖書(shū)的個(gè)數(shù):"<<endl;
int n;
cin>>n;
creat_book_list(l1,n);
cout<<"存入成功!!"<<endl;
display(l1);
num++;
}
else if(num == 0){
cout<<"只有存入圖書(shū)信息后才能使用該功能!!"<<endl;
}
else if(answer == 2){
add_price(l1);
cout<<"漲價(jià)成功!!"<<endl;
display(l1);
}
else if(answer == 3) {
reverse_link(l1);
cout<<"逆轉(zhuǎn)成功!!"<<endl;
display(l1);
}
else if(answer == 4){
find_most_dear(l1);
}
else if(answer == 5){
cout<<"請(qǐng)輸入要插入的數(shù)據(jù):"<<endl;
float price;
string name,number;
cin>>number>>name>>price;
Book *boo = init_book(number,name,price);
cout<<boo->price<<boo->name<<endl;
cout<<"請(qǐng)輸入想要插入的位置(從0開(kāi)始):"<<endl;
int ind;
cin>>ind;
if(insert_book(l1,ind,boo) == 0)
cout<<"插入成功!!"<<endl;
else
cout<<"插入失敗??!"<<endl;
display(l1);
}
else if(answer == 6){
delete_same_number(l1);
display(l1);
}
else if(answer == 7)
display(l1);
else
cout<<"請(qǐng)輸入有效數(shù)字!!"<<endl;
}
/*
//測(cè)試
LinkList l1 = init_list();
creat_book_list(l1,10);
display(l1);
// add_price(l1);
// display(l1);
//
// reverse_link(l1);
// display(l1);
//
find_most_dear(l1);
display(l1);
// cout<<"請(qǐng)輸入要插入的數(shù)據(jù):"<<endl;
// float price;
// string name,number;
// cin>>number>>name>>price;
// Book *boo = init_book(number,name,price);
// insert_book(l1,1,boo);
// display(l1);
//
// delete_same_number(l1);
// display(l1);
*/
return 0;
}
// over!!
到了這里,關(guān)于圖書(shū)管理系統(tǒng)——鏈表實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!