数据结构课程设计图书管理系统

来源:互联网 发布:阜宁新闻网络发言人 编辑:程序博客网 时间:2024/04/26 15:50

*Copyright (c) 2017,烟台大学计算机与控制工程学院  *文件名称:图书信息管理系统*文件标识:无*内容摘要:实现图书信息的输入、插入、删除、修改、排序和输出*其他内容:无*当前版本:v1.0*完成日期:2017.12.21*创作人:高晶*/

#include <iostream>#include <iomanip>#include <stdio.h>#include <fstream>#include <string.h>#include <stdlib.h>#include <conio.h>//catch() 任意键继续#include <windows.h>//system("cls") 清屏#include "library.h"/************************************* 功能描述:申请一个新结点,并将其初始化* 输入参数:无* 输出参数:无************************************/void InitList(LinkList *&head)//创建一个头结点{head=(LinkList *)malloc(sizeof(LinkList));head->next=NULL;}void NewNode(LNode *head)// 创建完成调用addstudent()函数将新节点尾插法插入链表{        LNode *a;a=new LNode;//申请空间string s;cout<<"图书编号"<<endl;cin>>s;if(num(s,head)==1){    a->num=s;cout<<"图书名"<<endl;cin>>a->name;cout<<"图书作者: "<<endl;cin>>a->writer;cout<<"图书分类:   "<<endl;cin>>a->fenlei;cout<<"图书价格:    "<<endl;cin>>a->price;cout<<"图书数量:  "<<endl;cin>>a->coun;addstudent(a,head);}elsecout<<"编号已重复"<<endl;}/************************************* 功能描述:创建新的一个图书结构体,新节点。* 输入参数:无* 输出参数:无************************************/void addstudent(LNode *a,LNode *head)//添加图书{   LNode *p;if(head==NULL)//如果链表为空{head =a;a->next=NULL;return;//插入完成返回}else{    p = head;//从头结点开始找     while(p)//p非空则一直循环 {  if(p->next==NULL)//找到尾节点  {    p->next =a;   a->next =NULL;return;//插入完成返回  }   p= p->next;//找下一个节点 }}}/************************************* 功能描述:销毁线性表* 输入参数:无* 输出参数:无************************************/void DestroyList(LinkList *&head)//销毁线性表{LinkList *pre=head->next,*p=head->next->next; //准备好前驱后置指针while (p!=NULL){free(pre);//释放内存空间pre=p;p=pre->next;}free(pre);head->next=NULL;cout<<"图书信息已清空"<<endl;}/************************************* 功能描述:求图书种类个数* 输入参数:无* 输出参数:无************************************/int ListLength(LinkList *head)//求图书个数{    int n=0;  LinkList *p=head->next;  while (p->next!=NULL)  { n++; p=p->next;  }  return (n+1);}/************************************* 功能描述:显示所有图书的信息,调用shuchujiedian()函数* 输入参数:无* 输出参数:输出图书的名、号、作者、价格,分类号,数量************************************/void DispList(LNode *head)//输出线性表{LinkList *p=head->next;if(p==NULL){cout<<"现在还没图书信息,请先输入图书信息"<<endl;return;}else{while (p!=NULL) {shuchujiedian(p);p=p->next; }}cout<<"共有"<<ListLength(head)<<"个图书"<<endl;}/************************************* 功能描述:根据输入的编号删除图书信息* 输入参数:图书编号* 输出参数:无************************************/void deletestudent(LNode *head)//删除图书信息{string num;int m;LNode *p,*pre;cout<<"请输入要删除图书的编号:";   cin>>num; if (head==NULL) { cout<<"编号输入有误"<<endl;     return; } else {    p=pre=head;while(p){     if (p->num==num) {    shuchujiedian(p);    cout<<"是否要删除图书信息?"<<endl;    cout<<" 1.是    2.不是    "<<endl;    cin>>m;if(m==1){if(p==head){head = head->next;free(p);p=NULL;cout<<"图书成绩信息删除!"<<endl;return;} else {pre->next =p->next;free(p);p=NULL;cout<<"图书信息已删除!"<<endl;return; }}if(m==2){return;}}else {pre=p;p=p->next; } }}cout<<"编号输入有误"<<endl;}/************************************* 功能描述:根据输入的名查找信息* 输入参数:图书编号* 输出参数:无************************************/void findstudentname(LNode *head)//按名查图书{   string name;   int i=0;cout<<"请输入要查找的图书名"<<endl;cin>>name;LNode *p=head;if (head==NULL){cout<<"现在还没图书信息,请先输入图书信息"<<endl;return;}while(p){  if (p->name==name)  {        shuchujiedian(p);        i++;  }   p= p->next;}if(i==0)cout<<"没有该本图书!"<<endl;}void findstudentnum(LNode *head)//按号查找图书{        string num;cout<<"请输入要查找的图书编号"<<endl;cin>>num;LNode *p=head;if (head==NULL){cout<<"现在还没图书信息,请先输入图书信息"<<endl;return;}p=head;while(p){  if (p->num==num)  {       shuchujiedian(p);       return;  }   p= p->next;}cout<<"没有该本图书!"<<endl;}/************************************* 功能描述:判断编号是否重复* 输入参数:无* 输出参数:无************************************/int num(string a,LNode *head)//判断号是否重复{    for(LNode *p=head;p!=NULL;p=p->next)   if(p->num==a)    return 0;   return 1;}/************************************* 功能描述:根据输入的编号查找信息* 输入参数:图书号* 输出参数:无************************************/void ChangeMarkByNum(LNode *head)//根据号修改图书{    LNode *p;    string num;    int m;    int mark1;    string mark2;    string mark3;    p=head;    cout<<"请输入图书编号: "<<endl;    cin>>num;    while(p)    {        if(p->num==num)        {           shuchujiedian(p);           cout<<"是否要修改图书信息?"<<endl;           cout<<" 1.是    2.不是    "<<endl;           cin>>m;            if(m==1){cout<<"请输入新的分类号"<<endl;cin>>mark3;cout<<"请输入新的价格"<<endl;cin>>mark2;cout<<"请输入新的数量"<<endl;cin>>mark1;p->coun=mark1;p->fenlei=mark2;p->price=mark3;cout<<"信息修改成功!"<<endl;shuchujiedian(p);return;}if(m==2){cout<<"图书信息保留!"<<endl;return;}            break;}        p=p->next;}       cout<<"对不起,不存在编号为"<<num<<"的图书"<<endl;}/************************************* 功能描述:输出一个结点信息* 输入参数:无* 输出参数:输出图书的名、号、作者、分类号和数量************************************/void shuchujiedian(LNode *p)//输出一个结点信息{           cout<<"编号:"<<p->name;           cout<<setw(8)<<"图书名:"<<p->name;           cout<<setw(8)<<"作者:"<<p->writer;           cout<<setw(8)<<"分类号:"<<p->fenlei;           cout<<setw(8)<<"价格:"<<p->price;           cout<<setw(8)<<"数量:"<<p->coun<<endl;;}/************************************* 功能描述:保存链表数据到文件* 输入参数:无* 输出参数:无************************************/void Save(LNode *head)//保存链表数据到文件{    LNode *p1;     int h;     ofstream out;     h=ListLength(head);     out.open("xuesheng.txt",ios::app);     if(!out)        {        cout<<"打开文件失败!"<<endl;        }        p1=head->next;        out<<h<<endl;     while(p1)        {            out<<p1->num<<setw(5)<<p1->name<<setw(5)<<p1->writer<<setw(5)<<p1->coun<<setw(5)<<p1->fenlei<<setw(5)<<p1->price<<setw(5)<<endl;            p1=p1->next;        }        out.close();        cout<<"保存成功!"<<endl;        cout<<"输入任意字符!继续……";        getch();}void qing(){     ofstream out;     out.open("xuesheng.txt",ios::trunc);     if(!out)        {        cout<<"打开文件失败!"<<endl;        }        cout<<"清除成功!"<<endl;        out.close();     cout<<"输入任意字符!继续……";        getch();}/************************************* 功能描述:交换两个图书信息* 输入参数:无* 输出参数:无************************************/void huan(LNode *q,LNode *p){  LNode change;change.name=q->name;//将q结点的信息给changechange.num=q->num;change.writer=q->writer;change.coun=q->coun;change.price=q->price;change.fenlei=q->fenlei;q->name=p->name;//将p结点的信息给qq->num=p->num;q->writer=p->writer;q->coun=p->coun;q->price=p->price;q->fenlei=p->fenlei;p->name=change.name;//将change结点的信息给pp->num=change.num;p->writer=change.writer;p->coun=change.coun;p->price=change.price;p->fenlei=change.fenlei;}/************************************* 功能描述:按编号排序* 输入参数:无* 输出参数:图书信息************************************/void pai(LNode *head){   LNode change,*p,*q,*r;r=head->next;if(r==NULL){cout<<"现在还没图书信息,请先输入图书信息"<<endl;return;} while(r) {    p=r;    q=r->next;    while(q)    {        if((q->num)<(p->num))            huan(q,p);        q=q->next;}r=r->next; } DispList(head);}/************************************* 功能描述:显示菜单,根据用户的输入完成相应的功能* 输入参数:你要选择的功能的序号* 输出参数:选择的功能************************************/void Menu(LNode *head)// 显示菜单,根据用户的输入{    int choose;    int m=0;  cout<<"   图书 管理 系 统      "<<endl;  cout<<"         1.----采编入库         "<<endl;  cout<<"         2.----浏览图书信息         "<<endl;  cout<<"         3.----删除图书信息         "<<endl;  cout<<"         4.----查找图书信息         "<<endl;  cout<<"         5.----修改图书信息         "<<endl;  cout<<"         6.----保存图书信息         "<<endl;  cout<<"         7.----清除已有信息         "<<endl;  cout<<"         8.----清除文件信息         "<<endl;  cout<<"         9.----按编号排序           "<<endl;  cout<<"         0.----安全退出系统         "<<endl;   cin>>choose;/*取得用户的选择*/    while(1)  {  if(choose<0||choose>10)  {      cout<<"您输入的选项不存在,请重新输入"<<endl;      cin>>choose;  }  else    break;  }    switch(choose)    {    case 0:        exit(0);    case 1:        system("cls");        NewNode(head);        //创建新的一个tushu结构体,新节点        cout<<"输入任意字符!继续……"<<endl;        getch();        break;    case 2:        system("cls");        DispList(head);//输出图书信息        cout<<"输入任意字符!继续……"<<endl;        getch();        break;    case 3:        system("cls");        deletestudent(head);//删除图书信息        cout<<"输入任意字符!继续……"<<endl;        getch();        break;    case 4:       system("cls");       cout<<"请选择"<<endl;       cout<<"1.按图书名查找     2.按编号查找"<<endl;       cin>>m;       if(m==1)       findstudentname(head);//根据名查找图书信息       else       findstudentnum(head);//按照号查找图书信息       cout<<"输入任意字符!继续……"<<endl;       getch();       break;    case 5:       system("cls");       ChangeMarkByNum(head);//根据用户输入的号修改图书        getch();        break;    case 6:       system("cls");       Save(head);//保存数据        break;    case 7:       system("cls");       DestroyList(head);//清空图书信息        getch();        break;    case 8:        system("cls");        qing();        break;    case 9:        system("cls");        pai(head);        break;    default:        break;    }    Menu(head);}

运行截图:

主菜单:


采编入库:


浏览图书信息:


删除


查找


修改


保存


排序


阅读全文
0 0
原创粉丝点击