顺序表的实现(头插,头删尾插,尾删)

刚学数据结构,实现一个基本的顺序表结构,顺序链表的实现,程序里包括了头插,头删,尾插,尾删,任意位置删除,任意位置插入,任意位置替换等基本函数。先了解什么是顺序表结构。

顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

顺序表特点:将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。




以下为程序:

首先建一个头文件myC.h
#include<stdlib.h>
#include<Windows.h>
#include<assert.h>

typedef int Datatype;
#define Max 2
typedef struct Seqlist
{
	Datatype *arr;
	size_t size;// 有效数据个数 
	size_t capicity;//容量
}Seqlist;

void Seqprin(Seqlist *pSeq);//读出
void SeqInit(Seqlist* pSeq); //初始化
void SeqDestory(Seqlist* pSeq); //销毁创建的空间
Seqlist* SeqCheckFull(Seqlist *pSeq);//若空间不够则进行扩容


void SeqPushBack(Seqlist* pSeq,Datatype x);//尾插
void SeqPopback(Seqlist*pSeq);//尾删
void SeqPushFront(Seqlist* pSeq,Datatype x);//头插
void SeqPopFront(Seqlist* pSeq);//头删
void SeqInsert(Seqlist *pSeq,size_t pos,Datatype x);//任意位置插入数据
void SeqErase(Seqlist *pSeq,size_t pos);//把pos位置的数据删除
int SeqFind(Seqlist *pSeq,Datatype x);//查找一个数,若找到并返回它
void SeqAt(Seqlist *pSeq,size_t pos,Datatype x);//替换指定位置的值
void BubbleSort(Seqlist *pSeq);//用冒泡排序法排列
void SelectSort(Seqlist *pSeq);//用选择排序法排序



#endif

然后是主程序  1.c
#include"myC.h"

int main()
{
	Seqlist Seqlist;//定义结构体名


	SeqInit(&Seqlist);
	SeqPushBack(&Seqlist,1);//尾插
	SeqPushBack(&Seqlist,6);//尾插
	SeqPushBack(&Seqlist,3);//尾插
	SeqPushBack(&Seqlist,4);//尾插
//	SeqPopback(&Seqlist);//尾删(测试专用)
//	SeqPushFront(&Seqlist,4);//头插(测试专用)
//	SeqPopFront(&Seqlist);//头删(测试专用)



//	SeqInsert(&Seqlist,2,0);
//	SeqErase(&Seqlist,2);
//	SeqFind(&Seqlist,2);
//	SeqAt(&Seqlist,2,0);
	BubbleSort(&Seqlist);

	Seqprin(&Seqlist);//读出所有数据
	system("pause");
	return 0;
}

void Seqprin(Seqlist *pSeq)//读写
{
	int i;
	for(i=0;i<pSeq->size;i++)
	printf("%d ",pSeq->arr[i]);
}
void SeqInit(Seqlist* pSeq)//初始化
{
	pSeq->size=0;
	pSeq->capicity=Max;
	pSeq->arr=(Datatype *)malloc(pSeq->capicity*sizeof(Datatype));
	if(NULL==pSeq->arr)
	{
		printf("创建空间失败");
	}
}
void SeqDestory(Seqlist *pSeq)//销毁所创建的空间
{
	assert(pSeq);//断言判断是否为空
	pSeq->size=0;
	pSeq->capicity=0;
	free(pSeq->arr);
}
Seqlist* SeqCheckFull(Seqlist *pSeq)//进行扩容
{
	Datatype *tem=(Datatype *)realloc(pSeq->arr,sizeof(Datatype)*pSeq->capicity*2);//进行扩容
		pSeq->capicity*=2;
		pSeq->arr=tem;
		return pSeq;
}

void SeqPushBack(Seqlist* pSeq,Datatype x)//尾插
{
	assert(pSeq);
	if(pSeq->size==pSeq->capicity)
	{
		SeqCheckFull(pSeq);
	}
	pSeq->arr[pSeq->size++]=x;
}
void SeqPopback(Seqlist*pSeq)//尾删
{
	assert(pSeq);
	if(pSeq->size==0)
	{
		printf("顺序表里没有数据");
		return;
	}
	pSeq->size--;
}
void SeqPushFront(Seqlist* pSeq,Datatype x)//头插
{	
	int i=pSeq->size;
	assert(pSeq);

	for(;i>0;i--)
	pSeq->arr[i]=pSeq->arr[i-1];
	pSeq->arr[i]=x;
	pSeq->size++;
}
void SeqPopFront(Seqlist* pSeq)//头删
{
	int i=0;
	assert(pSeq);
	
	if(pSeq->size==0)
	{
		printf("顺序表里没有数据");
		return;
	}
	for(;i<pSeq->size;i++)
		pSeq->arr[i-1]=pSeq->arr[i];
	pSeq->size--;
}
void SeqInsert(Seqlist *pSeq,size_t pos,Datatype x)//在pos位置插入数据
{
	int end;
	assert(pSeq);
	assert(pos<=pSeq->size);
	end=pSeq->size-1;
	while(end>=pos)
	{
		pSeq->arr[end+1]=pSeq->arr[end];
		--end;
	}
	pSeq->arr[pos]=x;
	pSeq->size++;
}
void SeqErase(Seqlist *pSeq,size_t pos)//把pos位置的数据删除
{
	assert(pSeq);
	assert(pos<=pSeq->size);
	while(pos<pSeq->size)
	{
		pSeq->arr[pos]=pSeq->arr[pos+1];
		pos++;
	}
	pSeq->size--;
}
int SeqFind(Seqlist *pSeq,Datatype x)//查找一个数,若找到并返回它
{
	int i=0;
	assert(pSeq);
	for(;i<pSeq->size;i++)
	{
		if(pSeq->arr[i]==x)
			return i+1;
	}
	return -1;
}
void SeqAt(Seqlist *pSeq,size_t pos,Datatype x)//替换指定位置的值
{
	assert(pSeq);
	assert(pos<=pSeq->size);
	pSeq->arr[pos-1]=x;
}
void Swap(Datatype *x,Datatype *y)//交换函数
{
	Datatype tem=*x;
	*x=*y;
	*y=tem;
}
void BubbleSort(Seqlist *pSeq)//用冒泡排序法排列
{
	int i,j,flage;
	assert(pSeq);
	for(i=0;i<pSeq->size-1;i++)
	{
		flage=0;
		for(j=0;j<pSeq->size-i-1;j++)
		{
				if(pSeq->arr[j]>pSeq->arr[j+1])
				{
					Swap(&(pSeq->arr[j]),&(pSeq->arr[j+1]));
					flage=1;
				}
		}
		if(flage==0)
				break;
	}
}

以上为所有代码,每日学一点,日积月累。


  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值