数据结构(线性顺序表的应用:图书管理系统)

一、实验名称:线性顺序表的应用——图书管理系统

二、实验目的

熟练掌握线性表的顺序存储方法,实现顺序表的基本操作,能够使用顺序表的基本操作完成图书管理的基本功能。

三、实验要求

1、建立头文件SqList.h,包含数据类型定义和基本操作。

2、建立程序文件SqListApp.cpp,通过调用头文件中的操作实现以下功能. (1)从数据文件中读入数据到顺序表 (2)遍历 (3)查找 (4)插入(5)删除(6)修改。

四、实验环境

(1) 硬件环境:微机一台;

(2) 软件环境:windows7+VC++ 2010/6.0集成开发环境。

五、实验内容(测试数据可以更改,根据自己实现的题目改写下面的内容)

1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表

2 查找:读取第idx个元素的值(idx=4)

3 修改(按价格查找):查找价格是price的图书信息(price=38),把38修改成30.

4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.

5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4 然后遍历顺序表(idx=3,elem_ins4=(9787302180632  数据结构实用教程 35)

6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5,然后遍历顺序表(elem_ins5=9787302180633   算法与数据结构   30)

7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6,  然后输出elem_dele6,  遍历顺序表(idx=5)

8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7,  然后然后输出elem_dele7

ISBN            书名                         定价
9787302257646     程序设计基础            25
9787302219972     单片机技术及应用        32
9787302203513     编译原理            46
9787811234923     汇编语言程序设计教程        21
9787512100831     计算机操作系统            17
9787302265436     计算机导论实验指导        18
9787302180630     实用数据结构            29
9787302225065     数据结构(C语言版)        38
9787302171676     C#面向对象程序设计        39
9787302250692     C语言程序设计            42
9787302150664     数据库原理            35
9787302260806     Java编程与实践            56
9787302252887     Java程序设计与应用教程        39
9787302198505     嵌入式操作系统及编程        25
9787302169666     软件测试            24
9787811231557     Eclipse基础与应用        35

SqList.h

#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include<Windows.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
#define MAXSIZE 100            //顺序表可能达到的最大长度
struct Book {
    string id;//ISBN
    string name;//书名
    double price;//定价
};
typedef Book ElemType;
typedef struct {
    ElemType *elem; //存储空间的基地址
    int length; //当前长度
} SqList;

Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
    //构造一个空的顺序表L
    L.elem = new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
    if (!L.elem)
        exit(OVERFLOW); //存储分配失败退出
    L.length = 0; //空表长度为0
    return OK;
}

    
    

void InputFromFile_Sq(SqList &L,string fn)
     {//顺序表信息输入,从book.txt文件中读入数据到线性表    
    string head_1,head_2,head_3;
    int i=L.length;
    fstream infile;
    infile.open("book.txt");
    if (!infile) {
        cout << "错误!未找到文件!" << endl;
        exit(ERROR);
        }
    infile >> head_1 >> head_2 >> head_3;
    while (!infile.eof()) {
    infile >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
    i++;
    }
    L.length = i;
    infile.close();
   }

Status GetElem(SqList L, int i, ElemType &e) {//算法2.2 顺序表的取值
    if (i < 1 || i > L.length)
        return ERROR; //判断i值是否合理,若不合理,返回ERROR
    e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
    return OK;
}

int LocateElem_Sq(SqList L, double e) { //算法2.3 顺序表的查找
    //顺序表的查找
    for (int i = 0; i < L.length; i++)
        if (L.elem[i].price == e)
            return i + 1;//查找成功,返回序号i+1
    return 0;//查找失败,返回0
}

Status ListInsert_Sq(SqList &L, int i, ElemType e) { //算法2.4 顺序表的插入
    //在顺序表L中第i个位置之前插入新的元素e
    //i值的合法范围是1<=i<=L.length+1
    if ((i < 1) || (i > L.length + 1))
        return ERROR; //i值不合法
    if (L.length == MAXSIZE)
        return ERROR; //当前存储空间已满
    for (int j = L.length - 1; j >= i - 1; j--)
        L.elem[j + 1] = L.elem[j]; //插入位置及之后的元素后移
    L.elem[i - 1] = e; //将新元素e放入第i个位置
    ++L.length; //表长增1
    return OK;
}

Status ListDelete_Sq(SqList &L, int i,ElemType &e) { //算法2.5 顺序表的删除
    //在顺序表L中删除第i个元素,并用e返回其值
    //i值的合法范围是1<=i<=L.length
    if ((i < 1) || (i > L.length))
        return ERROR; //i值不合法
    e=L.elem[i-1];
    for (int j = i; j <= L.length; j++)
        L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
    --L.length; //表长减1
    return OK;

void ListModify_Sq(SqList &L,double p1,double p2)
{//将顺序表中的元素价格为p1修改成p2
    //调用方法LocateElem_Sq找到price=p1元素的位序index,然后修改其price为p2
    int index=LocateElem_Sq(L,p1);
    if(index)
       L.elem[index-1].price=p2;
    else
        cout<<"no element price is "<<p1<<endl;
}

void Traverse_Sq(SqList L)
{//顺序表的输出
    cout << "当前图书系统信息(顺序表)读出:\n";
    for (int i = 0; i < L.length; i++)
       cout << left <<"No " <<i+1<<":  "<<setw(15) << L.elem[i].id << "\t" << left
        << setw(30) << L.elem[i].name << "\t" << left
        << setw(5) << L.elem[i].price << endl;
}
void showAuthor()
{
    cout<<endl;
    cout<<"\t\t\t----------------------------------------"<<endl;
    cout<<"\t\t\t***  学号 11111111111 姓名 张三三   ***"<<endl;
    cout<<"\t\t\t----------------------------------------"<<endl;
    cout<<"\t\t\t\t1 创建:创建顺序表list\n";
    cout<<"\t\t\t\t2 查找第idx个元素的值(idx=4)\n";
    cout<<"\t\t\t\t3 修改(按价格查找)\n";
    cout<<"\t\t\t\t4 修改(按书号查找)\n";
    cout<<"\t\t\t\t5 插入(在第i个元素前)\n"; 
    cout<<"\t\t\t\t6 插入(在元素e 前)\n";
    cout<<"\t\t\t\t7 删除(第i个元素)\n";
    cout<<"\t\t\t\t8 删除(删除元素e)\n";
    cout<<"\t\t\t\t0 退出\n";
    cout<<"\t\t\t请输入以下选项(0-8)\n";

}

void VisitElement(SqList L,int i)
{//输出顺序表中的第i个元素
       cout << left <<"VisitElement算法实现: No " <<i<<":  "<<setw(15) << L.elem[i-1].id << "\t" << left
        << setw(30) << L.elem[i-1].name << "\t" << left
        << setw(5) << L.elem[i-1].price << endl;
}

int LocateElemid_Sq(SqList L, string e) { 
    //顺序表的查找
    for (int i = 0; i < L.length; i++)
        if (L.elem[i].id == e)
            return i + 1;//查找成功,返回序号i+1
    return 0;//查找失败,返回0
}

void ListModifyById_Sq(SqList &L,string id,int p)
{//将顺序表中书号是id的元素价格修改成p
    //调用方法LocateElemById_Sq找到id元素的位序index,然后修改其price为p
    int index=LocateElemid_Sq(L,id);
if(index)
       L.elem[index-1].price=p;
    else
        cout<<"no element price "<<endl;

    
}

SqListApp.cpp

/*
//1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表
//2 查找:读取第idx个元素的值(idx=4)
//3 修改(按价格查找):查找价格是price的图书信息(price=38),把38修改成30.
//4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.
//5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4 然后遍历顺序表(idx=3,elem_ins4=(9787302180632  数据结构实用教程    35)
//6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5,然后遍历顺序表(elem_ins5=9787302180633   算法与数据结构   30)
//7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6,  然后输出elem_dele6,  遍历顺序表(idx=5)
//8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7,  然后然后输出elem_dele7,遍历顺序表 (elem=9787302180633   算法与数据结构   30)
  */
#include"Sqlist.h"
int main() {
    system("title 1111张三");
    system("date /T");                                                                    //显示当前日期
    system("TIME /T");
    system("color E4");                                                                   //改变运行界面的背景颜色和字体颜色


    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    SMALL_RECT rc;
    rc.Left = 0;
    rc.Top = 0; 
    rc.Right = 80;
    rc.Bottom = 30; 
    SetConsoleWindowInfo(hOut, TRUE, &rc);
    

    
    SqList list;
    string filename="book.txt";
    ElemType e;
    int idx=0;
    ElemType elem_ins4;
    elem_ins4.id="9787302180632";
    elem_ins4.name="数据结构实用教程";
    elem_ins4.price=35;
    ElemType elem_ins5;
    elem_ins5.id="9787302180633";
    elem_ins5.name="算法与数据结构";
    elem_ins5.price=40;
    ElemType elem_dele6,elem_dele7;
    int choose=-1;
    while(choose!=0)
    {
          showAuthor();
        cin>>choose;
        switch(choose)
        {

            case 1:    //1 创建:创建顺序表list,将数据文件book.txt文件中的数据读入顺序表,然后遍历顺序表
                
                    cout<<"---将数据文件book.txt文件中的数据读入顺序表---"<<endl;
                    if(InitList_Sq(list))
                        cout<<"顺序表创建成功"<<endl; // 创建顺序表
                    system("pause");

                    InputFromFile_Sq(list,filename);
                        cout<<"将数据读入顺序表"<<endl;  //将数据文件book.txt文件中的数据读入顺序表
                    system("pause");
                
                    Traverse_Sq(list);
                        cout<<"遍历顺序表成功"<<endl;   //遍历顺序表
                    system("pause");
                    system("cls");
                    break;
                        
  
            case 2://2 查找:读取第idx个元素的值(idx=4)
                        idx=4;
                        cout<<"---2 查找:读取第idx个元素的值(idx=4)---"<<endl;
            
                        GetElem(list,4,e);//算法2.2 顺序表的取值
                        cout<<"GetElem算法实现: No  4 "<<":  "<<"       "<<e.id<<"    "<<e.name<<"    "<<e.price<<endl;
                        VisitElement(list,4);//输出顺序表中的第i个元素
                        system("pause");
                        system("cls");
                    break;

            case 3://3 修改:查找价格是price的图书信息(price=38),把38修改成30. 
   
                         idx=LocateElem_Sq(list,38);
                        cout<<"---befor modify:---"<<endl;
                        VisitElement(list, idx);
                        ListModify_Sq(list ,38,30);
                        cout<<"---after modify:---"<<endl;
                        VisitElement(list, idx);
                        system("pause");
                        system("cls");
                    break;

            case 4:
    //4 修改(按书号查找):查找书号是id的图书信息(id=9787302252887),把价格修改成30.
                        
                        idx=LocateElemid_Sq(list,"9787302252887");
                        cout<<"---befor modify:---"<<endl;
                        VisitElement(list, idx);
                        ListModifyById_Sq(list,"9787302252887",30);
                        cout<<"---after modify:---"<<endl;
                        VisitElement(list, idx);
                        system("pause");
                        system("cls");
                    break;

            case 5://5 插入(在第i个元素前):在第idx个元素前插入元素elem_ins4 
                           idx=3;
                           cout<<"---5 插入(在第i个元素前)---"<<endl;
                           ListInsert_Sq(list,idx,elem_ins4);
                           Traverse_Sq(list);
                            system("pause");
                            system("cls");
                     break;

            case 6: //6 插入(在元素e 前):在元素elem_ins4 前插入元素elem_ins5
                     //(1)调用方法LocateElem_Sq找到elem_ins4所在的位序idx
                     //(2)调用方法ListInsert_Sq在第idx个元素前插入元素elem_ins5 
                            cout<<"---6 插入(在元素e 前)---"<<endl;    
                            idx=LocateElem_Sq(list,elem_ins4.price); 
                            ListInsert_Sq(list,idx,elem_ins5);
                            Traverse_Sq(list);
                            system("pause");
                            system("cls");

                     break;

            case 7:
        //7 删除(第i个元素):删除第idx个元素,把被删元素存入元素elem_dele6,  然后输出elem_dele6,  遍历顺序表(idx=5)
                        idx=5;
                        cout<<"---7 删除(第i个元素)---\n";
                        VisitElement(list,5);
                        ListDelete_Sq(list,idx,elem_dele6);
                        Traverse_Sq(list);
                        system("pause");
                        system("cls");

                    break;

            case 8:
        //8 删除(删除元素e):删除元素elem_ins5,把被删元素存入元素elem_dele7, 
       //    然后然后输出elem_dele7,遍历顺序表 (elem=9787302180633   算法与数据结构   30)
                        cout<<"---8 删除(删除元素e)---\n";
                        idx=LocateElem_Sq(list,elem_ins5.price); 
                        VisitElement(list,idx);
                        ListDelete_Sq(list,idx,elem_dele7);
                        Traverse_Sq(list);
                        system("pause");
                        system("cls");
                    break;
            case 0:break;
        }
    }
    return 0;
}

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值