#include<iostream>
using namespace std;
#define initnum 10
typedef struct {
int* data;
int maxlen, len;
}seqlist;
//seqlist动态分配线性表,sqlist静态分配线性表
//初始化线性表
void initlist(seqlist& l) {
l.data = new int[initnum];//分配内存空间,将首地址返回到l.data指针
l.len = 0;
l.maxlen = initnum;
for (int i = 0; i < l.maxlen; i++) {
l.data[i] = 0;
}
cout << "初始化线性表" << endl;
}
//增加长度
void addlist(seqlist& l) {
int* p = l.data;//将*p指向原来的的内存地址
l.data = new int[l.maxlen + initnum];//重新分配内存
l.maxlen = l.maxlen + initnum;
l.len = l.len;
for (int i = 0; i < l.maxlen; i++) {
l.data[i] = *p;
}
delete[] p;
cout << "增加线性表长度" << endl;
}
//插入元素,时间复杂度O(n)
bool listinsert(seqlist& l, int i, int e) {
//小于1,大于当前长度+1,错误
if (i<1 || i>l.len+1) {
cout << "插入位置错误" << endl;
return false;
}
if (l.len >= l.maxlen) {
cout << "当前线性表已满" << endl;
return false;
}
for (int j = l.len; j >= i; j--) {
l.data[j] = l.data[j - 1];
}
//插入到第i个位置,下标为i-1
//移动第一个元素到下标为len
//最后一个下标到i,所以 j>=i
l.data[i - 1] = e;
l.len++;
cout << "插入成功" << endl;
return true;
}
//删除元素,复杂度为O(n)
bool listdelete(seqlist& l, int i, int& e) {
if (i<1 || i>l.len) {
cout << "删除位置错误" << endl;
return false;
}
e = l.data[i - 1];//删除元素取出来
for (int j = i-1; j <=l.len; j++) {
l.data[j] = l.data[j + 1];
}
//删除第i个元素,下标为i-1
//第一个元素移动到下标为i-1
//最后一个元素移动到len-1(len-1的需要补元素)
l.len--;
cout << "删除成功" << endl;
return true;
}
//按位查找
int getlist(seqlist l, int i) {
if (i<1 || i>l.len) {
cout << "查找位置错误" << endl;
return 0;
}
return l.data[i - 1];
}
//按值查找,时间复杂度O(n)
int locatelist(seqlist l, int e) {
for (int i = 0; i < l.len; i++) {
if (l.data[i] == e) {
cout << "按值查找成功" << endl;
return i + 1;
}
}
return 0;
}
//判断空
int empty(seqlist l) {
if (l.len == 0) {
cout << "空表" << endl;
return 1;
}
cout << "非空表" << endl;
return 0;
}
//输出
void printlist(seqlist l) {
for (int i = 0; i < l.len; i++)
cout << l.data[i] << " ";
}
//销毁
void destorylist(seqlist& l) {
delete[] l.data;
l.data = NULL;
l.len = 0;
l.maxlen = 0;
}
int main() {
seqlist a;
initlist(a);
//a.len=0,a.maxlen=10
addlist(a);
//a.len=0,a.maxlen=20
listinsert(a, 1, 10);
//a.data[0]=10,a.len=1,a.maxlen=20
listinsert(a, 1, 20);
//a.data[0]=20,a.data[1]=10,a.len=2,a.maxlen=20
int e;
listdelete(a, 1, e);
//a.data[0]=10,a.len=1,a.maxlen=20
cout << "e="<<e << endl << endl;
cout << getlist(a, 2) << endl;
//不存在
cout << locatelist(a, 10) << endl;
return 0;
}
王道——线性表
于 2022-03-13 14:55:28 首次发布