数据结构课设:图书信息管理--顺序存储和链式存储

Posted 是Dream呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构课设:图书信息管理--顺序存储和链式存储相关的知识,希望对你有一定的参考价值。

@TOC

一、Chapter One【实验题目】

在本实验中,我选择了两种存储结构(顺序存储和链式存储)来对图书信息表的修改问题进行描述,即:3.基于顺序存储结构的图书信息表的修改问题描述 和 13.基于链式存储结构的图书信息表的修改问题描述。

1.基于顺序存储结构的图书信息表的修改问题描述

输入要求
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后,第n+1行是输入结束标志:000(空格分隔的三个0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出要求
总计n+l行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。

输入样例

9787302257646程序设计基础 25.00
9787302164340程序设计基础(第2版) 20.00
9787302219972单片机技术及应用 32.00
9787302203513单片机原理与应用技术 26.00
9787810827430工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0

输出样例

25.50
9787302257646程序设计基础  30.00
9787302164340程序设计基础(第2版)  24.00  
9787302219972单片机技术及应用  35.20
9787302203513 单片机原理与应用技术  28.60
9787810827430工业计算机控制技术——原理与应用  31.90
9787811234923汇编语言程序设计教程  25.20

2.基于链式存储结构的图书信息表的修改问题描述

输入要求
输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第nt1行是输人结束标志:000(空格分隔的三个0)。其中,书号和书名为字符串类型,价格为浮点数类型。
输出要求
总计n+1行,第1行是修改前所有图书的平均价格,后n行是价格修改后n本图书的信息,每本图书信息占一行,书号、书名、价格用空格分隔。其中,价格输出保留两位小数。

输入样例

9787302257646程序设计基础  25.00
9787302164340程序设计基础(第2版)  20.00
9787302219972单片机技术及应用  32.00
9787302203513 单片机原理与应用技术  26.00
9787810827430工业计算机控制技术——原理与应用29.00
9787811234923 汇编语言程序设计教程  21.00
0 0 0

输出样例

25.50
9787302257646程序设计基础30.00
9787302164340程序设计基础(第2版)24.00
9787302219972单片机技术及应用35.20
9787302203513单片机原理与应用技术28.60
9787810827430工业计算机控制技术——原理与应用31.90
9787811234923 汇编语言程序设计教程25.20

二、Chapter Two【实验分析】

1.实验整体思路:

分别用顺序存储和链式存储建立线性表,即图书信息表,通过函数创建线性表,初始化线性表,进行线性表的输入和输出。此时的图书平均价格就是我们创建所有图书价格相加再除以图书本数。接下来我们遍历两遍线性表,第一遍求出图书平均价格,第二次每本书的价格和平均价格逐个进行对比,大于等于平均价格的将图书价格乘以1.1,小于则乘以1.2,最后通过输入输出便可得到我们修改之后的数据。

2.实验详细步骤:

1.首先,我们利用#include和#define表明我们需要的头文件和宏,然后定义出一本书的信息;
2.对于顺序存储结构,我们首先创建出顺序存储的图书信息表,然后定义Init()函数初始化线性表,通过定义Insert()函数输入图书数据,再通过Output()函数输出图书信息表;最后通过Upprice()函数实现对图书价格的修改;
3.同理对于链式存储结构,我们首先创建出链式存储图书信息表的结点,然后定义Linit()函数初始化线性表,通过定义lInsert()函数利用头插法输入图书数据,再通过LinkOutput()函数输出图书信息表;最后通过LinkUpprice()函数实现对图书价格的修改;
4.最后,因为我们选择的是两种存储结构进行图书修改表的描述,我们在程序最后使用if语句进行两种存储结构的选择:1.顺序存储 2.链式存储;再通过对函数的调用来完成我们对图书价格的修改。

三、Chapter Three【运行截图】

1.顺序存储结构:

2.链式存储结构:

四、Chapter Four【源码详析】

#include <stdio.h>//头文件 
#include <malloc.h>
#include <string.h>
#include <algorithm> 
typedef int status;//函数状态
#define ERRER 0//错误
#define OVERFLOW -2//溢出
#define OK 1//完成 
typedef struct //一本书的信息 

    char ID[20];//书号的长度
    char Name[50];//书名的长度,
    float price;//价格    
BOOK;
typedef struct //图书信息表 (顺序存储)

    BOOK *elem;//一本书
    int length;//线性表的长度
BOOKlist;
status Init(BOOKlist &L)//初始化线性表(顺序存储)

    L.elem=(BOOK *)malloc(sizeof(BOOK)*20);//分配线性表空间, 线性表的长度是20 
    if (!L.elem) exit(OVERFLOW);//空间分配失败,退出 
    L.length=0;//线性表长度初始化为0
    return OK;//空间分配完成 

status Insert(BOOKlist &L)//输入图书数据(顺序存储) 

    int i=1;
    while(1)
    
        if (i>20) exit(OVERFLOW);//输入图书信息数超过最大值,退出  
        scanf ("%s %s %f",L.elem[i].ID,L.elem[i].Name,&L.elem[i].price);//输入图书数据        
        if (!strcmp(L.elem[i].ID,"0")&&!strcmp(L.elem[i].Name,"0"),L.elem[i].price==0) break;//输入0 0 0则停止输入 
        i++;
    
    L.length=i-1;
    return OK;

status Output(BOOKlist &L)//输出图书信息表(顺序存储) 

    for (int i=1;i<=L.length;i++)
    
        printf ("%s %s %.2f\\n",L.elem[i].ID,L.elem[i].Name,L.elem[i].price);//输出图书信息表       
    
    return OK;


status Upprice(BOOKlist &L)//提高图书价格(顺序存储) 

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


typedef struct LinkBOOKlist//图书信息表的一个结点(链式存储)

    BOOK elem;//数据域:存一本书的信息 
    LinkBOOKlist *next;//指针域:指向下一本书的地址 
LinkBOOKlist,*link;
status Linit (link &L)//初始化线性表(链式存储)

    L=(link)malloc(sizeof(LinkBOOKlist));//分配结点空间 
    if (!L) exit(OVERFLOW);//空间分配失败,退出 
    L->next=NULL;//下一本书的地址为空 
    return OK;//空间分配完成  

status lInsert (link L)//头插法输入图书数据(链式存储)

    while (1)
    
        link p =(link) malloc(sizeof(LinkBOOKlist));//新建结点并分配空间 
        if (!p) exit(OVERFLOW);//空间分配失败,退出
        scanf ("%s %s %f",p->elem.ID,p->elem.Name,&p->elem.price);//输入一本图书的信息 
        if (!strcmp(p->elem.ID,"0")&&!strcmp(p->elem.Name,"0")&&p->elem.price==0) break;//输入0 0 0则停止输入
        p->next=L->next;//将新建结点插入线性表 
        L->next=p;      
    
    return OK;

status LinkOutput (link L)//输出图书信息表 (链式存储)

    link p=L->next;
    while (p!=NULL)
    
        printf ("%s %s %.2f\\n",p->elem.ID,p->elem.Name,p->elem.price);//输出图书信息表 
        p=p->next;
    
    return OK;


status LinkUpprice(link &L)//提高图书价格(链式存储) 

    int num=0;//图书数量 
    float Average=0;//图书平均价格 
    link p=L->next;
    while (p!=NULL)//遍历线性表 
    
        Average+=p->elem.price;//计算图书总价 
        num++;//统计图书数量 
        p=p->next;
     
    Average/=num;//图书均价=总价/图书数量 
    p=L->next;
    while (p!=NULL)
    
        if (p->elem.price>=Average) p->elem.price*=1.1;//所有高于或等于平均价格的图书价格提高10%
        else if (p->elem.price<Average) p->elem.price*=1.2;//所有低于平均价格的图书价格提高20%
        p=p->next;
    
    printf ("%.2f\\n",Average);//输出图书均价 
    return OK;

int main()

    int i;
    // 此处设置一个选择函数 选择顺序存储方式或者链式存储方式。 
    printf ("选择存储方式:1.顺序存储  2.链式存储\\n");
    scanf("%d",&i);
    if (i==1)
    
        //分别调用四个函数,完成图书价格的修改 
        BOOKlist L;
        Init(L);   
        Insert(L);
        Upprice(L);
        Output(L);  
     
    else if (i==2)
    
        //分别调用四个函数,完成图书价格的修改 
        link L;
        Linit(L);       
        lInsert(L);  
        LinkUpprice(L);
        LinkOutput(L);
    
    return 0;

以上是关于数据结构课设:图书信息管理--顺序存储和链式存储的主要内容,如果未能解决你的问题,请参考以下文章

大学课设之Mysql图书管理设计

BJFU—214基于链式存储结构的图书信息表的创建和输出

数据结构开发:线性表的链式存储结构

数据结构与算法学习笔记:线性表Ⅰ

线性表的链式存储——线性表的链式存储结构

线性表的顺序存储结构和链式存储结构