顺序存储结构实现的线性表

#个人学习笔记 仅供参考#

线性逻辑结构
线性表: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值