当前位置:文档之家› 单链表实现图书管理系统

单链表实现图书管理系统

单链表:typedef struct {char num[20];char name[50];float pri;}Book;typedef struct LNode{ //线性表的单链表存储Book book; //数据域struct LNode *next; //指针域}LNode,*LinkList;void Input(LinkList &L){ //前插法创建图书链表LinkList p;L=new LNode;L->next=NULL;//初始化单链表ifstream inFile("book.txt");if(!inFile){cerr<<"Cannot open this file!"<<endl;exit(1);}char book_head1[10],book_head2[10],book_head3[10]; //定义文件中标题inFile>>book_head1>>book_head2>>book_head3;//读取文件中的标题while(!inFile.eof()){//到达文件尾部前逐行依次读取所有图书数据p=new LNode; //生成新结点inFile>>p->book.num>>p->>>p->book.pri;p->next=L->next; //插入到表头L->next=p;h}inFile.close();cout<<"读取完毕!"<<endl;}void Output(LinkList &L){//输出LinkList p;p=L->next;while(p){cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;p=p->next;}cout<<"\n信息显示完毕\n"<<endl;}void Searchname(LinkList &L){LinkList p;p=L->next;char name1[20];cout<<"请输入要查找的书名:";cin>>name1;while(p){if(strcmp(name1,p->)==0){cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;}p=p->next;}}void Searchnum(LinkList &L){int i;int j=0;LinkList p;p=L->next; //p指向第一个结点cout<<"请输入要查找的书籍的位置";cin>>i;while(p&&j<i-1){ //顺着链表向后扫描,直到p指向第i个元素或p为空j++;p=p->next;}if(!p||j>i){ //第i个元素不存在cout<<"错误!"<<endl;}cout<<"第"<<i<<"本书信息如下:"<<endl;cout<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<set w(5)<<p->book.pri<<endl;}void Max(LinkList &L){LinkList pmax,p;pmax=L->next;p=L->next->next;while(p){if(p->book.pri>pmax->book.pri)pmax=p;p=p->next;}cout<<left<<setw(15)<<pmax->book.num<<"\t"<<left<<setw(50)<<pmax-><<"\t"<<l eft<<setw(5)<<pmax->book.pri<<endl;}void Sort(LinkList L){cout<<"此功能还未实现,研究中"<<endl;}void Inverse(LinkList &L){LinkList p; //待插入到链表的节点LinkList q;p = L->next;L->next = NULL; //初始化链表ofstream outFile("bookinverse.txt");//每一次将p插入到L(头结点)与L->next(链表的第一个结点之间)while (p){q = p->next;p->next = L->next;L->next = p;p = q;}p=L->next;//循环完后,p指向的是链表末尾,需要重置回首元结点,否则无法写入文件while(p){cout<<setw(15)<<p->book.num<<"\t"<<setw(50)<<p-><<"\t"<<setw(5)<<p->book.pri <<endl;outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"信息已写入bookinverse.txt中!"<<endl;}void Count(LinkList L){int i=0;LinkList p;p=L->next;while(p){i++;p=p->next;}cout<<"当前的图书总数为:"<<i<<endl;}void Insert(LinkList L){Book bk;LinkList p=L; //初始化LinkList s=new LNode; //新结点sint i;int j=0;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;cout<<"请输入待插入的书籍的信息"<<endl;cout<<"书号: "<<endl;cin>>bk.num;cout<<"书名: "<<endl;cin>>;cout<<"价格: "<<endl;cin>>bk.pri;while(p&&j<i-1){ //寻找第i-1个结点j++;p=p->next;}if(!p||j>i-1){cout<<"错误!"<<endl;}s->book=bk; //将结点s的数据域置为bks->next=p->next; //将结点s插入L中p->next=s;//重新写入book.txt文件ofstream outFile("book.txt");p=L->next;while(p){outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<<endl;}void Delete(LinkList L){Book bk1;LinkList p=L; //初始化LinkList q; //临时保存被删除结点的地址以备释放int i;int j=0;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;while(p->next&&j<i-1){j++;p=p->next;}if(!(p->next)||j>i-1){cout<<"错误!"<<endl;}q=p->next;p->next=q->next;bk1=q->book;delete q;//重新写入book.txt文件ofstream outFile("book.txt");p=L->next;while(p){outFile<<left<<setw(15)<<p->book.num<<"\t"<<left<<setw(50)<<p-><<"\t"<<left<<s etw(5)<<p->book.pri<<endl;p=p->next;}cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<<endl;}顺序表typedef struct{Book *book;int length;//图书表的图书记录个数}SqList;void Input(SqList &L){int i=0;char book_head1[10],book_head2[10],book_head3[10]; //定义文件中标题L.book=new Book[MAXSIZE];ifstream inFile("book.txt"); //打开文件if(!inFile) {cerr<<"Cannot open this file!"<<endl;exit(1);}inFile>>book_head1>>book_head2>>book_head3;//读取文件中的标题L.length=0;while(!inFile.eof()){ //逐行依次读取所有图书数据inFile>>L.book[i].num >>L.book[i].name>>L.book[i].pri;i++; //记录图书个数}L.length=i;inFile.close();cout<<"\n读取book.txt 信息完毕!"<<endl;}void Output(SqList L){for(int i=0;i<L.length;i++){cout<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name <<"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}cout<<"\n信息显示完毕\n"<<endl;}void Searchname(SqList &L){int y;char name1[20];cout<<"请输入要查找的书名:";cin>>name1;for(y=0;y<L.length;y++){//比较输入的name1与结构体数组中name是否相同;if(strcmp(name1,L.book[y].name)==0){cout<<left<<setw(15)<<L.book[y].num<<"\t"<<left<<setw(50)<<L.book[y].name<< "\t"<<left<<setw(5)<<L.book[y].pri<<endl;break;}}}void Searchnum(SqList &L){int i;cout<<"请输入要查找的书的位置"<<endl;cin>>i;cout<<left<<setw(15)<<L.book[i-1].num<<left<<setw(50)<<L.book[i-1].name<<left<<setw(5)<<L.book[i-1].pri<<endl;}void Max(SqList L){int max=0;cout<<"价格最高的书是:"<<endl;cout<<"书号"<<"\t"<<"书名"<<"\t"<<"价格"<<endl;for (int i=0;i<L.length;i++){if(L.book[i].pri>L.book[max].pri)max=i;}cout<<left<<setw(15)<<L.book[max].num<<"\t"<<left<<setw(50)<<L.book[max ].name<<"\t"<<left<<setw(5)<<L.book[max].pri<<endl;for (int j=0;j<L.length-1;j++){if(j!=max)if(L.book[j].pri==L.book[max].pri)cout<<left<<setw(15)<<L.book[j].num<<"\t"<<left<<setw(50)<<L.book[j].name <<"\t"<<left<<setw(5)<<L.book[j].pri<<endl;}cout<<endl;}void Sort(SqList L){//冒泡排序Book book1; //重新定义一个结构体变量for(int m=0;m<L.length-1;m++){for(int n=0;n<L.length-m-1;n++){if(L.book[n].pri<L.book[n+1].pri){//交换结构体数组的值book1=L.book[n];L.book[n]=L.book[n+1];L.book[n+1]=book1;}}}//写入booksort.txt文件ofstream outFile("booksort.txt",ios::out);for(m=0;m<L.length-1;m++){outFile<<left<<setw(15)<<L.book[m].num<<"\t"<<left<<setw(50)<<L.book[m].nam e<<"\t"<<left<<setw(5)<<L.book[m].pri<<endl;}outFile.close();cout<<"排序后书籍信息已写入booksort.txt文件"<<endl;}void Inverse(SqList L){Input(L);Book book2;int i,j,k;k=L.length/2;for(i=0;i<k;i++){j=L.length-1-i;book2=L.book[i];L.book[i]=L.book[j];L.book[j]=book2;}//写入bookinverse.txt文件ofstream outFile("bookinverse.txt");for(i=0;i<L.length;i++){outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name< <"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"排序后书籍信息已写入bookinverse.txt文件"<<endl;}void Count(SqList L){cout<<"当前的图书总数为:"<<L.length<<endl<<endl;}void Insert(SqList L){Book book3;int i;int j;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;cout<<"请输入待插入的书籍的信息"<<endl;cout<<"书号: "<<endl;cin>>book3.num;cout<<"书名: "<<endl;cin>>;cout<<"价格: "<<endl;cin>>book3.pri;if(i<1||i>L.length+1){ //i值不合法cout<<"输入的位置错误,请重新输入:"<<endl;cout<<"请输入待插入书籍的位置"<<endl;cin>>i;}for(j=L.length-1;j>=i-1;j--){L.book[j+1]=L.book[j]; //输入位置及之后的元素位置后移}L.book[i-1]=book3; //将新元素book3放入第i个位置L.length++; //表长增加1//重新写入book.txt文件ofstream outFile("book.txt");for(i=0;i<L.length;i++){outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<<setw(50)<<L.book[i].name< <"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<<endl;}void Delete(SqList L){Book book4;int i;int j;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;if(i<1||i>L.length){cout<<"输入的位置错误,请重新输入:"<<endl;cout<<"请输入待删除书籍的位置"<<endl;cin>>i;}book4=L.book[i-1]; //将要删除的元素保存在book4中for(j=i;j<=L.length-1;j++){L.book[j-1]=L.book[j]; //删除位置之后的元素前移}L.length--; //表长-1//重新写入book.txt文件ofstream outFile("book.txt");for(i=0;i<L.length;i++){ outFile<<left<<setw(15)<<L.book[i].num<<"\t"<<left<< setw(50)<<L.book[i].name<<"\t"<<left<<setw(5)<<L.book[i].pri<<endl;}outFile.close();cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<<endl;}。

相关主题