顺序表的基本操作 c语言版
1.初始化顺序表
2.扩展顺序表的存储空间
3.打印顺序表中的数据
4.向顺序表中插入数据
5.删除顺序表中的元素,并将删除的数据存储在变量e中
#include <stdlib.h>
#include <stdio.h>
#define InitSize 10//默认最大长度
typedef struct {
int *data;//指示动态分配数组的指针
int MaxSize;//顺序表的最大容量
int length;//顺序表的当前长度
} SeqList;
//初始化顺序表
void InitList(SeqList *L) {
//用malloc函数申请长度为 InitSize 的连续的存储空间
L->data = (int *) malloc(InitSize * sizeof(int));
L->length = -1;//初始化长度为0
L->MaxSize = InitSize;//初始化最大存储空间的标志为InitSize
int i = 0;
for (i = 0; i < L->MaxSize; i++) {
L->data[i] = i;
}
}
//扩展顺序表的存储空间
void IncreaseSize(SeqList *L, int len) {
int *p = L->data;
//用malloc函数申请一片长度为 (InitSize + len) 的连续的存储空间
L->data = (int *) malloc((L->MaxSize + len) * sizeof(int));
int i = 0;
for (i = 0; i < L->length; i++) {
//将原来顺序表中的数据 移动到新的更大的连续的存储空间中
L->data[i] = p[i];
}
L->MaxSize = L->MaxSize + len;//增加顺序表的最大存储空间的标志
free(p);//释放原来空间中的指针数据
}
//打印顺序表中的数据
void PrintfList(SeqList *L) {
int i = 0;
int real_length = -1;
for (i = 0; i < L->length; i++) {//打印顺序表中的数据
printf("<length : %d> %d -> %d\n", L->length, i, L->data[i]);
}
printf("\n");
}
//向顺序表中插入数据
void ListInsert(SeqList *L, int i, int e) {
//如果原来的顺序表已经填满,插入失败
if (L->length == L->MaxSize) {
printf("\n原来的顺序表已经填满,插入失败\n");
return;
}
//如果插入的序号大于顺序表的长度,插入失败
if (i > L->length) {
printf("\n插入的序号大于顺序表的长度,插入失败\n");
return;
}
int k = 0;
//程序里面第一个元素下标为0
//因此程序里面的序列是 位序 - 1
int real_i = i - 1;
int real_length = L->length - 1;
for (k = real_length + 1; k > real_i; k--) {
//从后往前,将数据向后移动一个单位
L->data[k] = L->data[k - 1];
}
L->data[real_i] = e;
L->length++;//顺序表的长度+1
}
//删除顺序表中的元素,并将删除的数据存储在变量e中
void ListDelete(SeqList *L, int i, int *e) {
//如果删除的序号大于此时顺序表的长度,删除失败
if (i > L->length) {
printf("\n删除的序号大于此时顺序表的长度,删除失败\n");
return;
}
int k = 0;
//程序里面第一个元素下标为0
//因此程序里面的序列是 位序 - 1
int real_i = i - 1;
int real_length = L->length - 1;
*e = L->data[real_i];
for (k = real_i; k < real_length; k++) {
//从后往前,将数据向后移动一个单位
L->data[k] = L->data[k + 1];
}
L->length--;//顺序表的长度+1
}
int main() {
SeqList L;//创建对象
InitList(&L);//初始化顺序表
int i = 0;
for (i = 0; i < L.MaxSize; i++) {//向顺序表中添加数据
L.data[i] = i;
L.length += 1;
}
PrintfList(&L);//打印顺序表中的数据
IncreaseSize(&L, 5);//扩展顺序表的存储空间,扩大5个存储空间
for (i = InitSize - 1; i < L.MaxSize; i++) {//向顺序表中继续添加数据
L.data[i] = i;
L.length += 1;
}
PrintfList(&L);//打印顺序表中的数据
ListInsert(&L, 3, 333);//向顺序表中插入数据
PrintfList(&L);//打印顺序表中的数据
int e = -1;
ListDelete(&L, 3, &e);//删除顺序表中的元素,并将删除的数据存储在变量e中
printf("\n%d\n", e);//打印e的值
PrintfList(&L);//打印顺序表中的数据
return 0;
}