顺序表的学习

本文介绍了线性表的顺序存储结构,通过一维数组实现,并详细阐述了顺序表的插入、删除和查阅操作。插入操作从表尾开始,删除操作则涉及节点移动。代码示例展示了在C语言中如何实现这些操作,并提供了主函数进行演示。
摘要由CSDN通过智能技术生成

线性表的顺序存储结构:

一段地址连续的存储单元依次存储线性表的数据元素,可以用一维数组来实现顺序存储结构,线性表不能超过存储容量(数组的长度);

顺序表的描述三属性:

1、存储空间的起始位置

2、表的最大存储容量(数组的长度)

3、线性表的当前长度

应当遵循的是:当前长度 < = 存储容量

顺序表结构的操作(插入、删除、查阅)

插入操作从表尾开始到要插入的位置(包括),节点往后移动,最后记得表长度加1

void charu(int n,int data)
{
	int j;
	if(n<1 || (n>sp.listw+1) || (sp.listw>=sp.listmax))//当插入的位置比1小 或 插入的位置远远超过表尾 或 表尾已经是表的最大值时
	{
		printf("非法!\n");
		return;
	}
	else if((n==sp.listw+1) && (sp.listw<sp.listmax))//当插入的位置是表尾且表尾小于表的最大值时
	{
		sp.num[n-1]=data;//将数据写到表尾
		sp.listw++;//表尾加一
		return;
	}
	else//当插入的位置不是表尾且不是非法的位置时
	{
		for(j=sp.listw-1;j>=n-1;j--)//将人数数的习惯变为数组的下标,从表尾开始
		{
			sp.num[j+1]=sp.num[j];//往后移动
		}
		sp.num[n-1]=data;
		sp.listw++;
	}
}

删除的操作则是从要删除的位置往后一个节点开始到表尾(包括),往前移动,最后表尾减1

void shanchu(int n)
{
	int j;
	if((n<1) || (n>sp.listw))//删除的位置比1小或者大于表尾时
	{
		printf("非法!\n");
		return;
	}
	else if(n==sp.listw)//当删除的位置是表尾
	{
		sp.num[n-1]=0;
		sp.listw--;
		return;
	}
	else//当删除的位置不是表尾且不是非法的位置时
	{
		for(j=n;j<=sp.listw-1;j++)//将人数数的习惯变为数组的下标,从删除的位置下一个开始
		{
			sp.num[j-1]=sp.num[j];
		}
		sp.listw--;
	}
}

查阅

int chayue(int n)
{
	int m;
	if((n<1) || (n>sp.listw))
	{
		printf("非法!\n");
		return;
	}
	else
	{
		m=sp.num[n-1];
		return m;
	}
}

总和

#include<stdio.h>
typedef struct studen
{
	int num[10];
	int listw;//表尾长度
	int listmax;//表的空间最大值
}splist;
splist sp;
void xianshi()
{
	int i;
	for(i=0;i<sp.listw;i++)
	{printf("%d ",sp.num[i]);}
	putchar('\n');
	printf("********************************************\n");
}
void write()
{
	int i;
	for(i=0;i<5;i++)
	{
		sp.num[i]=i;
	}
	sp.listw=i;
	sp.listmax=10;
	return;
}
void charu(int n,int data)
{
	int j;
	if(n<1 || (n>sp.listw+1) || (sp.listw>=sp.listmax))//当插入的位置比1小 或 插入的位置远远超过表尾 或 表尾已经是表的最大值时
	{
		printf("非法!\n");
		return;
	}
	else if((n==sp.listw+1) && (sp.listw<sp.listmax))//当插入的位置是表尾且表尾小于表的最大值时
	{
		sp.num[n-1]=data;//将数据写到表尾
		sp.listw++;//表尾加一
		return;
	}
	else//当插入的位置不是表尾且不是非法的位置时
	{
		for(j=sp.listw-1;j>=n-1;j--)//将人数数的习惯变为数组的下标,从表尾开始
		{
			sp.num[j+1]=sp.num[j];//往后移动
		}
		sp.num[n-1]=data;
		sp.listw++;
	}
}
void shanchu(int n)
{
	int j;
	if((n<1) || (n>sp.listw))//删除的位置比1小或者大于表尾时
	{
		printf("非法!\n");
		return;
	}
	else if(n==sp.listw)//当删除的位置是表尾
	{
		sp.num[n-1]=0;
		sp.listw--;
		return;
	}
	else//当删除的位置不是表尾且不是非法的位置时
	{
		for(j=n;j<=sp.listw-1;j++)//将人数数的习惯变为数组的下标,从删除的位置下一个开始
		{
			sp.num[j-1]=sp.num[j];
		}
		sp.listw--;
	}
}
int chayue(int n)
{
	int m;
	if((n<1) || (n>sp.listw))
	{
		printf("非法!\n");
		return;
	}
	else
	{
		m=sp.num[n-1];
		return m;
	}
}
void main()
{
	int cha_yue;
	printf("建立的顺序表为:");
	write();
	xianshi();
	printf("插入第二后的顺序表为:");
	charu(2,99);//在第二个位置插入99
	xianshi();
	printf("删除第二后的顺序表为:");
	shanchu(2);//删除位置为2
	xianshi();
	printf("查阅第二的数据为:");
	cha_yue=chayue(2);
	printf("%d\n",cha_yue);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值