顺序表Sqlist.cpp
文章目录
- 顺序表Sqlist.cpp
- 1 顺序表插入逻辑
- 2 顺序表删除逻辑
- 3 代码演示
- 4 运行结果
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");}
}