数据结构实验--基于线性表的图书信息管理系统

本文是依据数据结构习题解析与实验指导(李冬梅)一书中的第一个实验–基于线性表的图书信息管理系统所写的。

之所以写这个,是因为这个实验不仅涉及到线性表的结构设计,还包括一些线性表的基本操作,个人认为,做完这个实验,基本上对线性表就有一个基本的了解的。

本文采用编程语言为C

先说一下题目简介,自己设计一张图书信息表,包括以下10项常用的基本操作:图书信息表的创建和输出、排序、修改、逆序村春、最贵图书的查找、最爱图书的查找、最佳位置图书的查找、新图书的入库、旧图书的出库、图书去重。
要求分别用顺序存储结构和链式存储结构来实现。

文章目录

      • 1.顺序存储结构
      • 2.链式存储结构
      • 3. 2.txt文档

1.顺序存储结构

1.首先说一下定义的结构:

#include
#include
#define MAXSIZE 20
typedef struct{
    char number[100];
    char name[100];
    float price;
}information;
typedef struct Node{
    information date[MAXSIZE];
    int length;
}table;

2.初始化操作

table Init(){
    table t;
    t.length=0;
    return t;
}

还有显示操作:

void ShowTable(table *T){
    ChangePrice(T);
    for(int i=0;i<T->length;++i){
        printf("%s  %s  %.2f\n",T->date[i].number,T->date[i].name,T->date[i].price);
    }
}

3.表的创建和输出(因为输入是有一定的格式的,详情请看书,本人有点懒,没有搜到相关pdf,又不喜欢打字,就辛苦你们了)输入以0 0 0 结束

void CreateTable(table *T){
        for(int i=T->length;;++i){
            scanf("%s %s %f",&T->date[i].number,&T->date[i].name,&T->date[i].price);
            if(T->date[i].number[0]=='0'){
                break;
            }
            else{
                T->length++;
            }

        }

}

4.表的排序(按照图书价格降序排列)

void SortTable(table *T){
    for(int i=0;i<T->length;++i){
        for(int j=i+1;j<T->length;++j){
            if(T->date[i].price<T->date[j].price){
                information temp;
                temp=T->date[i];
                T->date[i]=T->date[j];
                T->date[j]=temp;
            }
        }
    }
}

5.表的修改(修改图书相应的价格,这里不厚道的)

void ChangePrice(table *T){
    float sum=0;
    for(int i=0;i<T->length;++i){
        sum+=T->date[i].price;
    }
    float average = sum/T->length;
    for(int i=0;i<T->length;++i){
        if(T->date[i].price>=average){
            T->date[i].price*=1.1;
        }else{
            T->date[i].price*=1.2;
        }
    }
}

6.最贵图书查找(输出相关信息,要是有相同价格的都输出)

void TheMostExpensive(table *T){
    float Maxprice=0;
    int index;
    for(int i=0;i<T->length;++i){
        if(Maxprice<T->date[i].price){
            Maxprice=T->date[i].price;
            index=i;
        }
    }
    int i=index;
    printf("%s  %s  %.2f\n",T->date[i].number,T->date[i].name,T->date[i].price);
}

7.根据名字进行图书查找(第一个输入为查找的个数,然后是书名,找到输出,没找到反馈信息,还要输出找到的个数)

void SearchByName(table *T,int n){

    int temp[n];
    int cnt=0;
    for(int i=0;i<n;i++){
        char sttr[MAXSIZE];
        scanf("%s",sttr);
        for(int j=0;j<T->length;++j){
            if(strcmp(sttr,T->date[j].name)==0){
                temp[cnt++]=j;
                break;
            }
            if(j==T->length-1){
                printf("抱歉,没有你的喜爱\n");
            }
        }
    }
    printf("%d\n",cnt);
    for(int k=0;k<cnt;++k){
        printf("%s  %s  %.2f\n",T->date[temp[k]].number,T->date[temp[k]].name,T->date[temp[k]].price);
    }
}

8.添加新图书(输入:位置,图书相关信息)

void InsertNewDate(table *T,int n){
    T->length++;
    information temp;
    scanf("%s %s %f",&temp.number,&temp.name,&temp.price);

    for(int j=T->length-1;j>n-1;j--){
        T->date[j]=T->date[j-1];
    }
    T->date[n-1]=temp;
}

9.图书出库(输入: 位置)

void DeleteInformation(table *T,int n){
    if(n>T->length||n<0){
        printf("输入有误");
        return ;
    }
    else{
    for(int i=n-1;i<T->length;i++){
        T->date[i]=T->date[i+1];
    }
    T->length--;
    }

}

10.最佳位置图书(就是根据索引,找图书,输入: 搜索个数n,位置*n)

void BestPostion(table *T,int n){
    int number=0;
    for(int i=0;i<n;i++){
        scanf("%d",&number);
        number-=1;
        if(number>T->length-1||number<0){
            printf("抱歉,最佳位置上的图书不存在!");
        }
        else{
            printf("%s  %s  %.2f\n",T->date[number].number,T->date[number].name,T->date[number].price);
        }
    }
}

11图书去重(删除书号重复的图书)

void DeleteRepeatInformation(table *T)
{
    int flag;
    for(int i=0;i<T->length;++i){
        for(int j=i+1;j<T->length;j++){

            if(strcmp(T->date[i].name,T->date[j].name)==0){
                //printf("%d\n",j);
                DeleteInformation(T,j+1);
                j=j-1;
            }
        }
    }
}

12.main函数的相关调用

int main()
{
    freopen("2.txt","r",stdin);
    table t=Init();
    table *test=&t;
    CreateTable(test);
    DeleteRepeatInformation(test);
    ShowTable(test);
    //SearchByName(test,2);
    //TheMostExpensive(test);
    return 0;
}

2.链式存储结构

1.相关结构

#include
#include
#define MAXSIZE 20
typedef struct Node
{
    char number[100];
    char name[100];
    float price;
    struct Node *next;
}Node,*LinkList;

2.初始化操作(这里初始化就是生成一个头)

LinkList L=(LinkList)malloc(sizeof(Node));

展示链表:

void ShowLinkList(LinkList L){
    LinkList p=L->next;
    while(p!=NULL){
        printf("%s  %s  %.2f\n",p->number,p->name,p->price);
        p=p->next;
    }
}

3.创建表(n为创建信息的数目)

void CreateLinkList(LinkList L,int n){
    LinkList p=L;
    while(n>0){
        LinkList temp=(LinkList)malloc(sizeof(Node));
        scanf("%s %s %f",&temp->number,&temp->name,&temp->price);
        if(strcmp(temp->name,"0")==0)
        {
            free(temp);
        }else{
            temp->next=NULL;
            p->next=temp;
            p=p->next;
        }
        n--;
    }
}

4.表的排序

void SortLinkList(LinkList L){
    LinkList p2=L;
    int flag=0;
    while(p2->next!=NULL){
    LinkList p=p2;
    float minPrice=10000;
    LinkList point=NULL;
    while(p->next!=NULL){
        if(p->next->price<minPrice){
            minPrice=p->next->price;
            point=p;
        }
        p=p->next;
    }
    LinkList temp=point->next;
    point->next=temp->next;
    temp->next=L->next;
    L->next=temp;
    if(flag==0){
    p2=p2->next;
    flag=1;
    }
    }
}

5.表逆序存储

void ReverseLinkList(LinkList L){

    LinkList p=L->next->next;
    L->next->next=NULL;
    while(p!=NULL){
        LinkList temp=p->next;
        p->next=L->next;
        L->next=p;
        p=temp;
    }
}

6.最贵图书查找

void MostExpensivePrice(LinkList L){
    SortLinkList(L);
    float maxPrice=L->next->price;
    LinkList p=L->next->next;
    int cnt=1;
    while(p->price==maxPrice){
        cnt++;
        p=p->next;
    }
    printf("%d\n",cnt);
    p=L->next;
    while(cnt>0){
        printf("%s  %s  %.2f\n",p->number,p->name,p->price);
        p=p->next;
        cnt--;
    }
}

7.新图书入库(n为位置)

void InsertNewInformation(LinkList L,int n){
    LinkList p=L;
    while(n-->1){
        p=p->next;
    }
    LinkList temp=(LinkList)malloc(sizeof(Node));
    scanf("%s %s %f",&temp->number,&temp->name,&temp->price);
    temp->next=p->next;
    p->next=temp;

}

8.旧图书出库(n为位置)

void DeleteInformation(LinkList L,int n){
    LinkList p=L;
    while(n-->1){
        p=p->next;
    }
    LinkList temp=p->next;
    p->next=temp->next;
    free(temp);
}

因为很多操作比较简单,又和前面顺序存储表类似,就没写,各种操作的要求是一样的。

3. 2.txt文档

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

到这里,就结束了,首先说因为初学,代码写的很不好,但是确实可以实现这些功能,如果觉得代码哪里写的不好的可以在下方评论,我看到了会及时更改的。

你可能感兴趣的:(数据结构,数据结构)