单链表实现图书管理系统.docx
《单链表实现图书管理系统.docx》由会员分享,可在线阅读,更多相关《单链表实现图书管理系统.docx(15页珍藏版)》请在冰豆网上搜索。
单链表实现图书管理系统
单链表:
typedefstruct{
charnum[20];
charname[50];
floatpri;
}Book;
typedefstructLNode{//线性表的单链表存储
Bookbook;//数据域
structLNode*next;//指针域
}LNode,*LinkList;
voidInput(LinkList&L){//前插法创建图书链表
LinkListp;
L=newLNode;
L->next=NULL;//初始化单链表
ifstreaminFile("book.txt");
if(!
inFile){
cerr<<"Cannotopenthisfile!
"<exit
(1);
}
charbook_head1[10],book_head2[10],book_head3[10];//定义文件中标题
inFile>>book_head1>>book_head2>>book_head3;//读取文件中的标题
while(!
inFile.eof()){//到达文件尾部前逐行依次读取所有图书数据
p=newLNode;//生成新结点
inFile>>p->book.num>>p->book.name>>p->book.pri;
p->next=L->next;//插入到表头
L->next=p;h
}
inFile.close();
cout<<"读取完毕!
"<}
voidOutput(LinkList&L){//输出
LinkListp;
p=L->next;
while(p){
cout<book.num<<"\t"<book.name<<"\t"<book.pri<p=p->next;
}
cout<<"\n信息显示完毕\n"<}
voidSearchname(LinkList&L){
LinkListp;
p=L->next;
charname1[20];
cout<<"请输入要查找的书名:
";
cin>>name1;
while(p){
if(strcmp(name1,p->book.name)==0){
cout<book.num<<"\t"<book.name<<"\t"<book.pri<}
p=p->next;
}
}
voidSearchnum(LinkList&L){
inti;
intj=0;
LinkListp;
p=L->next;//p指向第一个结点
cout<<"请输入要查找的书籍的位置";
cin>>i;
while(p&&jj++;
p=p->next;
}
if(!
p||j>i){//第i个元素不存在
cout<<"错误!
"<}
cout<<"第"<
"<cout<book.num<<"\t"<book.name<<"\t"<book.pri<}
voidMax(LinkList&L){
LinkListpmax,p;
pmax=L->next;
p=L->next->next;
while(p){
if(p->book.pri>pmax->book.pri)
pmax=p;
p=p->next;
}
cout<book.num<<"\t"<book.name<<"\t"<book.pri<}
voidSort(LinkListL){
cout<<"此功能还未实现,研究中"<}
voidInverse(LinkList&L){
LinkListp;//待插入到链表的节点
LinkListq;
p=L->next;
L->next=NULL;//初始化链表
ofstreamoutFile("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<book.num<<"\t"<book.name<<"\t"<book.pri<outFile<book.num<<"\t"<book.name<<"\t"<book.pri<p=p->next;
}
cout<<"信息已写入bookinverse.txt中!
"<}
voidCount(LinkListL){
inti=0;
LinkListp;
p=L->next;
while(p){
i++;
p=p->next;
}
cout<<"当前的图书总数为:
"<
}
voidInsert(LinkListL){
Bookbk;
LinkListp=L;//初始化
LinkLists=newLNode;//新结点s
inti;
intj=0;
cout<<"请输入待插入书籍的位置"<cin>>i;
cout<<"请输入待插入的书籍的信息"<cout<<"书号:
"<cin>>bk.num;
cout<<"书名:
"<cin>>bk.name;
cout<<"价格:
"<cin>>bk.pri;
while(p&&jj++;
p=p->next;
}
if(!
p||j>i-1){
cout<<"错误!
"<}
s->book=bk;//将结点s的数据域置为bk
s->next=p->next;//将结点s插入L中
p->next=s;
//重新写入book.txt文件
ofstreamoutFile("book.txt");
p=L->next;
while(p){
outFile<book.num<<"\t"<book.name<<"\t"<book.pri<p=p->next;
}
cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<}
voidDelete(LinkListL){
Bookbk1;
LinkListp=L;//初始化
LinkListq;//临时保存被删除结点的地址以备释放
inti;
intj=0;
cout<<"请输入待删除书籍的位置"<cin>>i;
while(p->next&&jj++;
p=p->next;
}
if(!
(p->next)||j>i-1){
cout<<"错误!
"<}
q=p->next;
p->next=q->next;
bk1=q->book;
deleteq;
//重新写入book.txt文件
ofstreamoutFile("book.txt");
p=L->next;
while(p){
outFile<book.num<<"\t"<book.name<<"\t"<book.pri<p=p->next;
}
cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<}
顺序表
typedefstruct{
Book*book;
intlength;//图书表的图书记录个数
}SqList;
voidInput(SqList&L){
inti=0;
charbook_head1[10],book_head2[10],book_head3[10];//定义文件中标题
L.book=newBook[MAXSIZE];
ifstreaminFile("book.txt");//打开文件
if(!
inFile){
cerr<<"Cannotopenthisfile!
"<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信息完毕!
"<}
voidOutput(SqListL){
for(inti=0;icout<}
cout<<"\n信息显示完毕\n"<}
voidSearchname(SqList&L){
inty;
charname1[20];
cout<<"请输入要查找的书名:
";
cin>>name1;
for(y=0;y//比较输入的name1与结构体数组中name是否相同;
if(strcmp(name1,L.book[y].name)==0){
cout<break;
}
}
}
voidSearchnum(SqList&L){
inti;
cout<<"请输入要查找的书的位置"<cin>>i;
cout<}
voidMax(SqListL){
intmax=0;
cout<<"价格最高的书是:
"<cout<<"书号"<<"\t"<<"书名"<<"\t"<<"价格"<for(inti=0;i{
if(L.book[i].pri>L.book[max].pri)
max=i;
}
cout<for(intj=0;j{
if(j!
=max)
if(L.book[j].pri==L.book[max].pri)
cout<}
cout<}
voidSort(SqListL){
//冒泡排序
Bookbook1;//重新定义一个结构体变量
for(intm=0;mfor(intn=0;nif(L.book[n].pri//交换结构体数组的值
book1=L.book[n];
L.book[n]=L.book[n+1];
L.book[n+1]=book1;
}
}
}
//写入booksort.txt文件
ofstreamoutFile("booksort.txt",ios:
:
out);
for(m=0;moutFile<}
outFile.close();
cout<<"排序后书籍信息已写入booksort.txt文件"<}
voidInverse(SqListL){
Input(L);
Bookbook2;
inti,j,k;
k=L.length/2;
for(i=0;ij=L.length-1-i;
book2=L.book[i];
L.book[i]=L.book[j];
L.book[j]=book2;
}
//写入bookinverse.txt文件
ofstreamoutFile("bookinverse.txt");
for(i=0;ioutFile<}
outFile.close();
cout<<"排序后书籍信息已写入bookinverse.txt文件"<}
voidCount(SqListL){
cout<<"当前的图书总数为:
"<}
voidInsert(SqListL){
Bookbook3;
inti;
intj;
cout<<"请输入待插入书籍的位置"<cin>>i;
cout<<"请输入待插入的书籍的信息"<cout<<"书号:
"<cin>>book3.num;
cout<<"书名:
"<cin>>book3.name;
cout<<"价格:
"<cin>>book3.pri;
if(i<1||i>L.length+1){//i值不合法
cout<<"输入的位置错误,请重新输入:
"<cout<<"请输入待插入书籍的位置"<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文件
ofstreamoutFile("book.txt");
for(i=0;ioutFile<}
outFile.close();
cout<<"插入新的书籍后的书籍信息已重新写入book.txt文件"<}
voidDelete(SqListL){
Bookbook4;
inti;
intj;
cout<<"请输入待删除书籍的位置"<cin>>i;
if(i<1||i>L.length){
cout<<"输入的位置错误,请重新输入:
"<cout<<"请输入待删除书籍的位置"<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文件
ofstreamoutFile("book.txt");
for(i=0;i}
outFile.close();
cout<<"删除所选书籍后的书籍信息已重新写入book.txt文件"<}