//#include <stdio.h> // c 库
#include <stdlib.h> //maclloc 库
#include <iostream> // c++ 库
// 有本句 ,下面cout 前面可以没有 std::
using namespace std;
#define MAXSIZE 10
//typedef struct { // 元素数据 以二项式为例
// int p; //二项式系数
// int e; //幂
//
//}ElemType;
typedef char ElemType; //元素数据 以字符型为例
//采用数组方式
//优点 节点存储密度大,o(1)存取表中任一元素
//缺点 需要连续空间,浪费空间 数据元素不能自由扩充
// 插入删除时需要移动大量元素
//定义顺序表类型
typedef struct {
ElemType* data; //ElemType 数组,使用动态初始化
int length;
}SqList;
//动态初始化顺序表
bool InitList(SqList& L) {
L.data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType)); //动态申请内存,起始地址赋给数组名指针(data)
L.length = 0;
return 1;
}
//销毁顺序表
bool DestroyList(SqList& L) {
if (L.data) {
free(L.data);
return 1;
}
else return 0;
}
//插入元素
//平均复杂度 o(n)
bool InsertList(SqList& L, int i, ElemType e) {
if (i<1 || i>L.length + 1)
return 0;
else if (L.length + 1 == MAXSIZE)
return 0;
else
{
for (int k = L.length - 1; k >= i - 1; k--) { //从尾元素起,赋值给后一个,直到第i个元素
L.data[k + 1] = L.data[k];
}
L.data[i - 1] = e;
L.length++;
}
}
//删除元素
//平均复杂度 o(n)
bool DelElem(SqList& L, int i, char& del)
{
if (i<0 || i>L.length)
return 0;
else
{
del = L.data[i - 1];
for (int k = i - 1; k < L.length; k++)
L.data[k] = L.data[k + 1];
L.length--;
}
}
//逐个按值查找元素
//复杂度计算: 平均需要比较次数 = 1* 1/n + 2* 1/n + + n * 1/n
// 查第i 需要比较次数 * 第i个概率
//平均复杂度 o(n)
int LocateElem(SqList L, ElemType e) {
for (int i = 0; i < L.length; i++)
if (L.data[i] == e) return i + 1; //多个return 第一次return 有效
return 0; //只有循完,没有return 才输出0 。
}
int main()
{
//定义及初始化
SqList L;
InitList(L);
//插入元素
InsertList(L, 1, 'a');
InsertList(L, 2, 'b');
InsertList(L, 3, 'c');
InsertList(L, 4, 'd');
InsertList(L, 5, 'e');
//删除元素
char del;
DelElem(L, 3, del);
//输出
cout << "顺序表共" << L.length << "个元素" << endl;
for (int j1 = 0; j1 < L.length; j1++)
cout << L.data[j1] << " ";
//按值查找
int x;
x = LocateElem(L, 'c');
cout << endl << endl << "要查找的的是第" << x << "个元素" << endl;
//销毁
int d1 = DestroyList(L);
if (d1)
cout << endl << "SqList has been Destroyed! " << endl;