王道——线性表

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值