数据结构之顺序线性表
- 一些注意事项
- 代码
- 另外
1. some 注意事项
- 线性表分为顺序和链式两种,根据具体需求来选择。
- 顺序线性表占用一块 连续 的地址存储数据。而链式则不遵循这种在物理上的先后顺序,遵循逻辑先后。
- 需要特别注意下标越界的情况!很容易犯错误!
2. 代码(code)
比较简单,没有什么好说的。
#include<iostream>
#include<windows.h>
#include<memory>
using namespace std;
//---------顺序线性表的表示和实现---------//
#define elemtype int //此处以存储整数举例
#define MAXSIZE 100 //初始量
#define INCREASE 10 //分配增量
#define OK 0
// 定义
typedef struct {
elemtype *base; //基址
int length;
int maxsize;
} SqList;
// 构造线性表
int InitSqList(SqList &L) //L为表头
{
L.base = new elemtype(MAXSIZE);
if (!L.base)
exit(1);
L.length = 0;
L.maxsize = MAXSIZE;
return OK;
}
// 销毁线性表L
int DestroSqList(SqList &L)
{
delete[] L.base;
if (L.base)
exit(1);
return OK;
}
// 在L中第i个位置插入新数据元素e,1 <= i <= L.legnth
// 基本操作为移动元素,时间复杂度O(n)
int ListInsert(SqList &L, int i, elemtype e)
{
if (i < 1 || i > L.length + 1)
exit(1);
if (L.length == L.maxsize)
{
elemtype *tmp = new elemtype(MAXSIZE + INCREASE);
if (!tmp)
exit(1);
memcpy(tmp, L.base, L.length);
L.base = tmp;
}
int *ptr = &(L.base[L.length]), *p = &(L.base[i - 1]);
for (; ptr >= p; --ptr)
*ptr = *(ptr - 1);
*p = e;
++L.length;
return OK;
}
// 在L中删除第i个元素,用e返回其引用
// 基本操作为移动元素,时间复杂度O(n)
int DeleteList(SqList &L, int i, elemtype &e){
if (i < 1 || i > L.length)
exit(1);
e = L.base[i];
for (int var = i; var < L.length; ++var)
L.base[var] = L.base[var + 1];
L.length--;
return OK;
}
// 合并两个非递减顺序表La,Lb到Lc中
// 基本操作为赋值,时间复杂度O(La.length + lb.length),空间复杂度为O(La.length + Lb.length)
int MergeList(SqList La, SqList Lb, SqList &Lc) {
Lc.base = new elemtype(La.length + Lb.length);
Lc.length = La.length + Lb.length;
if (!Lc.base)
exit(1);
elemtype *p1 = La.base, *p2 = Lb.base, *p3 = Lc.base;
while(p1 && p2){
if (*p1 < *p2)
*(p3++) = *(p1++);
else
*(p3++) = *(p2++);
}
while(p1)
*(p3++) = *(p1++);
while(p2)
*(p3++) = *(p2++); //也可把这两个while改成判断,效率等价
return OK;
}
int main()
{
//---------------------
// 调用上述函数等操作
//---------------------
system("pause");
return 0;
}
3. ending
写的时候发现我可能也不会挨着挨着全部写了,有些实在是太过简单。。。有点浪费时间的感觉有木有。所以还是挑选一些有难度一点的或者是不熟悉的来写啦~~不足请指正