线性表的顺序存储结构

来源:互联网 发布:华为校招 知乎 编辑:程序博客网 时间:2024/06/16 18:46

一、线性表的定义

线性表是一种线性结构,它包含n≥0个元素,除第一元素个外集合中每一个元素都有一个前驱,除最后一个元素外集合中每一个元素都有一个后继。

二、线性表的特性

(1)线性表中每一个元素都有其确定的位置;

(2)线性表中每一个元素都具有相同特性;

(3)相邻元素之间存在序偶关系。

三、顺序存储

用一组地址连续的存储单元存储线性表的每一个元素

优缺点:

(1)优点:可随机访问元素,时间复杂度为O(1);

(2)缺点:插入删除需要移动大量元素。

 头文件SqList.h

#pragma once#define ElemType int#define INIT_SIZE 20  //线性表的初始容量#define INCREMENT 10  //线性表的增量/*线性表的顺序存储结构*/typedef struct{ElemType *ar;  //线性表的基地址int len;       //线性表的当前长度int size;      //线性表当前存储容量}SqList;/*线性表的操作*/bool initSize(SqList &L, int length);//初始化线性表bool insertList(SqList &L, ElemType val, int pos);//插入元素bool deleteList(SqList &L, int pos);//删除元素int searchElem(SqList &L, ElemType val);//查找元素bool getElem(SqList &L, int pos, ElemType &x);//获取指定位置元素bool isFull(SqList &L);//判断线性表是否已满bool isEmpty(SqList &L);//判断线性表是否已空int GetLength(SqList &L);//获取线性表的长度bool displayList(SqList &L);//输出线性表的元素void ClearList(SqList &L);//清除线性表void Destroy(SqList &L);//摧毁线性表
源文件SqList.cpp

#include <iostream>#include "SqList.h"using namespace std;bool initSize(SqList &L, int length)//初始化线性表{L.ar = (ElemType*)malloc(length * sizeof(ElemType));if (NULL == L.ar) return false;//分配存储空间失败L.len = 0; //空表长度为0L.size = length;//存储容量为指定长度lengthreturn true;}bool insertList(SqList &L, ElemType val, int pos)//插入元素{if (pos < 0 || pos > L.len) return false;//参数判断if (isFull(L)){ElemType *p = (ElemType*)realloc(L.ar, (L.size + INCREMENT) * sizeof(ElemType));if (NULL == p) return false; //分配存储空间失败L.ar = p; //线性表指向新的基址L.size += INCREMENT; //更新存储容量}for (int i = L.len; i > pos; ++i)//从pos位开始向后移动元素{L.ar[i] = L.ar[i - 1];}L.ar[pos] = val;//在pos位插入元素L.len++;//更新当前长度return true;}bool deleteList(SqList &L,int pos)//删除元素{if (isEmpty(L) || pos < 0 || pos > L.len) return false;//参数判断for (int i = pos; i < L.len - 1; ++i)//将pos之后的元素向前移动{L.ar[i] = L.ar[i + 1];}L.len--;//更新当前长度return true;}int searchElem(SqList &L, ElemType val)//查找元素{for (int i = 0; i < L.len; ++i){if (L.ar[i] == val){return i;}}return -1;}bool getElem(SqList &L, int pos, ElemType &x)//获取指定位置元素{if (pos < 0 || pos > L.len) return false;//参数判断x = L.ar[pos];return true;}bool isFull(SqList &L)//判断线性表是否已满{return L.len == L.size;}bool isEmpty(SqList &L)//判断线性表是否已空{return L.len == 0;}int GetLength(SqList &L)//获取线性表的长度{return L.len;}bool displayList(SqList &L)//输出线性表的元素{if (isEmpty(L)) return false;for(int i = 0;i < L.len;++i){cout << L.ar[i] << " ";}cout << endl;return true;}void ClearList(SqList &L)//清除线性表{L.len = 0;}void Destroy(SqList &L)//摧毁线性表{ClearList(L);}
main.cpp

#include <iostream>#include "SqList.h"using namespace std;int main(){SqList List;ElemType e;initSize(List, INIT_SIZE);for (int i = 0; i < 10; ++i){insertList(List, i, i);}displayList(List);deleteList(List, 5);displayList(List);if (searchElem(List, 6))cout << "elem 6 is found" << endl;getElem(List, 3, e);cout << "pos 3 is " << e << endl;cout << "List length is " << GetLength(List) << endl;Destroy(List);return 0;}

运行结果:


0 0
原创粉丝点击