定长顺序表

一、顺序表:逻辑相邻,物理地址也相邻

二、顺序表的结构:

三、 顺序表的操作:

1、初始化

2、任意pos位置的插入

3、删除某个数据

4、删除指定位置的数据,并保存该数据。

5、获取任意位置的数据

6、修改任意位置的数据

7、查找某个数据,并返回其下标

8、打印顺序表

9、销毁

 

//Seqlist.h
//定长顺序表
#pragma once
#define size 10

typedef struct Seqlist
{
	int elem[size];  //存储数据
	int length;     //顺序表的有效数据个数
}Seqlist;

typedef Seqlist *PSeqlist;

void InitSeqlist(PSeqlist ps); //初始化

bool Insert(PSeqlist ps,int pos,int val); //任意位置插入

bool DeleteVal(PSeqlist ps,int key); //删除key值

bool DeletePos(PSeqlist ps,int pos,int *rtval);//删除pos位置的数据,并保存该位置的数据,rtval输出参数

int GetVal(PSeqlist ps,int pos,int *rtval); //获取pos位置的数据

bool SetVal(PSeqlist ps,int pos,int newval); //修改pos位置的数据

int Search(PSeqlist ps,int key);//查找数据,找到:返回下标   找不到:返回-1

bool IsEmpty(PSeqlist ps); //判空

//static bool IsFull(PSeqlist ps); //判满

int GetLength(PSeqlist ps); //求有效数据个数

void  Show(PSeqlist ps); //打印

void Destroy(PSeqlist ps); //销毁
//Seqlist.c
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"Seqlist.h"

void InitSeqlist(PSeqlist ps) //初始化
{
	assert(ps != NULL);
	if(ps == NULL)
	{
		return;
	}
	ps->length = 0;  //当前顺序表中无数据
}

static bool IsFull(PSeqlist ps) //判满
{
	return ps->length == size;
}

bool Insert(PSeqlist ps,int pos,int val) //任意位置插入
{
	assert(ps != NULL);
	if(pos < 0 || pos > ps->length)
	{
		return false;
	}
	if(IsFull(ps))  //判满
	{
		return false;
	}
	for(int i=ps->length-1;i>=pos;i--) 
	{
		ps->elem[i+1] = ps->elem[i];   //从pos位置,向后移动数据
	}
	ps->elem[pos] = val;  //插入数据
	ps->length++;  //更新有效数据个数
	return true;
}
bool DeleteVal(PSeqlist ps,int key) //删除key值
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	int i = Search(ps,key);  //查找要删除值的下标
	if(i != -1)  
	{
		return DeletePos(ps,i,NULL);  //删除该下标的值
	}
	return true;
}
bool DeletePos(PSeqlist ps,int pos,int *rtval)//删除pos位置的数据,并保存该位置的数据,rtval输出参数
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	if(pos < 0 || pos > ps->length-1)  
	{
		return false;
	}
	if(rtval != NULL)  //保存删除位置的数据
	{ 
		*rtval = ps->elem[pos];
	}
	for(int i=pos;i<ps->length-1;i++) //删除数据,从pos后向前移数据
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;  //更新有效数据个数

	return true;
}

int GetVal(PSeqlist ps,int pos,int *rtval) //获取pos位置的数据
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	*rtval = ps->elem[pos];  //保存pos位置的数据
	return *rtval;
}

bool SetVal(PSeqlist ps,int pos,int newval) //修改pos位置的数据
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	ps->elem[pos] = newval;
	return true;
}

int Search(PSeqlist ps,int key)//查找数据,找到:返回下标   找不到:返回-1
{
	assert(ps != NULL);
	int i=ps->length-1;
	for(;i>0;i--)
	{
		if(ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

bool IsEmpty(PSeqlist ps) //判空
{
	return ps->length == 0;
}

int GetLength(PSeqlist ps)//求有效数据个数
{
	return ps->length ;
}

void  Show(PSeqlist ps)//打印
{
	for(int i=0;i< ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
	/*for(int i=ps->length-1;i>0;i--)
	{
		printf("%d ",ps->elem[i]);
	}*/
}

void Destroy(PSeqlist ps) //销毁
{
	ps->length = 0;

}
//main.c
#include<stdio.h>
#include"Seqlist.h"
int main()
{
	Seqlist p;  //相当于PSeqlist == Seqlist *
	InitSeqlist(&p);
	for(int i=0;i<10;i++)
	{
		Insert(&p,i,i);   //所有测试用例
	}
	Show(&p);  

	DeleteVal(&p,9);   
	Insert(&p,2,30);
	Show(&p);

	int a;
	int *rtval = &a;
	DeletePos(&p,3,rtval);
	Show(&p);

	printf("%d\n",Search(&p,6));

	SetVal(&p,5,12);
	Show(&p);

	printf("%d\n",GetVal(&p,3,rtval));

	Destroy(&p);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值