数据结构之顺序表
线性表
1.定义
具有相同特性的数据元素的一个而有限集合
2.表示
(a1,a2,a3,...,an)
(
a
1
,
a
2
,
a
3
,
.
.
.
,
a
n
)
3.特性
- 有穷性:一个线性表中的元素个数是有限的。
- 一致性:一个线性表中的所有元素的性质相同。具有相同的数据类型。
- 序列性:一个线性表中所有元素之间的相对位置是线性的,即存在唯一的开始元素和终端元素,除此之外,每个元素只有唯一的前驱元素和后继元素。
顺序表
1.定义
线性表的顺序存储结构称为顺序表。即把线性表中的所有元素按照其逻辑顺序依次存储到计算机存储器中指定位置开始的一块连续的存储空间中。
2.表示
3.顺序表的实现
- sqlist.h
const int MAXSIZE = 50;
typedef char ElementType;
typedef struct sqlist{
ElementType data[MAXSIZE];
int length;
}*SqlList; //直接将结构体的指针重命名
void creatList(SqlList &L, ElementType a[], int n); //创建顺序表
void initList(SqlList &L); // 初始化顺序表
void destoryList(SqlList &L); // 销毁顺序表
bool isEmpty(SqlList L); // 判断是否为空
int listLength(SqlList L); // 返回顺序表长度
void display(SqlList L); // 输出
bool getItem(SqlList L, int i, ElementType &e); // 获得节点信息
int getLocate(SqlList L, ElementType e); // 获得节点位置
bool insertItem(SqlList L, ElementType e, int i); // 插入节点
bool deleteItem(SqlList L, int i, ElementType &e); // 删除节点
- sqlist.cpp
#include "sqlist.h"
#include <iostream>
using namespace std;
void creatList(SqlList &L, ElementType a[], int n) {
// 创建顺序表
int i = 0;
int k = 0;
L = (SqlList) malloc(sizeof(SqlList));
while (i < n){
L->data[i] = a[i];
k ++;
i ++;
}
L->length = k;
}
void initList(SqlList &L) {
// 初始化顺序表
L = (SqlList) malloc(sizeof(SqlList));
L->length = 0;
}
void destoryList(SqlList &L) {
// 销毁顺序表
free(L);
}
bool isEmpty(SqlList L) {
// 判断是否为空
if (0 == L->length) {
return true;
}
return false;
}
int listLength(SqlList L) {
// 返回顺序表长度
return L->length;
}
void display(SqlList L) {
// 输出
for (int i = 0; i < L->length; i++) {
cout<<L->data[i]<<" ";
}
cout<<endl;
}
bool getItem(SqlList L, int i, ElementType &e) {
// 获得节点信息
if (i < 1 || i > L->length) {
return false;
}
e = L->data[i-1];
return true;
}
int getLocate(SqlList L, ElementType e) {
// 获得节点位置
int i = 0;
while (i < L->length && L->data[i] != e) {
i ++;
}
if (i >= L->length) {
return 0;
} else {
return i+1;
}
}
bool insertItem(SqlList L, ElementType e, int i) {
// 插入节点
int j;
if (i < 1 || i > L->length) {
return false;
}
i--;
for (j = L->length; j > i; j--) {
L->data[j] = L->data[j-1];
}
L->data[i] = e;
L->length ++;
return true;
}
bool deleteItem(SqlList L, int i, ElementType &e) {
// 删除节点
int j;
if (i < 1 && i > L->length) {
return false;
}
i --;
e = L->data[i];
for (j = i; j < L->length-1; j++) {
L->data[j] = L->data[j+1];
}
L->length --;
return true;
}
- main.cpp
#include <iostream>
//#include "linklist/linklist.h"
#include "sqlist/sqlist.h"
using namespace std;
int main() {
SqlList list;
ElementType chArr[] = {'a', 'b', 'c', 'd', 'e'};
// 1.2. 创建顺序表
initList(list);
creatList(list, chArr, 5);
// 3输出顺序表
display(list);
//4输出顺序表的长度
cout<<list->length<<endl;
// 5判断顺序表是否为空
cout<<isEmpty(list)<<endl;
// 6输出顺序表的第3个元素
char temp;
getItem(list, 3, temp);
cout<<temp<<endl;
// 7输出元素a的位置
cout<<getLocate(list, 'a')<<endl;
// 8在第四个元素位置上插入f元素 9输出
insertItem(list, 'f', 4);
display(list);
// 10删除第三个元素 输出 销毁顺序表
deleteItem(list, 3, temp);
display(list);
destoryList(list);
}