图书管理系统,数组存储和链表存储

#include <bits/stdc++.h>
using namespace std;
fstream in,out;
int n=0;
string temp[4];
struct book
{
    string isbn;
    string name;
    double price;
}b[205];
inline bool Check()//时间O(n),空间O(1)。检查是否读入图书信息
{
    if(n==0)
    {
        cout<<"请先选择1读取图书信息\n";
        return false;
    }
    return true;
}
inline void Input()//时间O(n),空间O(1)。读入图书信息
{
    in.open("book.txt",ios::in);
    if(!in)
    {
        cout<<"未找到book.txt\n";
        return;
    }
    n=1;
    for(int i=1;i<=4;++i)in>>temp[i];
    while(!in.eof())
    {
        in>>b[n].isbn>>b[n].name>>b[n].price;
        n++;
    }
    in.close();
}
inline void Output()//时间O(n),空间O(1)。输出图书信息
{
    if(Check())
    {
        cout<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
        for(int i=1;i<n;++i)
        {
            cout<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
        }
    }
}
inline void Length()//时间O(1),空间O(1)。输出图书总册数
{
    if(Check())cout<<""<<n-1<<"本书"<<endl;
}
inline void Find()//时间O(n),空间O(1)。遍历查找图书
{
    if(Check())
    {
        cout<<"请输入要查找的图书名字\n";
        bool flag=false;
        string str;
        cin>>str;
        for(int i=1;i<n;++i)
        {
            if(str==b[i].name)
            {
                flag=true;
                cout<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
            }
        }
        if(flag==false)cout<<"没有收录该图书\n";
    }
}
inline void Get()//时间O(1),空间O(1)。直接访问图书
{
    if(Check())
    {
        cout<<"请输入你要查看的序号\n";
        int num;
        cin>>num;
        if(num<1||num>n-1)
        {
            cout<<"输入非法\n";
            return;
        }
        cout<<left<<setw(15)<<b[num].isbn<<"\t"<<left<<setw(50)<<b[num].name<<"\t"<<left<<setw(5)<<b[num].price<<"\n";
    }

}
inline void Update()//时间O(n),空间O(1)。将图书信息存入book_out.txt文件里
{
    out.open("book_out.txt",ios::out);
    out<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
    for(int i=1;i<n;++i)
    {
        out<<left<<setw(15)<<b[i].isbn<<"\t"<<left<<setw(50)<<b[i].name<<"\t"<<left<<setw(5)<<b[i].price<<"\n";
    }
    out.close();
}
inline void Insert()//时间O(n),空间O(1)。在数组中插入新元素
{
    if(Check())
    {
        int num;
        cout<<"请输入要插入图书的位置\n";
        cin>>num;
        if(num<1||num>n)
        {
            cout<<"输入非法\n";
            return;
        }
        for(int i=n;i>num;--i)
        {
            b[i].isbn=b[i-1].isbn;
            b[i].name=b[i-1].name;
            b[i].price=b[i-1].price;
        }
        cout<<"请依次输入要插入的图书ISBN号,书名,价格\n";
        cin>>b[num].isbn>>b[num].name>>b[num].price;
        n++;
        Update();
    }
}
inline void Delete()//时间O(n),空间O(1)。在数组中删除元素
{
    if(Check())
    {
        int num;
        cout<<"请输入要删除图书的位置\n";
        cin>>num;
        if(num<1||num>n-1)
        {
            cout<<"输入非法\n";
            return;
        }
        for(int i=num;i<n-1;++i)
        {
            b[i].isbn=b[i+1].isbn;
            b[i].name=b[i+1].name;
            b[i].price=b[i+1].price;
        }
        n--;
        Update();
    }
}
inline void BubbleSort()//时间O(n^2),空间O(1)。冒泡排序
{
    if(Check())
    {
        for(int i=1;i<n-1;++i)
        {
            for(int j=1;j<n-i;++j)
            {
                if(b[j].price>b[j+1].price)
                {
                    swap(b[j],b[j+1]);
                }
            }
        }
        Update();
    }
}
inline void QuickSort(int left,int right)//时间O(nlog2n),空间O(nlogn)。快速排序
{
    if(left>=right)return;
    int i=left,j=right;
    double temp=b[left].price;
    while(i<j)
    {
        while(b[j].price>=temp&&i<j)--j;
        swap(b[i],b[j]);
        while(b[i].price<=temp&&i<j)++i;
        swap(b[i],b[j]);
    }
    QuickSort(left,i-1);
    QuickSort(i+1,right);
    return;
}
inline void QueryMax()//时间O(n),空间O(1)。查询最大值
{
    if(Check())
    {
        int mmax=b[1].price;
        int flag=1;
        for(int i=2;i<n;++i)
        {
            if(b[i].price>mmax)
            {
                flag=i;
                mmax=b[i].price;
            }
        }
        cout<<left<<setw(15)<<b[flag].isbn<<"\t"<<left<<setw(50)<<b[flag].name<<"\t"<<left<<setw(5)<<b[flag].price<<"\n";
    }
}
inline void Inverse()//时间O(n),空间O(1)。逆序存储图书信息
{
    if(Check())
    {
        for(int i=1;i<=n/2;++i)
        {
            swap(b[i],b[n-i]);
        }
    }
}
int main()
{
    while(1)
    {
        int opt;
        printf("欢迎使用图书管理系统,请输入整数来实现你需要的功能\n"
               "1.图书数据加载,使用数组进行存储\n"
               "2.输出所有图书信息\n"
               "3.总图书册数\n"
               "4.输入要查找图书的名字\n"
               "5.输入要查找图书的序号\n"
               "6.插入一本图书\n"
               "7.删除一本图书\n"
               "8.按价格冒泡排序\n"
               "9.按价格快速排序\n"
               "10.查询价格最大的图书\n"
               "11.逆序存储数据\n"
               "0.退出\n");
        scanf("%d",&opt);
        switch(opt)
        {
            case 1:Input();break;
            case 2:Output();break;
            case 3:Length();break;
            case 4:Find();break;
            case 5:Get();break;
            case 6:Insert();break;
            case 7:Delete();break;
            case 8:BubbleSort();break;
            case 9:if(Check()){QuickSort(1,n-1),Update();}break;
            case 10:QueryMax();break;
            case 11:Inverse();break;
            case 0:return 0;break;
        }
    }
    return 0;
}
array
#include <bits/stdc++.h>
using namespace std;
fstream in,out;
int n=0;
string temp[4];
struct Book
{
    string isbn;
    string name;
    double price;
};
inline void quicksort(Book b[],int left,int right)//时间O(nlog2n),空间O(log2n)。利用数组进行快速排序
{
    if(left>=right)return;
    int i=left,j=right;
    double temp=b[left].price;
    while(i<j)
    {
        while(b[j].price>=temp&&i<j)--j;
        swap(b[i],b[j]);
        while(b[i].price<=temp&&i<j)++i;
        swap(b[i],b[j]);
    }
    quicksort(b,left,i-1);
    quicksort(b,i+1,right);
    return;
}
class book
{
private:
    string isbn;
    string name;
    double price;
    book *next;
    static book *head;
    static book *tail;
public:
    book():next(NULL)
    {
        head=tail=this;
    }
    book(string a,string b,double c):isbn(a),name(b),price(c),next(NULL){}
    bool Check()//时间O(n),空间O(1)。检查是否读入图书信息
    {
        if(n==0)
        {
            cout<<"请先选择1读取图书信息\n";
            return false;
        }
        return true;
    }
    void Input()//时间O(n),空间O(n)。读入图书信息
    {
        in.open("book.txt",ios::in);
        if(!in)
        {
            cout<<"未找到book.txt\n";
            return;
        }
        n=1;
        tail=head;
        for(int i=1;i<=4;++i)in>>temp[i];
        while(!in.eof())
        {
            string a,b;
            double c;
            in>>a>>b>>c;
            tail->next=new book(a,b,c);
            tail=tail->next;
            n++;
        }
        in.close();
    }
    void Output()//时间O(n),空间O(1)。输出图书信息
    {
        if(Check())
        {
            cout<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
            book *now=head;
            while(now->next)
            {
                now=now->next;
                cout<<left<<setw(15)<<now->isbn<<"\t"<<left<<setw(50)<<now->name<<"\t"<<left<<setw(5)<<now->price<<"\n";
                if(now->next==NULL)break;
            }
        }
    }
    void Length()//时间O(1),空间O(1)。输出图书总册数
    {
        if(Check())cout<<""<<n-1<<"本书"<<endl;
    }
    void Find()//时间O(n),空间O(1)。遍历查找图书
    {
        if(Check())
        {
            cout<<"请输入要查找的图书名字\n";
            book *now=head;
            bool flag=false;
            string str;
            cin>>str;
            while(now->next)
            {
                now=now->next;
                if(now->name==str)
                {
                    flag=true;
                    cout<<left<<setw(15)<<now->isbn<<"\t"<<left<<setw(50)<<now->name<<"\t"<<left<<setw(5)<<now->price<<"\n";
                    if(now->next==NULL)break;
                }
            }
            if(flag==false)cout<<"没有收录该图书\n";
        }
    }
    void Get()//时间O(n),空间O(1)。遍历访问图书
    {
        if(Check())
        {
            cout<<"请输入你要查看的序号\n";
            int num;
            cin>>num;
            if(num<1||num>n-1)
            {
                cout<<"输入非法\n";
                return;
            }
            book *now=head;
            while(num--)now=now->next;
            cout<<left<<setw(15)<<now->isbn<<"\t"<<left<<setw(50)<<now->name<<"\t"<<left<<setw(5)<<now->price<<"\n";
        }
    }
    void Update()//时间O(n),空间O(1)。将图书信息存入book_out.txt文件里
    {
        out.open("book_out.txt",ios::out);
        out<<temp[1]<<"\n"<<left<<setw(15)<<temp[2]<<"\t"<<left<<setw(50)<<temp[3]<<"\t"<<left<<setw(5)<<temp[4]<<"\n";
        book *now=head;
        while(now->next)
        {
            now=now->next;
            out<<left<<setw(15)<<now->isbn<<"\t"<<left<<setw(50)<<now->name<<"\t"<<left<<setw(5)<<now->price<<"\n";
            if(now->next==NULL)break;
        }
        out.close();
    }
    void Insert()//时间O(n),空间O(1)。在链表指定位置中插入新元素
    {
        if(Check())
        {

            int num;
            cout<<"请输入要插入图书的位置\n";
            cin>>num;
            if(num<1||num>n)
            {
                cout<<"输入非法\n";
                return;
            }
            string a,b;
            double c;
            cout<<"请依次输入要插入的图书的ISBN号,书名,价格\n";
            cin>>a>>b>>c;
            book *now=head;
            while(now->next)
            {
                num--;
                if(num==0)
                {
                    break;
                }
                now=now->next;
            }
            book *temp=new book(a,b,c);
            temp->next=now->next;
            now->next=temp;
            n++;
            Update();
        }
    }
    void Delete()//时间O(n),空间O(1)。在链表指定位置中删除元素
    {
        if(Check())
        {
            cout<<"请输入要删除图书的位置\n";
            int num;
            cin>>num;
            if(num<1||num>n-1)
            {
                cout<<"输入非法\n";
                return;
            }
            book *now=head;
            while(--num)now=now->next;
            book *temp=now->next->next;
            delete now->next;
            now->next=temp;
            n--;
            Update();
        }
    }
    void BubbleSort()//时间O(n^2),空间O(1)。冒泡排序,采用交换相邻两点的数据域的方法
    {
        if(Check())
        {
            book *now=head;
            book *tmp1;
            book *tmp2;
            double temp1;
            string temp2,temp3;
            for(int i=1;i<n-1;++i)
            {
                now=head->next;
                for(int j=1;j<n-i;++j)
                {
                    tmp1=now;
                    tmp2=now->next;
                    if(tmp1->price>tmp2->price)
                    {
                        temp1=tmp1->price;
                        tmp1->price=tmp2->price;
                        tmp2->price=temp1;
                        temp2=tmp1->isbn;
                        tmp1->isbn=tmp2->isbn;
                        tmp2->isbn=temp2;
                        temp3=tmp1->name;
                        tmp1->name=tmp2->name;
                        tmp2->name=temp3;
                    }
                    now=now->next;
                }
            }
            Update();
        }
    }
    void QuickSort(int left,int right)//时间O(nlog2n),空间O(n)。将数据存储到数组中进行快速排序,再重新存储到链表中
    {
        if(Check())
        {
            book *now=head;
            int t=1;
            Book *b=new Book[n];
            while(now->next)
            {
                now=now->next;
                b[t].isbn=now->isbn;
                b[t].name=now->name;
                b[t].price=now->price;
                t++;
                if(now->next==NULL)break;
            }
            quicksort(b,left,right);
            tail=head;
            for(int i=1;i<t;++i)
            {
                tail->next=new book(b[i].isbn,b[i].name,b[i].price);
                tail=tail->next;
            }
            Update();
        }
    }
    void QueryMax()//时间O(n),空间O(1)。查询最大值
    {
        if(Check())
        {
            book *now=head;
            book *tmp=head->next;
            while(now->next)
            {
                now=now->next;
                if((now->price)>(tmp->price))
                {
                    tmp=now;
                }
                if(now->next==NULL)break;
            }
            cout<<left<<setw(15)<<tmp->isbn<<"\t"<<left<<setw(50)<<tmp->name<<"\t"<<left<<setw(5)<<tmp->price<<"\n";
        }
    }
    void Inverse()//时间O(n),空间O(n)。逆序存储图书信息
    {
        if(Check())
        {
            book *pre=NULL;
            book *phead=head;
            book *now=NULL;
            while(phead!=NULL)
            {
                now=phead->next;//保存剩余链表
                phead->next=pre;//断开剩余链表头结点pHead,指向pre
                pre=phead;//pre更新
                phead=now;//phead更新
            }
            tail=head;
            for(int i=1;i<n;++i)
            {
                tail->next=new book(pre->isbn,pre->name,pre->price);
                pre=pre->next;
                tail=tail->next;
            }
        }
    }
}List;
book *book::head;
book *book::tail;
int main()
{
    while(1)
    {
        int o;
        printf("欢迎使用图书管理系统,请输入整数来实现你需要的功能\n"
               "1.图书数据加载,使用链表进行存储\n"
               "2.输出所有图书信息\n"
               "3.总图书册数\n"
               "4.输入要查找图书的名字\n"
               "5.输入要查找图书的序号\n"
               "6.插入一本图书\n"
               "7.删除一本图书\n"
               "8.按价格冒泡排序\n"
               "9.按价格快速排序\n"
               "10.查询价格最大的图书\n"
               "11.逆序存储数据\n"
               "0.退出\n");
        scanf("%d",&o);
        switch(o)
        {
            case 1:List.Input();break;
            case 2:List.Output();break;
            case 3:List.Length();break;
            case 4:List.Find();break;
            case 5:List.Get();break;
            case 6:List.Insert();break;
            case 7:List.Delete();break;
            case 8:List.BubbleSort();break;
            case 9:List.QuickSort(1,n-1);break;
            case 10:List.QueryMax();break;
            case 11:List.Inverse();break;
            case 0:return 0;break;
        }
    }
    return 0;
}
list
北京林业大学图书馆计算机类图书采购列表
ISBN                      书名                    定价
9787302257646     程序设计基础    25
9787302164340     程序设计基础(第2版)    20
9787302219972     单片机技术及应用    32
9787302203513     单片机原理与应用技术    26
9787810827430     工业计算机控制技术——原理与应用    29
9787811234923     汇编语言程序设计教程    21
9787512100831     计算机操作系统    17
9787302202844     计算机操作系统基础与应用(第二版)    30
9787302265436     计算机导论实验指导    18
9787302131304     计算机数学    20
9787302162834     计算机数学    30
9787302221630     计算机数学(第二版)    25
9787811235388     计算机网络基础    32
9787302137849     计算机维护与维修    26
9787302188308     计算机系统组装与维护    26
9787512101517     计算机应用基础与信息处理案例教程    25
9787811239447     计算机英语    29
9787302257448     计算机硬件与维护    29.8
9787302125679     计算机专业英语    25
9787302235682     计算机专业英语    28
9787302149286     计算机专业英语(第2版)    25
9787302211860     计算机组成原理(第2版)    29.5
9787302215530     计算机组装与维护    27
9787302232629     计算机组装与维护    24
9787302180630     实用数据结构    29
9787302225065     数据结构(C/C#语言版)    28
9787302135180     数据结构              21
9787302228141     数据结构      28
9787302163282     数据结构实验与实训教程(第2版)    23
9787302194934     微机原理与汇编语言实用教程    32
9787302133841     微机原理与接口技术    31
9787302223771     微型计算机原理及应用技术    29
9787302171973     微型计算机原理与结构(第二版)    28
9787302184898     微型计算机原理与结构习题解答与实验指导    21
9787302162988     ARM9嵌入式系统设计与开发应用    35
9787302197850     ARM体系结构与程序设计    30
9787302222705     EDA技术与VerilogHDL    38
9787302250708     基于ARM的嵌入式系统接口技术    43
9787302225515     嵌入式LinuxC语言应用程序设计与实践    36
9787302250753     嵌入式Linux实时操作系统及应用编程    48
9787302253402     ARM9嵌入式系统设计与应用    39
9787302188667     ASP.NET&IIS7高级编程    79.8
9787302259596     ASP.NET程序设计实训教程    26
9787302195252     ASP.NET程序设计与软件项目实训    34
9787302220763     ASP.NET实践教程    29
9787302258117     ASP.NET网站开发案例教程    36
9787302197867     ASP案例汇编    25
9787302212850     ASP语言程序设计    33
9787302198499     Authorware7.0实用教程    28
9787811230710     C#程序设计易懂易会教程    32
9787302219583     C#程序设计与开发    27
9787302171676     C#面向对象程序设计    39.5
9787302266341     C#面向对象程序设计(第2版)    58
9787302250692     C语言程序设计    42
9787302201090     C语言程序设计(第2版)    35
9787302137634     C语言程序设计基础与实训教程    25
9787810824125     C语言程序设计教程(修订本)    22
9787302127970     C语言程序设计与应用开发    29
9787302202646     C语言简明教程    26
9787302254454     C语言课程设计案例精编(第二版)    52
9787302150664     J2ME无线开发实训教程    25
9787302176091     Java2程序设计基础    27
9787302246909     Java高级程序设计    29
9787302260806     Java编程与实践    36
9787302210542     Java程序设计    29
9787302170037     Java程序设计教程(第2版)    29.5
9787302252887     Java程序设计与应用教程    39
9787302129226     Java高级编程实用教程    28
9787302214953     Java应用案例教程    33
9787302266211     Java语言程序设计实用教程    39
9787302202059     JSP动态网站开发实用教程    35
9787302256502     MATLAB程序设计与应用基础教程    24
9787302127956     UML基础与应用(高等学校规划教材)    22
9787302179306     VB.NET程序设计实用教程    31
9787302195696     VB.NET程序设计与软件项目实训    29
9787302220381     VB程序设计案例汇编    22
9787302229070     VC++程序设计基础教程    28
9787302214489     VC++程序设计项目实践    26
9787302176909     VisualBasic.NET程序设计    24
9787302172246     VisualBasic程序设计实用教程    30
9787302176060     VisualBasic程序设计与应用    30
9787302255604     VisualBasic项目化教程同步训练题    28
9787302254461     VisualC#2008程序设计与应用教程    38
9787302241522     VisualC#程序设计与项目实践    35
9787302218753     Web应用程序设计技术——ASP.NET(C#)    29
9787302231660     Web应用程序设计技术——ASP.NET(第2版)    30
9787811232554     XML基础教程    25
9787302179832     XML实用教程    20
9787302165156     基于C#的WindowsCE程序开发实例教程    23
9787302215356     基于工作过程的Java程序设计    27
9787302198505     嵌入式操作系统及编程    25
9787302169666     软件测试    24
9787811232301     软件测试    17
9787302167884     软件测试教程    22
9787302204862     软件工程    23
9787302186137     软件开发生命周期    23
9787302198697     软件开发与管理    28
9787302226024     软件项目综合实训(.NET篇)    29
9787811231991     实用Java程序设计    25
9787811235890     实用软件工程    26
9787302195863     实用软件工程与实训    25
9787302199519     新编Java实用教程    48
9787811231557     Eclipse基础与应用    35
book.txt

链表和文件的操作还是不太熟,难度并不大。读写中文需要将输入的文件另存为ANCI编码,或者对字符串进行处理改变它的编码方式,这个比较难。

果然还是多看看书吧,插入和删除有点小bug,没有考虑位置,已经修改了。

猜你喜欢

转载自www.cnblogs.com/yoududezongzi/p/11509672.html