线性表
定义:由n个相同类型的元素组成的有序集合。
特点:1.表中元素的个数是有限的。2.表中元素的数据类型都相同,意味着每一个元素占用相同大小的空间。3.表中元素具有逻辑上的顺序,在序列中各元素排序有其先后顺序。
注意:线性表是一种逻辑结构,表示元素一对一的相邻关系。顺序结构和链表是存储结构。
顺序表: 逻辑上相邻的两个元素在物理位置上也相邻。
优点:1.可以随机存储(根据表头元素地址和元素序号)表中任意一个元素。2.存储密度高,每个结点只存储数据元素。
缺点:1.插入和删除操作需要移动大量元素。2.线性表变化较大时,难以确定存储空间的容量。3.存储分配需要一整段连续的存储空间,不够灵活。
实现:1.定义结构体,包括数组、长度。2.增删改查,在进行操作时,先检查是否合法(标记位置和顺序表是否满了),然后移动元素,最后顺序表长度发生变化。
//顺序表实现
#include<stdio.h>
typedef int ElemType;
typedef struct {
ElemType data[50];
int len;
}SqList;//声明结构体类型
void PrintList(SqList L) {
//打印链表
for (int j = 0; j < L.len; j++) {
printf("%d ", L.data[j]);
}
}
bool ListInsert(SqList& L, int i, ElemType e) {
//1.判断插入位置是否合法,顺序表是否满了
if (i<1 || i>L.len + 1) {
return false;
}
if (L.len >= 50) {
return false;
}
//2.从第i个位置开始向后移动元素
for (int j = L.len; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
//插入元素
L.data[i - 1] = e;
//3.顺序表长度增加
L.len++;
return true;
}
bool ListDelete(SqList& L, int i, ElemType& e) {
//1.判断删除位置是否合法,顺序表是否为空
if (i<1 || i>L.len) {
return false;
}
if (L.len <= 0) {
return false;
}
//2.从第i个位置开始向前移动元素
for (int j = i; j < L.len; j++) {
L.data[j - 1] = L.data[j];
}
//要删除元素
e = L.data[i - 1];
// 3.顺序表长度减少
L.len--;
return true;
}
bool QueryList(SqList& L, ElemType i, ElemType& x) {
//1.判断查顺序表是否为空
if (L.len <= 0) {
return false;
}
//2.开始查询
for (int j = 0; j < L.len; j++) {
if (i == L.data[j]) {
x = j + 1;
}
}
return true;
}
int main() {
SqList L;//创建一个结构体
//在顺序表中添加数据
L.data[0] = 4;
L.data[1] = 5;
L.data[2] = 6;
L.len = 3;
//增
ListInsert(L, 2, 60);
//删
ElemType del;
ListDelete(L, 2, del);
//查
ElemType pos;//查询元素位置
bool ret;
ret = QueryList(L, 5, pos);
if (ret) {
printf("查询成功,位置为 %d\n", pos);
}
else {
printf("查询失败\n");
}
//打印顺序表
PrintList(L);
return 0;
}