重庆邮电大学数据结构实验一

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <algorithm>

using namespace std;//排序函数
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 
#define OVERFLOW -2
#define LIST_MAXSIZE 1000//定义图表的最大长度

//定义图书表的顺序储存结构
//定义图书信息
typedef struct {
    char no[20];//ISBN
    char name[50];//书名
    float price;//价格
} Book;

typedef struct node//用于链表去重
{
    long long int no;
    char name[50];
    double price;
    struct node* next;
} Book1, * BookList;

//定义顺序储存结构类型
typedef struct {
    Book* elem;//储存空间基地址
    int length;//当前图书个数
} SqList;
typedef int ElemType;

//初始化一个顺序表
ElemType InitList_SqList(SqList& L) {
    L.elem = (Book*)malloc(LIST_MAXSIZE * sizeof(Book));//分配空间
    if (!L.elem)//分配失败
    {
        exit(OVERFLOW);
    }
    L.length = 0;//空表长度为0
    return OK;
}

//顺序表输入
ElemType ListInsert(SqList& L) {
    int i = 1;
    while (1) {
        if (i > LIST_MAXSIZE)//输入图书信息数超过最大值,退出	
        {
            exit(OVERFLOW);
        }
        scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输入图书数据 		
        if (!strcmp(L.elem[i].no, "0") && !strcmp(L.elem[i].name, "0") && L.elem[i].price == 0) {
            break;//输入结束标志0 0 0,表示停止输入
        }
        i++;
    }
    L.length = i - 1;
    return i - 1;
}


//顺序表输出
ElemType ListOutput(SqList& L) {
    for (int i = 1; i <= L.length; i++) {
        printf("%s %s %.2f\n", L.elem[i].no, L.elem[i].name, L.elem[i].price);//输出图书信息表 		
    }
    return OK;
}

//顺序表排序
bool cmp(Book L1, Book L2) {//按照价格降序排序
    if (L1.price > L2.price)
        return true;
    else
        return false;
}

ElemType SqSort(SqList& L) {//排序(顺序存储)
    sort(&(L.elem[1]), &(L.elem[L.length + 1]), cmp);
    return OK;
}

//顺序表修改价格
ElemType SqList_Price(SqList& L) {
    float avg = 0;//平均价格 
    for (int i = 1; i <= L.length; i++) {
        avg += L.elem[i].price;//计算所有书的总价格 
    }
    avg /= L.length;//所有书的平均价格=总价/书本数量 
    for (int i = 1; i <= L.length; i++) {
        if (L.elem[i].price >= avg)//高于或等于平均价格的图书价格提高 10%
        {
            L.elem[i].price *= 1.1;
        }
        else if (L.elem[i].price < avg)//低于平均价格的图书价格提高20%
        {
            L.elem[i].price *= 1.2;
        }
    }
    printf("%.2f\n", avg);//输出平均价格 
    return OK;
}

//顺序表找最贵的书
ElemType SqList_Max(SqList& L) {
    int n;//图书数目 
    printf("请输入数据:\n");
    scanf("%d", &n);//输入图书数目 
    InitList_SqList(L); //初始化线性表 	
    L.length = n;//给线性表中的图书数目赋值 
    if (n < 1 || n > LIST_MAXSIZE)
        return OK;
    int i = 1;
    while (i <= n) {
        scanf("%s %s %f", L.elem[i].no, L.elem[i].name, &L.elem[i].price);//输入图书信息表 
        i++;
    }
    int maxprice[LIST_MAXSIZE];//最贵图书在线性表中的编号 
    int len = 0, max = 0;//len:最贵图书的数目  max:最贵图书价格
    printf("\n");
    printf("--------------------------------------------\n");
    printf("\n");
    printf("输出的结果为:\n");
    for (int i = 1; i <= n; i++)//查找最贵图书并记录其在线性表中的编号 
    {
        if (L.elem[i].price > max)//找到更贵的图书 
        {
            len = 1;//更贵图书的数目记为1 
            maxprice[len] = i;//记录更贵图书在线性表中的编号 
            max = L.elem[i].price;//修改最贵图书价格 
        }
        else if (max == L.elem[i].price)//找到下一本最贵图书
        {
            len++;//最贵图书的数目加1 
            maxprice[len] = i;//记录更贵图书在线性表中的编号			
        }
    }
    printf("%d\n", len);//输出最贵图书的数目
    for (int i = 1; i <= len; i++)//输出最贵图书的信息 
    {
        int j;
        j = maxprice[i];
        printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//根据编号输出最贵图书的信息 
    }
    return OK;
    //也可以采用顺序表删除
}


//顺序表图书位置查找
ElemType SqList_Place(SqList& L) {
    int n;//图书数量
    int i, j;
    Book b[LIST_MAXSIZE];
    printf("请输入数据\n");
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        scanf("%s %s %f", &b[i].no, &b[i].name, &b[i].price);
    }
    int m;//查找m次
    scanf("%d", &m);
    int b_1[LIST_MAXSIZE];
    for (int k = 0; k < m; k++) {
        scanf("%d", &b_1[k]);
    }
    printf("\n");
    printf("--------------------------------------------\n");
    printf("\n");
    printf("输出的结果为:\n");
    for (int k = 0; k < m; k++) {
        for (j = 1; j <= n; j++) {
            if (b_1[k] == j)//对应位置并输出
            {
                printf("%s %s %.2f\n", b[j].no, b[j].name, b[j].price);
            }
        }
        if (b_1[k] > i || b_1[k] < 1)//位置不存在
        {
            printf("抱歉,最佳位置上的图书不存在!\n");
        }
    }
    return OK;
}

//顺序表新书入库
ElemType SqList_Enter(SqList& L) {
    int n, j, i;
    Book in_b;
    printf("请输入数据\n");
    scanf("%d", &n);
    for (j = 1; j <= n; j++) {
        scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
    }
    L.length = n;
    scanf("%d", &i);
    if ((i < 1) || (i > L.length + 1) || (i == LIST_MAXSIZE)) {
        printf("\n");
        printf("--------------------------------------------\n");
        printf("\n");
        printf("抱歉,入库位置非法!\n");//i值不合法
        return ERROR;
    }
    else {
        scanf("%s %s %f", &in_b.no, &in_b.name, &in_b.price);
        printf("\n");
        printf("--------------------------------------------\n");
        printf("\n");
        printf("输出的结果为:\n");
        for (j = L.length; j >= i; j--) {
            L.elem[j + 1] = L.elem[j];//插入位置及之后的元素右移
        }
        L.elem[i] = in_b;//将新元素e放入第i个位置
        ++L.length;//表长加1
        for (j = 1; j <= L.length; j++) {
            printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表 		
        }
        return OK;
    }
}

//顺序表旧书出库
ElemType SqList_Output(SqList& L) {
    int n, j, i;
    printf("请输入数据\n");
    scanf("%d", &n);
    for (j = 1; j <= n; j++) {
        scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
    }
    L.length = n;
    scanf("%d", &i);
    if ((i < 1) || (i > L.length)) {
        printf("\n");
        printf("--------------------------------------------\n");
        printf("\n");
        printf("抱歉,出库位置非法!\n");//i值不合法
        return ERROR;
    }
    else {
        printf("\n");
        printf("--------------------------------------------\n");
        printf("\n");
        printf("输出的结果为:\n");
        for (j = i + 1; j <= n; j++) {
            L.elem[j - 1] = L.elem[j];//删除位置及之后的元素左移
        }
        --L.length;//表长减1
        for (j = 1; j <= L.length; j++) {
            printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表 		
        }
        return OK;
    }
}

//顺序表去重
ElemType SqList_Repeat(SqList& L) {
    int n, j, i, t;
    printf("请输入数据\n");
    scanf("%d", &n);
    for (j = 1; j <= n; j++)//输入
    {
        scanf("%s %s %f", L.elem[j].no, L.elem[j].name, &L.elem[j].price);
    }
    L.length = n;
    for (i = 1; i <= n; i++)//书号循环对比
    {
        for (j = i + 1; j <= n; j++) {
            if (!strcmp(L.elem[i].no, L.elem[j].no))//重复删除
            {
                for (t = j + 1; t <= n; t++) {
                    L.elem[t - 1] = L.elem[t];//删除位置及之后的元素左移
                }
                --n;//表长减1
                --j;
            }
        }
    }
    printf("\n");
    printf("--------------------------------------------\n");
    printf("\n");
    printf("输出的结果为:\n");
    printf("%d\n", n);
    for (j = 1; j <= n; j++) {
        printf("%s %s %.2f\n", L.elem[j].no, L.elem[j].name, L.elem[j].price);//输出图书信息表 		
    }
    return OK;
}


int main() {
    int a;
    printf("问题如下:\n");
    printf("1、基于顺序表存储结构的图书信息表的创建和输出?\n");

    printf("2、基于顺序表存储结构的图书信息表的修改?\n");

    printf("3、基于顺序表存储结构的图书信息表的最贵图书的查找?\n");


    printf("4、基于顺序表存储结构的图书信息表的新图书的入库?\n");
    printf("5、基于顺序表存储结构的图书信息表的旧图书的出库?\n");
    printf("6、基于顺序表存储结构的图书信息表的图书去重?\n");

    printf("请输入你想查看的问题(输入数字):\n");
    scanf("%d", &a);
    if (a > 0 && a < 11) {//顺序表
        switch (a) {
        case 1: {//顺序表的创建和输出
            SqList L;
            InitList_SqList(L);
            printf("请输入数据:\n");
            int i;
            i = ListInsert(L);
            printf("\n");
            printf("--------------------------------------------\n");
            printf("\n");
            printf("输出的结果为:\n");

            printf("%d\n", i);
            ListOutput(L);
            break;
        }

        case 2: {//顺序表修改价格
            SqList L;
            InitList_SqList(L);
            printf("请输入数据:\n");
            ListInsert(L);
            printf("\n");
            printf("--------------------------------------------\n");
            printf("\n");
            printf("输出的结果为:\n");
            SqList_Price(L);
            ListOutput(L);
            break;
        }

        case 3: {//找出最贵的书
            SqList L;
            SqList_Max(L);
            break;
        }


        case 4: {//新图书的入库
            SqList L;
            InitList_SqList(L);
            SqList_Enter(L);
            break;
        }
        case 5: {//旧书出库
            SqList L;
            InitList_SqList(L);
            SqList_Output(L);
            break;
        }
        case 6: {//去重
            SqList L;
            InitList_SqList(L);
            SqList_Repeat(L);
            break;
        }
        }
    }
    system("pause");
    return 0;
}
基于线性表的图书信息管理
一、实验目的
1. 掌握线性表的顺序存储表示和链式存储表示。
2. 掌握顺序表和链表的基本操作,包括创建、查找、插入和删除等算法。
3. 明确线性表两种不同存储结构的特点及其适用场合,明确它们各自的优缺
点。
二、实验内容
选用顺序表或链表实现下述线性表的的基本操作。
1. 基于顺序(链式)存储结构的图书信息表的创建和输出
问题描述
定义一个包含图书信息 ( 书号、书名、价格 ) 的顺序表(链表),读入相应的
图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行
输出每本图书的信息。
输入要求
输入 n+1 行,其中前 n 行是 n 本图书的信息 ( 书号、书名、价格 ) ,每本图书
信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1
行是输入结束标志 :0 0 0( 空格分隔的三个 0) 。其中,书号和书名为字符串类型,
价格为浮点数类型。
输出要求
总计 n+1 行,第 1 行是所创建的图书信息表中的图书个数,后 n 行是 n 本图
书的信息 ( 书号、书名、价格 ) ,每本图书信息占一行,书号、书名、价格用空格
分隔。其中,价格输出保留两位小数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值