顺序表

让人想犯罪 __ 提交于 2019-12-05 03:07:31

   

顺序表可以随机存取表中的任意元素,其存储位置可以用一个简单,直观的公式来表现。这样就有一些缺点。在插入数据和删除数据的时候,要移动大量的元素。同时数组因为有固定的长度,这造成了存储空间的浪费。

//图书管理系统(顺序表版)
#include<iostream>
using namespace std;
#define MAXSIZE 10

typedef struct   //图书基本信息
{
    char no[20];    //图书IBSN
    char bookName[50];   //图书名字
    float price;    //图书价格    
}Book;

typedef struct
{
    Book elem[MAXSIZE];   //存储空间的基本地址
    int length;   //图书数量(顺序表的长度)
}SqList;

//初始化(构建一个空的顺序表)
void  InitList(SqList &L)
{
    
    if (!L.elem)
    {
        printf("存储分配失败!\n");
            return;  //退出该函数
    }

    L.length = 0;
    printf("分配空间成功!\n");
        
}

void PrintList(SqList &L) //打印所有图书信息
{
    if (L.length<1)
    {
        cout << "空表";
    }
    for (int i = 0; i < L.length; i++)
    {
        cout << L.elem[i].no << ":" << L.elem[i].bookName << "\t" << L.elem[i].price << endl;
        //printf("%d:%s/t%s\t%.2f/n", L.elem->no, L.elem->bookName, L.elem->price);
    }
    //cout << L.length<<endl;   //输出表长
}

//在表的i位置插入e元素
void ListInsert(SqList &L, int i, Book e)
{
    if ((i < 1) || (i > L.length + 1))
    {
        cout << "值不合法!";
        return;
    }
    if (L.length == MAXSIZE)
    {
        cout << "储存空间已满";
        return;
    }
    for (int j = L.length; j > i - 1; j--)//j>i-1是因为他是第几位在数组中对应-1
    {
        L.elem[j + 1] = L.elem[j];//整个数组从i-1开始全往后移动一位,给新进来的元素腾位置
    }
    L.elem[i - 1] = e;
    ++L.length;
    //cout << "插入成功";
        

}

//删除表中i位置的元素
void ListDelete(SqList &L, int i)
{
    if ((i < 1) || (i > L.length))
    {
        cout<<"i位置不合法";
        return;

    }
    for (int j = i; j < L.length - 1; j++)
    {
        L.elem[j - 1] = L.elem[j];//此时不用留位置了,直接覆盖就行了
    }
    --L.length;
}
int main()

{
    SqList *L;
    L = (SqList*)malloc(sizeof(SqList));
    InitList(*L);
    Book YTbook[5] = {
                        {"w001","高等数学",18.80},
                        {"w543","离散数学",27.80},
                        {"w721","概率论",39.40},
                        {"w422","线性代数",23.20},
                        {"w447","考研数学",45.50}
                    };

    for (int i = 1; i <= 5; i++)
    {
        ListInsert(*L, i, YTbook[ i-1]);
    }

    PrintList(*L);

    ListDelete(*L,1);
    PrintList(*L);
    return 0;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!