实验实习目的及要求:
实验目的:了解和掌握线性表的顺序存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:取值、插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。
线性表的实现以简单的图书数据的顺序存储为例
1.头文件内容
#include <iostream>
#include <cstring> // For strcpy and strcmp
#define MAXSIZE 100 // 图书表可能达到最大长度
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
using namespace std;
2.定义顺序表的存储结构(以图书数据为例)
定义两个字符型数组和一个浮点型表达图书结构
typedef struct { // 图书信息定义
char no[20]; // 图书ISBN
char name[50]; // 图书名字
float price; // 图书价格
} Book;
typedef struct {
Book *elem; // 存储空间的基地址
int length; // 图书表中当前图书个数
} SqList; // 图书表的顺序存储结构类型为SqList
2.初始化——构造一个空顺序表
// 初始化线性表
Status IniList(SqList &L) {
L.elem = new Book[MAXSIZE]; // 顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem) exit(OVERFLOW); // 存储失败退出
L.length = 0; // 空表长度为0
return OK;
}
3. 取值
取值操作是根据制定位置序号i,获取存取表中的第i个元素
// 顺序表的取值
int GetElem(SqList L, int i, Book &e) {
if (i < 1 || i > L.length) return ERROR;
// 判断是否越界,如果越界返回ERROR
e = L.elem[i - 1];
return OK;
}
4.查找
根据提供的元素e,查找顺序表中第一个值与e相等的值。如果找到返回该元素在表中的位置序号,否则返回0
// 顺序表的查找
int LocateElem(SqList L, Book e) {
for (int i = 0; i < L.length; i++) {
if (strcmp(L.elem[i].no, e.no) == 0 &&
strcmp(L.elem[i].name, e.name) == 0 &&
L.elem[i].price == e.price) {
return i + 1; // 查找成功,返回序号 i + 1
}
}
return 0; // 查找失败返回0
}
5.插入
在第i的位置插入e元素
// 线性表的插入
Status ListInsert(SqList &L, int i, Book e) {
// 在顺序表第 i 个位置插入一个新元素 e,i 的合法值的范围是 1 <= i <= L.length + 1
if (i < 1 || i > L.length + 1) return ERROR;
if (L.length == MAXSIZE) return ERROR; // 存储位置已经满了
for (int j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++L.length; // 表长加1
return OK;
}
6.求顺序表的长度和清空线性表
// 清空线性表
void ClearList(SqList &L) {
L.length = 0; // 将线性表的长度置为0
}
// 求线性表的长度
int GetLength(SqList L) {
return L.length;
}
7.删除线性表
// 删除线性表
void DestroyList(SqList &L) {
if (L.elem) delete[] L.elem; // 释放空间
L.length = 0;
}
以上是简单的图书数据的顺序存储的定义过程。
以下是完整的代码和简单的调用部分函数的调用
#include <iostream>
#include <cstring> // For strcpy and strcmp
#define MAXSIZE 100 // 图书表可能达到最大长度
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
using namespace std;
typedef struct { // 图书信息定义
char no[20]; // 图书ISBN
char name[50]; // 图书名字
float price; // 图书价格
} Book;
typedef struct {
Book *elem; // 存储空间的基地址
int length; // 图书表中当前图书个数
} SqList; // 图书表的顺序存储结构类型为SqList
// 初始化线性表
Status IniList(SqList &L) {
L.elem = new Book[MAXSIZE]; // 顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem) exit(OVERFLOW); // 存储失败退出
L.length = 0; // 空表长度为0
return OK;
}
// 删除线性表
void DestroyList(SqList &L) {
if (L.elem) delete[] L.elem; // 释放空间
L.length = 0;
}
// 清空线性表
void ClearList(SqList &L) {
L.length = 0; // 将线性表的长度置为0
}
// 求线性表的长度
int GetLength(SqList L) {
return L.length;
}
// 判断线性表L是否为空
int isEmpty(SqList L) {
return L.length == 0;
}
// 顺序表的取值
int GetElem(SqList L, int i, Book &e) {
if (i < 1 || i > L.length) return ERROR;
// 判断是否越界,如果越界返回ERROR
e = L.elem[i - 1];
return OK;
}
// 顺序表的查找
int LocateElem(SqList L, Book e) {
for (int i = 0; i < L.length; i++) {
if (strcmp(L.elem[i].no, e.no) == 0 &&
strcmp(L.elem[i].name, e.name) == 0 &&
L.elem[i].price == e.price) {
return i + 1; // 查找成功,返回序号 i + 1
}
}
return 0; // 查找失败返回0
}
// 线性表的插入
Status ListInsert(SqList &L, int i, Book e) {
// 在顺序表第 i 个位置插入一个新元素 e,i 的合法值的范围是 1 <= i <= L.length + 1
if (i < 1 || i > L.length + 1) return ERROR;
if (L.length == MAXSIZE) return ERROR; // 存储位置已经满了
for (int j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++L.length; // 表长加1
return OK;
}
// 线性表的删除
Status ListDelete(SqList &L, int i) {
// 顺序表 L 中删除第 i 个元素,i 值的合法范围是 1 <= i <= L.length
if (i < 1 || i > L.length) return ERROR;
for (int j = i - 1; j < L.length - 1; j++) {
L.elem[j] = L.elem[j + 1];
}
--L.length;
return OK;
}
int main() {
// 测试代码可以在这里编写
SqList L;
IniList(L);
// 插入一些图书数据
Book b1 = {"978-3-16-148410-0", "Book One", 29.99};
Book b2 = {"978-1-23-456789-7", "Book Two", 19.99};
ListInsert(L, 1, b1);
ListInsert(L, 2, b2);
// 打印图书信息
for (int i = 1; i <= GetLength(L); i++) {
Book b;
GetElem(L, i, b);
cout << "Book " << i << ": " << b.no << ", " << b.name << ", $" << b.price << endl;
}
// 删除第一个图书
ListDelete(L, 1);
// 打印剩余图书信息
for (int i = 1; i <= GetLength(L); i++) {
Book b;
GetElem(L, i, b);
cout << "Book " << i << ": " << b.no << ", " << b.name << ", $" << b.price << endl;
}
ClearList(L);
DestroyList(L);
return 0;
}