顺序表,全名顺序存储结构,是线性表的一种。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
顺序表的创建及增删改查等基本操作
#include "stdafx.h"
#define SIZE 5
// 顺序表
typedef struct Table {
int * head; //声明了一个名为head的长度不确定的数组,也叫“动态数组”
int length; //记录当前顺序表的长度
int size; //记录顺序表分配的存储容量
}table;
// 初始化顺序表
table initTable() {
table t;
t.head = (int*)malloc(SIZE * sizeof(int));
if (!t.head) {
printf("failed to initialize\n");
exit(0);
}
t.length = 0;
t.size = SIZE;
return t;
}
// 输出顺序表中的元素
void displayTable(table t) {
for (int i = 0; i < t.length; i++) {
printf("%d, ", t.head[i]);
}
printf("\n");
}
//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
table insert(table t, int elem, int position) {
if (position > t.length + 1 || position < 1) {
printf("invalid position\n");
return t;
}
if (t.length == t.size) {
t.head = (int *)realloc(t.head, (t.size + 1) * sizeof(int));
if (!t.head) {
printf("failed to allocate\n");
return t;
}
t.size += 1;
}
//插入操作,需要将从插入位置开始的后续元素,逐个后移
for (int i = t.length - 1; i >= position - 1; i--) {
t.head[i + 1] = t.head[i];
}
t.length += 1;
t.head[position - 1] = elem;
return t;
}
table delTable(table t, int position) {
if (position > t.length || position < 1) {
printf("invalid position\n");
return t;
}
for (int i = position - 1; i < t.length - 1; i++) {
t.head[i] = t.head[i + 1];
}
t.length -= 1;
return t;
}
//查找函数,其中,elem表示要查找的数据元素的值
int select(table t, int elem) {
for (int i = 0; i < t.length; i++) {
if (t.head[i] == elem) {
return i+1;
}
}
return -1;
}
//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
table update(table t, int elem, int newElem) {
int position = select(t, elem);
t.head[position - 1] = newElem;
return t;
}
int main()
{
table t = initTable();
for (int i = 0; i < t.size; i++) {
t.head[i] = i + 1;
t.length++;
}
printf("顺序表中的元素:\n");
displayTable(t);
t = insert(t, 3, 3);
printf("\n在3位置插入元素3后:\n");
displayTable(t);
t = delTable(t, 3);
printf("\n删除3位置元素后:\n");
displayTable(t);
printf("\n查找元素3在位置:%d\n", select(t, 3));
t = update(t, 3, 10);
printf("\n将元素3修改为10:\n");
displayTable(t);
return 0;
}