顺序表Sqlist.cpp
1 顺序表插入逻辑
在表的第 i 个位置前插入一个元素
-
实现步骤:
- 将第 n 至第 i 位的元素向后移动一个位置;
- 将要插入的元素写到第 i 个位置;
- 表长加1。
注意:事先应判断: 插入位置i 是否合法?表是否已满?
应当符合条件:
1≤i≤n+1 或 i=[1, n+1]
插入时的平均移动次数为:n (n+1) / 2 ÷(n+1)=n/2≈O(n)
2 顺序表删除逻辑
删除线性表的第i个位置上的元素
- 实现步骤:
- 将第 i+1 至第 n 位的元素向前移动一个位置;
- 表长减1。
注意:事先需要判断,删除位置i 是否合法?
顺序表删除一元素的时间效率为: T(n) = (n-1) / 2 ≈ O(n)
顺序表插入、删除算法的平均空间复杂度为 O(1)
3 代码演示
以下代码创建了一个顺序表,以随机数的方式给顺序表赋初值,实现了基本的插入,删除,遍历
#include <stdlib.h>
#include <time.h>
#define MAXSIZE (10)
#define OK (1)
#define ERROR (0)
typedef int ElementType;
typedef struct ArrayList {
ElementType data[MAXSIZE];
int length;
} *List;
List CreateList(void) //创建顺序表,初始化
{
List L = (List)malloc(sizeof(struct ArrayList));
L->length = 0;
return L;
}
void InitList(List L) //给顺序表赋初值
{
srand((unsigned)(time(NULL)));
for (int i = 0; i < MAXSIZE / 2; i++) {
L->data[i] = rand()%71+20;
L->length++;
}
}
int Insert(List L, int position, ElementType e)
{
if (position < 1 || position > L->length + 1) {
return ERROR;
}
if (L->length == MAXSIZE) {
return ERROR;
}
for (int i = L->length - 1; i >= position - 1; i--) {
L->data[i + 1] = L->data[i];
}
L->data[position - 1] = e;
L->length++;
return OK;
}
int Delete(List L, int position, ElementType *e)
{
if (position < 1 || position > L->length) {
return ERROR;
}
*e = L->data[position - 1];
for (int i = position - 1; i <= L->length - 1; i++) {
L->data[i] = L->data[i + 1];
}
L->length--;
return OK;
}
void PrtList(List L)
{
for (int i = 0; i <= L->length - 1; i++) {
printf("%d ", L->data[i]);
}
printf("\n");
}
int main(void)
{
int position;
int e;
List L = CreateList();
InitList(L);
PrtList(L);
printf("\nplease input (position & element) to insert:");
scanf("%d %d", &position, &e);
if (Insert(L, position, e)) {
printf("OK\n");
PrtList(L);
} else {
printf("ERROR\n");
}
printf("please input (position) to delete:");
scanf("%d", &position);
if (Delete(L, position, &e)) {
printf("OK\n");
PrtList(L);
} else {
printf("ERROR\n");
}
}