#include <stdio.h>
#include <stdlib.h>
/*Get:
1、线性表的顺序储存结构,在存和读取数据的时候,不论哪个位置,
时间复杂的都为O(1)。
2、在插入和删除数据的时候 为O((n -1) /2) 即O(n);
3、优点:
无须为表中元素的逻辑增加额外的储存空间
可以快速地存取表中任一位置的元素
4、缺点:
插入和删除操作需要移动大量元素
线性表变化较大时,难以确定储存空间的容量
造成储存空间的“碎片”
*/
/*线性表 顺序储存 储存容量固定
//数组 数组长度 线性表的长度(数组里面有效元素的个数)
//插入和删除
//存取时间性能为 O(1) 的结构 -> 随机存取结构
*/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define END 0
#define MAXSIZE 20 //储存空间的初始分量
typedef int Status;
typedef int ElemType; //元素的类型视情况而定 这里假设为int
typedef struct
{
ElemType data[MAXSIZE];
int length;
} SqList;
//初始化线性表
Status initList(SqList *list, ElemType data[], int dataLength);
//查询、获取某个元素 这里Elemtype用指针, 因为返回值要用来返回运行状态
Status GetElem(SqList *list, int index, ElemType *element);
/*插入元素
1、插入点后的元素需要向后面移动一个储存空间
2、插入前判断:插入位置是否合理、线性表是否充满(抛出异常或者动态增加容量)
3、表长+1
*/
Status insert(SqList *list, ElemType element, int location);
/*删除元素
1、位置合理性判断
2、插入点后的元素向前移动一个单位
3、表长减1
*/
Status delete(SqList *list, int location);
int getListLength(int *list);
int main()
{
int i;
//初始化线性表
SqList linearList;
int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
initList(&linearList, data, 10);
//获取、查询指定位置的元素 从1开始
printf("\n获取、查询指定位置的元素\n");
ElemType element;
GetElem(&linearList, 2, &element);
printf("%d\n", element);
//插入元素 根据参数类型来判断插入的位置 //默认在表尾进行元素添加 END
insert(&linearList, 11, 11);
//删除元素
delete(&linearList, 0);
//元素遍历
printf("\n元素遍历,包括了未初始化的部分\n\n");
for (i = 0; i < MAXSIZE; i++)
{
printf("%d ", linearList.data[i]);
}
return 0;
}
Status initList(SqList *list, ElemType data[], int dataLength)
{
int i;
list->length = 0;
for (i = 0; i < dataLength; i++)
{
list->data[i] = data[i];
list->length++;
}
return OK;
}
Status insert(SqList *list, ElemType element, int location)
{
//元素下标从1开始计数 0-> END 代表插入位置为末尾。
Status status;
if (location < 0 || location > list->length + 1 || list->length>= MAXSIZE ) //这里使用0的原因是 因为END = 0
{
status = ERROR;
printf("元素位置超出范围,插入失败");
}
else
{
if (location == END || location == list->length + 1)
{
list -> data[list->length] = element;
}
else
{
//在这里需要实现将插入点后的元素都要向后移动一个单位
int i = 0;
for (; i < list->length - location; i++)
{
list->data[list ->length - i] = list->data[list ->length - i - 1];
}
list -> data[location - 1] = element;
}
list -> length++;
status = OK;
}
return status;
}
Status delete(SqList *list, int location)
{
Status status;
if (location < 0 || location > list->length + 1 || list->length>= MAXSIZE ) //这里使用0的原因是 因为END = 0
{
status = ERROR;
printf("元素位置超出范围,删除失败");
}
else
{
if (location == END || location == list->length + 1)
{
//因为是顺序储存结构 内存是无法释放的 所以只能采取赋默认值的方式
//这里最重要的是 需要把线性表的长度-1
list -> data[list->length] = 666;
}
else
{
//删除点后的元素都要向前移动一个单位
int i = 0;
for (; i < list->length - location; i++)
{
list->data[location + i - 1] = list->data[location + i];
}
}
list -> length--;
status = OK;
}
return status;
}
Status GetElem(SqList *list, int index, ElemType *element)
{
Status status = OK;
if (index < 1 || index > list -> length)
{
status = ERROR;
printf("测试1\n");
}
else
{
*element = list -> data[index - 1];
}
return status;
}