实验目的: 1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:分别定义一个包含图书信息(书号,书名,定价)的顺序表和链表,使其具有如下功能:
(1) 从给定的文件book.txt逐个读入图书信息;
(2) 逐个显示图书表中所有图书的相关信息;
(3) 统计表中图书个数;
(4) 输出图书价格最高的图书信息(考虑可能有多个);
(5) 计算所有图书的平均价格;
(6) 根据书名进行查找,返回相应书名的图书的书号和定价(考虑重名情况);
(7) 根据指定的位置,返回相应位置的图书的全部信息;
(8) 给定一本图书相关信息,插入到表中指定的位置,将插入后的结果重新写入文件book.txt;
(9) 删除指定位置的图书记录,将删除后的结果重新写入文件book.txt;
(10) 将图书表信息逆序存储,将逆序的图书信息存入文件book_inverser.txt中。
实现方法、实验结果及结论分析等:
顺序表:
#include #include #include #include using namespace std; #define SIZE 1000 typedef struct { //struct结构体将图书信息整在一起 char no[15]; //书号 数组大小至少比实际的大一,因为最后\\n char name[50]; //书名 float price; //定价 }Book; //图书信息定义 typedef struct{ Book *BK; //指针 int length; //定义图书表的图书记录个数 }SqList; void Input(SqList &L) //从book.txt 中读取图书数据 { int i=0; char BK_head1[10],BK_head2[10],BK_head3[10]; //定义数组串 L.BK=new Book[SIZE]; //申请内存空间 ifstream inFile(\"book.txt\"); //读入book的信息 文件输入流 if(!inFile) { //如果没有读入 cout<<\"Cannot open this file!\"< } inFile>>BK_head1>>BK_head2>>BK_head3;//读取文件中的标题 L.length=0; while(!inFile.eof()) //逐行依次读取所有图书数据 { inFile>>L.BK[i].no >>L.BK[i].name>>L.BK[i].price; i++; //记录图书个数 } L.length=i; inFile.close(); cout<<\"\\n读取book.txt 信息完毕,可以通过选项(2)查看图书生信息\\n\"< void Output(SqList &L) //逐个显示图书表中所有图书的相关信息 { for(int i=0;i //for( i=0;i void Count_Len(SqList L) //统计表中图书个数 { cout<<\"当前的图书总数为:\"< void max_price(const SqList &L)//输出图书价格最高的图书信息 { float max ; //定义max max=L.BK[0].price; //初始化 for(int i=0;i max=L.BK[i].price; for(int i=0;i cout< float Count_Price(const SqList &L) //计算所有图书的平均价格;const 因为不修改 { float sum = 0.0f; float count_price; for(int i=0; i sum += L.BK[i].price; count_price = sum /L.length ; } cout< } Book* Search(const SqList &L) //根据书名进行查找,返回相应书名的图书的书号和定价 Book为指针类型 { char *name; name=new char[50]; //为指针动态分配内存 cout<<\"请输入要查找的书名:\"; cin>>name; for(int i=0; i if(strcmp(name, L.BK[i].name) == 0) //比较字符串看是否相等来确定是否查找到 { cout<<(L.BK+i)->name<<\"\\"< //返回指针,指针对应着相应书名的书号和定价 } } cout<<\"没找到\"< return 0; } void find_pos(SqList &L) //根据指定的位置,返回相应位置的图书的全部信息 { int pos; cout<<\"输入位置\"< { cin>>pos; if(pos<1||pos>L.length) cout<<\"输入错误,请重新输入\"; //如果输入的位置不在搜索范围内,则输出“输入错误” else break; } cout< void Insert(SqList &L) //给定一本图书相关信息,插入到表中指定的位置,将插入后的结果重新写入文件book.txt { int pos; Book newbook; cout<<\"输入需要插入的图书位置\"< { cin>>pos; if(pos<1||pos>(L.length+1)) cout<<\"输入错误,请重新输入\"; else break; } cout<<\"输入图书相关信息(书名,序号,价格)\"; cin>>newbook.name>>newbook.no>>newbook.price; for(int i=L.length;i>pos-1;i--) L.BK[i]=L.BK[i-1]; L.BK[pos-1]=newbook; L.length++; Output(L); } void delete_book(SqList &L) //删除指定位置的图书记录,将删除后的结果重新写入文件book.txt { int pos; cout<<\"输入需要删除的图书位置\"; while(1){ cin>>pos; if(pos<1||pos>L.length) cout<<\"输入错误,请重新输入\"; else break; } for(int i=pos;i L.length--; Output(L); } void reverse(SqList &L) //将图书表信息逆序存储,将逆序的图书信息存入文件book_inverser.txt中 { for(int i=0;i Output(L); } void main() { char no; SqList L; while(1) { cout<<\"**************************** 欢学使用图书信息管理系统!*************************\"<<\"\\n\";//菜单选项 cout<<\"(1)输入图书信息\"<<\"\\n\"; cout<<\"(2)逐个显示图书信息\"<<\"\\n\"; cout<<\"(3)统计表中图书个数\"<<\"\\n\"; cout<<\"(4)输出图书价格最高的图书信息\"<<\"\\n\"; cout<<\"(5)计算所有图书的平均价格\"<<\"\\n\"; cout<<\"(6)根据书名进行查找\"<<\"\\n\"; cout<<\"(7)根据指定位置进行查找\"<<\"\\n\"; cout<<\"(8)插入图书信息到指定位置\"<<\"\\n\"; cout<<\"(9)删除指定位置的图书记录\"<<\"\\n\"; cout<<\"(a)将图书表信息逆序存储\"<<\"\\n\"; //不能写,因为单个字符 cout<<\"(0)退出系统\"<<\"\\n\"; cout<<\"\\n\"; cout<<\"请选择您需要的服务:\"; cin>>no; switch(no){ case '1': Input(L);break; case '2': Output(L);break; case '3': Count_Len(L);break; case '4': max_price(L);break; case '5': Count_Price(L);break; case '6': Search(L);break; case '7': find_pos(L);break; case '8': Insert(L);break; case '9': delete_book(L);break; case 'a': reverse(L);break; case '0': cout<<\"欢迎再次使用~bye bye~\"< default : cout<<\"请选择正确的操作!!\"< //.... } } } 链表: #include #include #include #include using namespace std; typedef struct { char no[15]; char name[50]; float price; }Book; //图书信息定义 typedef struct LNode{ //节点 Book data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; int num;//记录图书个数 void Input(LinkList &L){ //从book.txt 中读取信息,前插法创建图书链表 char BK_head1[10],BK_head2[10],BK_head3[10]; LinkList p; L=new LNode; L->next=NULL;//初始化单链表 ifstream inFile(\"book.txt\");//读入book的信息 文件输入流 if(!inFile) { cout<<\"Cannot open this file!\"< } inFile>>BK_head1>>BK_head2>>BK_head3;//读取文件中的标题 num=0; while(!inFile.eof()){ //逐行依次读取所有图书数据 p=new LNode; //生成新结点 inFile>>p->data.no>>p->data.name>>p->data.price; p->next=L->next; L->next=p; //插入到表头 num++; //记录图书个数 } inFile.close(); cout<<\"文件读取完毕\"< cout<<\"\\n读取book.txt 信息完毕,可以通过选项(2)查看图书信息\\n\"< void Output(LinkList &L){//逐个显示表中的信息 LinkList p; p=L->next; //for(int i=0;i //} while(p){ //setw()函数,设置域宽 cout< } cout<<\"\\n信息显示完毕\\n\"< void Count_Len(LinkList L){ //统计表中图书个数 cout<<\"当前的图书总数为:\"< void max_price(const LinkList &L){ //输出图书价格最高的图书信息 LinkList p; p=L->next; if(p==NULL) exit(1); float max=p->data.price; while(p!=NULL){ if(p->data.price>=max) max=p->data.price; p=p->next; } p=L->next; while(p!=NULL){ if(p->data.price==max) cout< } } float Count_Price(const LinkList &L){ LinkList p; float sum = 0.0f; float count_price; p=L->next; if(p==NULL) exit(1); while(p!=NULL){ sum+=p->data.price; //计算所有图书的平均价格 p=p->next; } count_price = sum /num ; cout< } Book* Search(const LinkList &L) { 价 Book为指针类型 LinkList p; p=L->next; if(p==NULL) exit(1); string name; cout<<\"请输入要查找的书名:\"; //根据书名进行查找,返回相应书名的图书的书号和定 cin>>name; int flag=1; while(p!=NULL) { if(p->data.name==name) { cout< } p=p->next; } if (flag) cout<<\"输入书名不存在\"< // if (flag==1) // cout<<\"输入书名不存在\"< // ..... } void find_pos(LinkList &L) LinkList p; p=L->next; if(p==NULL) exit(1); int pos; while(1){ cout<<\"输入查找位置:\"; { //根据指定的位置,返回相应位置的图书的全部信息 cin>>pos; if(pos<1||pos>num) cout<<\"输入错误,请重新输入\"; else break; } for(int i=1;i cout< void Insert(LinkList L){ //给定一本图书相关信息,插入到表中指定的位置,将插入后的结果重新写入文件book.txt LinkList p=L; LinkList newbook=new LNode; //new动态分配内存 int pos; cout<<\"输入插入位置:\"; while(1) { cin>>pos; if(pos<1||pos>num+1) //注意是num+1 cout<<\"输入错误,请重新输入\"; else break; } cout<<\"输入图书信息(书名,序号,价格):\"; cin>>newbook->data.name>>newbook->data.no>>newbook->data.price; for(int i=1;i newbook->next=p->next; p->next=newbook; num++; //此处与++num无区别,因为它不是在复合表达式中,而是一个语句 Output(L); } void delete_book(LinkList L){ //删除指定位置的图书记录,将删除后的结果重新写入文件book.txt LinkList p=L; LinkList book; //要删除的书 int pos; if(p->next==NULL) //删除是找它的前驱结点,然后。。如果前驱结点的指针域为空,则退出 exit(1); cout<<\"输入需要删除图书的位置:\"; while(1) { cin>>pos; if(pos<1||pos>num) cout<<\"输入错误,请重新输入\"; else break; } for(int i=1;i book=p->next; p->next=book->next; delete book; num--; Output(L); } void reverse(LinkList L){ //将图书表信息逆序存储,将逆序的图书信息存入文件book_inverser.txt中 LinkList p=L->next; //L为头指针,它指向表中第一个结点,此处p即为第一个结点 if(p==NULL) //表示头指针为空 exit(1); LinkList q; //前插法创建单链表 L->next=NULL; //首先让L头指针指向空 while(p!=NULL) { q=p->next; //将L链表一个元素一个元素的取,将取出一个元素p后剩下的链表部分 先保存q中 p->next=L->next; L->next=p; //将p插入到了L头指针后,即插入到了表头 p=q; //将上一步剩下的链表再赋给p,继续取链表头的第一个元素 } Output(L); } void main(){ char no; LinkList L; while(1) { cout<<\"**************************** 欢学使用图书信息管理系统!*************************\"<<\"\\n\";//菜单选项 cout<<\"(1)输入图书信息\"<<\"\\n\"; cout<<\"(2)逐个显示图书信息\"<<\"\\n\"; cout<<\"(3)统计表中图书个数\"<<\"\\n\"; cout<<\"(4)输出图书价格最高的图书信息\"<<\"\\n\"; cout<<\"(5)计算所有图书的平均价格\"<<\"\\n\"; cout<<\"(6)根据书名进行查找\"<<\"\\n\"; cout<<\"(7)根据指定位置进行查找\"<<\"\\n\"; cout<<\"(8)插入图书信息到指定位置\"<<\"\\n\"; cout<<\"(9)删除指定位置的图书记录\"<<\"\\n\"; cout<<\"(a)将图书表信息逆序存储\"<<\"\\n\"; cout<<\"(0)退出系统\"<<\"\\n\"; cout<<\"\\n\"; cout<<\"请选择您需要的服务:\"; //不能写,因为单个字符 cin>>no; switch(no){ case '1': Input(L);break; case '2': Output(L);break; case '3': Count_Len(L);break; case '4': max_price(L);break; case '5': Count_Price(L);break; case '6': Search(L);break; case '7': find_pos(L);break; case '8': Insert(L);break; case '9': delete_book(L);break; case 'a': reverse(L);break; case '0': cout<<\"欢迎再次使用~bye bye~\"< default : cout<<\"请选择正确的操作!!\"< //.... } } } 因篇幅问题不能全部显示,请点此查看更多更全内容