单链表进行图书信息的存储和读取

      也不算是原创,再做关于图书管理系统时,查看了别人一些博客,做的关于单链表存储图书信息的内容,现在自己学的还是太浅,等以后对数据结构有了更深的认识,希望自己能用双向链表来做出图书管理系统的存储和读取,这样效率会更高些。
这篇文章会提到输入输出流的问题
ifstream:    从硬盘读到内存  <<;
ofstrean:    从内存读到硬盘  >>;
打开文件的方式定义:
ios::binary             以二进制的方式打开,缺省的是文本方式;
ios::out                  将数据输出到硬盘中(ofstream);
ios::in                    将数据输入到内存中(ifstream);
ios::trunc               如果文件存在,将文件长度设置为0;
ios::app                 以追加的方式打开文件;
         话不多说,附上自己写的代码;
 

#include<iostream>
#incude<fstream>
#include<conio.h>
#include<string.h>

using namespace std;

struct Book
{
     string   Name;                                      //书名
     string   Author;                                    //作者
     string   Publisher;                                //出版商
     string    Date;                                       //日期
     string    ISBN;                                     //书号
     Book    *next;
}

/**************************初始化链表******************************/

void  InitList(Book *&L)                               /*在这里关于L指针的别名,我的理解感觉因为链表*next的原因,要取指针的指针;
 {                                                                   只能硬记住了,在列表中对链表的操作常用*&L,等以后更加理解了再来修改。*/
        L=new Book                                     //对L进行Book结构体的赋址;
        L->next=NULL;
}

/**************************运算符重载<<******************************/ 
 /* 这是对<<的重载,下篇文章会写关于复数的重载,总感觉这两个不一样,也可能是自己菜的缘故把*/

ostream   &operator<<(ostream &output,Book *&b)   //关于这里的ostream是ofstream的父类,就是继承来的,一个操作文件流。
{
       output<<b->Name<<'\t'<<b->Author<<'\t'<<b->Publisher<<'\t'<<b->Date<<'\t'<<b->ISBN<<'\t';
       return output;
}

/**************************运算符重载>>******************************/ 

istream &operator>>(istream &input,Book *&b)
{
       input>>b->Name>>b->b->Author->b->Publisher->b->Date->b->ISBN;
       return  input;
}

/**************************存储图书******************************/

void SaveData(Book *&L)
{
       Book *p=L->next;
       ofstream outfile;                                                                           //定义存储文件流
       outfile.open("C:/Users/ASUS/Desktop/Book.txt",ios::out);          //将文件由内存写到硬盘中
       while(p!=NULL)                                                                           /*这里说明一下为什莫这样能够保存到以前存在的信息,而不
       {                                                                                                      用ios::app从尾部添加,因为这样每次都在L链头前面加,
             outfile<<p<<endl;                                                                      后面会自动保存到文件不用添加,开始我没注意到,想
             p=p->next;                                                                                 要用ios::app尾加,发现错了。*/
       }
       outfile.close();                                                                            //一定要记得关闭文件。
}

/**************************读取图书******************************/

void ReadData(*&L)
{
      Book  *r,*s;
      r=L;
     ifstream infile;
     infile("C:/Users/ASUS/Desktop/Book.txt",ios::in|ios::binary) ;       //将内容从硬盘读到内存中去
     while(infile.peek()!=EOF)                                                              //上篇文章已经提到;
     {                           
           s=new Book;
           infile>>s;
           s->next=r->next;                                                                    //单链表的创建;
           r=s;
      }
     r->next=NULL;
}

/**************************增加图书******************************/

void AddBook()
{
       Book *L,*s;
       InitList(L);
       ReadData(L);
       s=new Book;
       while(1)
      {
            cout<<"增加图书信息(Y/N):"<<endl
            setbuf(stdin,NULL);                                                            //清除缓冲区;
           char c=getchar();
           if(c=='N')
              break;
           cout<<"书名:";
           cin>>s->Name;
           cout<<"作者:";
           cin>>s->Author;
           cout<<"出版商:";
           cin>>s->Publisher;
           cout<<"日期:";
           cin>>s->Date;
           cout<<"书号:";
           cin>>s->ISBN;
           cout<<"\n\n是否保存图书信息(Y/N):"<<endl;
           setbuf(stdin,NULL);
           char m=getchar();
           if(c=='Y')
              {
                    s->nextL->next;
                    L->next=s;
                    SaveData(L);
              }
          else
          cout<<"\n\n保存图书信息失败;\n"<<endl;
      }
   system("pause");                                          /*system函数,执行系统shell指令类似;pause类似于“请按任意键返回”等待用户按任
}                                                                           意键返回*/

int main()
{
    AddBook();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_28311415/article/details/81070085