线性结构-顺序存储结构

先上代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
#define OK 1
#define ERROR -1
#define TRUE 1

typedef int ElementType;

//基本结构
typedef struct LNode *List;
struct LNode {
	ElementType Data[MAXSIZE];//最大数组长度
	int Last;
};

//线表初始化
List MakeEmpty()
{
	List PtrL;
	PtrL = (List)malloc(sizeof(struct LNode));
	PtrL->Last = -1;
	return PtrL;
}

//按元素查找位置
int Potion_Find(List PtrL,ElementType X)
{
	int i =0;
	if(PtrL->Last==-1)
		return ERROR;
	while(i<=PtrL->Last && PtrL->Data[i] != X)
		i++;
	if(i > PtrL->Last) return ERROR;//找不到返回-1
	else return i+1;//返回下标
}

//按位置查找元素
int FindKth(List PtrL,int X)
{
	if(PtrL->Last==-1)
		return ERROR;
	if(X < 1 || X > PtrL->Last +1)
		return ERROR;
	return PtrL->Data[X-1];
}

//插入
ElementType Insert(List PtrL,ElementType X,int i)
{
	int j;
	if(PtrL->Last==-1)
		return ERROR;
	if(PtrL->Last == MAXSIZE-1) {
		printf("表满");
		return ERROR;
	}

	if(i < 1 || i >PtrL->Last+2) {//插入范围1到n+1,下标就是0到last+2
		printf("位置不合法");
		return ERROR;
	}
	if(i>=1 && i<= PtrL->Last+1)//插入的不是最后的
		for(j = PtrL->Last; j >= i-1; j--)
			PtrL->Data[j+1]=PtrL->Data[j];
	PtrL->Data[i-1] = X;
	PtrL->Last++;
	return OK;
}

//删除
ElementType Delete(List PtrL,int i)
{
	int j = 0;
	if(PtrL->Last==-1)
		return ERROR;
	if(i < 1 || i > PtrL->Last+1)
		return ERROR;
	if(i>=1 &&i<PtrL->Last+1) 
		for(j = i-1;j<=PtrL->Last;j++)
			PtrL->Data[j] = PtrL->Data[j+1];
	PtrL->Last--;
	return OK;
}

//返回元素个数
int get_Length(List PtrL)
{
	return PtrL->Last+1;
}

//打印顺序表
void DispList(List PtrL)
{
	int i =0;
	if(PtrL->Last == -1)
		printf("\n没有元素可以打印!");
	else{
		printf("打印所有元素:");
		for(;i<=PtrL->Last;i++)
			printf("%d ",PtrL->Data[i]);
	}
	printf("\n");
}

//显示菜单
void Menu()
{
	printf("********************************************\n");
	printf("		1.建立顺序表						\n");
	printf("		2.插入元素							\n");
	printf("		3.删除元素							\n");
	printf("		4.按位置查找元素					\n");
	printf("		5.按元素值查找元素					\n");
	printf("		6.求顺序表的长度					\n");
	printf("		7.显示线性表						\n");
	printf("		0.返回								\n");
	printf("********************************************\n");
}

int main(void)
{
	List MakeEmpty();
	int Potion_Find(List PtrL,ElementType X);
	int FindKth(List PtrL,ElementType X);
	ElementType Insert(List PtrL,ElementType X,int i);
	ElementType Delete(List PtrL,int i);
	int get_Length(List PtrL);
	void DispList(List PtrL);
	void Menu();

	Menu();
	int n = 0;
	int location;
	ElementType element;
	int numbers;
	int order_number;

	printf("\n请输入序号执行相关操作!\n");

	List L = MakeEmpty();

	while(1){
		scanf("%d",&n);
		switch(n){
		case 1://建立顺序表
			printf("请输入建立线性表的元素个数:");
			scanf("%d",&numbers);
			L->Last = numbers-1;
			printf("请输入%d个整数:",numbers);
			for(int i = 0;i <= L->Last;i++)
				scanf("%d",&L->Data[i]);
			printf("\n创建成功!\n");
			printf("\n继续输入序号执行操作\n");
			break;
		case 2://插入元素
			printf("插入的元素是:");
			scanf("%d",&element);
			printf("\n插入的位置是(首序号是1):");
			scanf("%d",&location);
			if(Insert(L,element,location)==TRUE)
				printf("\n插入成功!\n");
			else
				printf("\n插入失败!\n");	
			printf("\n继续输入序号执行操作\n");
			break;
		case 3://删除元素
			printf("请输入要删除的元素序号(首序号是1):");
			scanf("%d",&order_number);
			if(Delete(L,order_number)==TRUE)
				printf("\n删除成功!\n");
			else
				printf("\n删除失败!\n");
			printf("\n继续输入序号执行操作\n");
			break;
		case 4://按位置查找元素
			printf("请输入元素的位置(首位置是1):");
			scanf("%d",&location);
			printf("\n位置%d上的元素是 %d\n",location,FindKth(L,location));
			printf("\n继续输入序号执行操作\n");
			break;
		case 5://按元素查找位置
			printf("请输入元素值:");
			scanf("%d",&element);
			printf("该元素的位置是 %d (从1开始)\n",Potion_Find(L,element));
			printf("\n继续输入序号执行操作\n");
			break;
		case 6://顺序表的长度
			printf("该顺序表的长度是 %d\n",get_Length(L));
			printf("\n继续输入序号执行操作\n");
			break;
		case 7://显示线性表
			DispList(L);
			printf("\n继续输入序号执行操作\n");
			break;
		case 0:
			exit(0);
		default:printf("请输入正确的序号!\n");
		}
	}
	free(L);

	return 0;
}

首先理解以下顺序存储方法的顺序结构

顺序存储的逻辑结构和物理结构存储方式是一样的,利用连续的空间存储数据。

连续的空间,自然就是数组了。

也就是说顺序存储,其实就是把数据放到数组里面,然后插入,删除等功能,就是对数组的操作。

插入的算法
在这里插入图片描述

如果说是想把元素插到某个位置,就先把这个某个位置及后面的元素往后挪一位,再用新值覆盖某个位置上的那个元素。

考虑到插入的位置可以在最后一项,所以插入的范围应该是1~n+1

最后数组长度再+1

至于具体的挪位条件范围,要具体分析

总的来说就四步:检查,挪位,赋值,长度加一

插入的范围1~n+1

删除的算法
在这里插入图片描述

和插入类似,也是挪元素,想删除某个位置上的元素,只需要把改位置后面的元素都往前挪一位,长度再-1就好了,删除是靠挪位的覆盖和长度的截取来实现的。比如说我要删除最后以为,我并不需要挪位,我只需要把指向最后元素的位置像前挪一下,这样,被删除的元素就没有机会被操作了,除非你又对位置+1指向了它咯。

删除的范围:1~n

查找的算法
1)通过位置查找元素:
位置使用数组下标或者元素顺序都可以,具体细节只不过是转换的问题。

查找是通过遍历数组来实现的,在长度范围内寻找匹配项

2)通过元素查找位置

同样是遍历数组,在范围内查找匹配项

查找的范围是在1~n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值