学习这么多天了,还是有很多的收获,今天学习整个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;
}
一个数据结构都能要花一天以上的时间,确实很难啊。
但是这就像建筑中的地基 不打牢固,后面很容易垮掉的。