学习C/C++ 第二十一天 数据结构——1.顺序表

学习这么多天了,还是有很多的收获,今天学习整个C/C++中最核心的内容:数据结构和算法 中的“数据结构”。
1.顺序表
是简单的一种线性结构,是连续存储方式,逻辑上相邻的数据在计算机内存储位置也是相邻的,可以快速定位几个元素,中间不允许有空值、插入。删除时需要移动大量元素。
a)用 elems 记录存储位置的基地址
b)分配一段连续的储存空间 size
c)用 length 记录实际的元素个数,即顺序表的长度
结构体定义:
#define MAX_SIZE 100
struct SqList
{
ElemType *elems; //顺序表的基地址
int length; //顺序表的长度
int size; //顺序表从的空间大小
}
顺序表的优点:
在小数据中依次排列,存储、插入都有顺序的排列
缺点:
在大量数据排序,这种每次前进、后退大量数据,这样不现实,电脑硬件处理数据的负荷大大增加。
上代码:

#include <iostream>

using namespace std;

#define MAX_SIZE 100

struct _SqList
{
	int *elems;   //顺序表的基地址
	int length;   //顺序表的长度
	int size;     //顺序表总的空间大小
};

//构造一个空的顺序表
bool initList(_SqList &L)
{
	L.elems = new int[MAX_SIZE];  //为顺序表分配 [MAX_SIZE] 个 int 元素空间
	if (!L.elems)return false;    //分配空间失败

	L.length = 0;
	L.size = MAX_SIZE;
	return true;
}

//添加一个元素
bool listInsert(_SqList &L, int i, int e)
{
	if (i < 0 || i >= L.length)
	{
		cout << "输入的值超过了本顺序表的界限!!!";
		return false;
	}

	if (L.length == L.size)
	{
		cout << "存储空间已经装满了!!!";
		return false;
	}

	for (int j = L.length - 1; j >= i; j--)
	{
		L.elems[j + 1] = L.elems[j];   //从最后一个元素开始后移,直到下标为 i 的元素后移
	}
	L.elems[i] = e;   //将新元素 e 放入第 i 的位置
	L.length++;       //表长 加1

	return true;
}

//删除某个元素
bool listDelete(_SqList &L, int i)
{
	if (i < 0 || i >= L.length)
	{
		cout << "删除的元素不在表内!";
		return false;
	}

	if (i == L.length - 1)
	{
		L.length--;
		return true;
	}

	for (int j = i; j < L.length - 1; j++)
	{
		L.elems[j] = L.elems[j + 1];    //删除位置的后续元素依次往前移
	}
	L.length--;
	return true;
}

//销毁 new 出来的内存
void destroyList(_SqList &L)
{
	if (L.elems) delete[]L.elems;  //释放内存
	L.length = 0;
	L.size = 0;
}

//打印 list 的实现
void listPrint(_SqList &L)
{
	cout << "顺序表储存空间size: " << L.size
		<< ",已保存元素个数 length: " << L.length << endl;
	for (int i = 0; i <= L.length - 1; i++)
	{
		cout << L.elems[i] << " ";
	}
	cout << endl;
}

//在后面增加
bool listAppend(_SqList &L, int e)
{
	if (L.length == L.size)
	{
		cout << "存储空间已满..." << endl;
		return false;
	}
	L.elems[L.length] = e;
	L.length++;                      //表长 增加 1
	return true;
}

int main()
{
	_SqList list;
	int i, e;

	//1.初始化
	if (initList(list))
	{
		cout << "创建顺序表成功..." << endl;
	}
	else
	{
		cout << "创建顺序表失败..." << endl;
		return -1;
	}

	listPrint(list);

	//2.添加元素
	int count = 0;
	cout << "请输入要添加的元素个数:";
	cin >> count;

	for (i = 0; i < count; i++)
	{
		cout << "\n请输入要添加的元素e:";
		cin >> e;
		if (listAppend(list, e))
		{
			cout << "添加成功!" << endl;
		}
		else
		{
			cout << "添加失败!" << endl;
		}
	}

	listPrint(list);

	//3.插入元素
	cout << "请输入要插入的位置";
	cin >> i;
	cout << "插入的数据元素:";
	cin >> e;

	if (listInsert(list, i, e))
	{
		cout << "插入成功!" << endl;
	}
	else
	{
		cout << "插入失败!" << endl;
	}
	listPrint(list);

	//4.删除元素
	cout << "请输入要删除元素的位置:";
	cin >> i;
	if (listDelete(list, i))
	{
		cout << "删除成功!";
	}
	else
	{
		cout << "删除失败!";
	}

	listPrint(list);

	//5.销毁
	//到最后把所有的元素都销毁(释放内存)
	destroyList(list);

	system("pause");
	return 0;
}

一个数据结构都能要花一天以上的时间,确实很难啊。
但是这就像建筑中的地基 不打牢固,后面很容易垮掉的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值