顺序表可以随机存取表中的任意元素,其存储位置可以用一个简单,直观的公式来表现。这样就有一些缺点。在插入数据和删除数据的时候,要移动大量的元素。同时数组因为有固定的长度,这造成了存储空间的浪费。
//图书管理系统(顺序表版)
#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;
}