#个人学习笔记 仅供参考#
线性逻辑结构
线性表:n个数据元素的有限序列,按照线性结构排列。
操作:增删改查
存储结构实现线性表:
顺序存储结构实现的线性表:
顺序表:以一维数组的形式保存的线性表
操作:增删改查
1.增:在顺序表中添加一个元素
(1)在末尾添加
(2)在末尾元素之前的某个i位置指定添加元素
倒着循环 把i及i位置后面的数据 往后移动一个位置,把i位置空出来
下图为将数据插入到下标1位置处
2.查找:查找到给定数据的下标(位置),如果该数据不存在 返回-1
3.删除:删除给定的数据K
(1)查找K的下标
(2)往前调用覆盖
下图为将数据3删除掉
4.改:把数据k->x
(1)找K的下标i
(2)a->data[i] = x;
顺序表:
优点:随机访问 data[i]
缺点:操作繁琐,插入和删除都需要移动大量的数据,不够灵活
参考代码
#include <stdio.h>
#include <stdlib.h>
//实现一个存放int类型数据的顺序表
typedef struct ArryaList {
int* date;//指针模拟开数组
int length;//理论最大容量
int size;//实际容量
}Array;
//初始化顺序表,将顺序表的 理论最大容量定为k
Array initArray(Array* a, int k) {
a->date = (int*)malloc(sizeof(int) * k);
if (a == NULL) {
printf("空间不足\n");
}
a->length = k;
a->size = 0;
return *a;
}
//在顺序表a中增加一个元素k
void add(Array* a, int k) {
if (a->size < a->length) {
a->date[a->size] = k;
a->size++;
}
else {
printf("空间已满,不能插入\n");
}
}
//在顺序表a的i下标位置,插入一个元素k
void insert(Array* a,int i,int k){
if (a->size < a->length) {
for (int j = a->size-1; j >= i; j--)
{
a->date[j + 1] = a->date[j];
}
a->date[i] = k;
a->size++;
}
else {
printf("空间已满,不能插入\n");
}
}
//在顺序表a中查找元素k
int find(Array a, int k) {
for (int i = 0; i < a.size; i++)
{
if (a.date[i] == k) {
return i;
}
}
return-1;
}
//在顺序表a中删除元素k
void del(Array* a, int k) {
int i = find(*a, k);
if (i != -1) {
for (int j = i; j < a->size; j++)
{
a->date[j] = a->date[j + 1];
}
a->size--;
}
else printf("被删除的数据不存在\n");
}
//输出顺序表a中的元素
void show(Array a)
{
for (int i = 0; i < a.size; i++)
{
printf("%d ", a.date[i]);
}
printf("\n");
}
int main() {
Array a;
int k = 0;
printf("输入理论最大容量");
scanf_s("%d", &k);
initArray(&a, k);
add(&a,0);
add(&a,1);
add(&a,2);
add(&a,3);
add(&a,4);
show(a);
insert(&a, 2, 9);
show(a);
del(&a, 4);
show(a);
return 0;
}