数据结构:顺序表的基本操作: 增 删 查 改 扩容 动态分配内存

顺序表:

          线性表 

 

/*
From:mohican
Data:2018/12/26
*/
/*SXList.h*/

#include<stdio.h>

typedef struct SXList
{
	int *elem; //指针
	int usedsize; //有效元素个数
	int length; //总长度
}SXList,*PList;

//初始化顺序表
void Initisite(PList  plist );
bool AddList(PList plist,int pos ,int value); //在pos位插入一个 value
bool DelList(PList plist,int pos, int *value ); //删除pos位置的一个value,把删除掉的value保存
bool Search(PList plist,int pos,int value);//从Pos位开始查找一个value值,并将结果返回pos
bool DelVal(PList plist ,int pos,int value);// 删除指定Value值,从pos位开始的第一个
int GetElem(PList plist,int pos);//得到pos位置的元素的值
int GetLength(PList PList);//得到顺序表的长度
void Clear(PList plist);//清楚顺序表
void Destory(PList plist);//销毁 //二倍扩容 堆上分配 手动摧毁
void Show(PList plist);
/*
From:mohican
Data:2018/12/26
*/
/*SXList.cpp*/
#pragma once
#include"SXList.h"
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define SIZE 20
void Initisite(PList  plist )
{
	assert(plist!=NULL);
	plist->elem = (int *) malloc (SIZE * sizeof(int ));
	assert(plist->elem!=NULL);
	plist->length = SIZE;
	plist->usedsize = 0;
}

bool IsFull(PList plist)
{
	if(plist->usedsize==plist->length)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void Resize(PList plist)  //二倍扩容
{
	plist->elem = (int *)realloc(plist->elem,SIZE*sizeof(int)*2);
	assert(plist->elem!=NULL);
	plist->length*=2;

}

bool AddList(PList plist,int pos ,int value) //在pos位插入一个 value
{
	assert(plist!=NULL);
	if(IsFull(plist))
	{
		Resize(plist);
	}
	if(pos<0 || pos>plist->usedsize)  //顺序表是连续存储的
	{
		return false;
	}
	//从后往前挪
	for(int i =plist->usedsize;i>pos ;--i)
	{
		plist->elem[i] = plist->elem[i-1];
	}
	plist->elem[pos] = value;
	plist->usedsize++;
	return true;
}
bool DelList(PList plist,int pos, int value )//删除pos位置的一个value,把删除掉的value保存
{
	assert(plist!=NULL);
	if(pos<0 || pos>plist->usedsize)
	{
		return false;
	}
	value = plist->elem[pos]; 
	//printf("第%d位置的元素 %d已经删除\n",pos+1,value);
	for(int i =pos;i<plist->usedsize;++i)
	{
		plist->elem[i-1] = plist->elem[i];
	}
	plist->usedsize--;
	return true;
}
bool Search(PList plist,int pos,int value)//从Pos位开始查找一个value值,并将结果返回pos
{
	assert(plist!=NULL);
	if(pos <0 || pos>plist->usedsize)
	{
		return false;
	}
	for(int i =pos-1;i<plist->usedsize;++i)
	{
		if(plist->elem[i] == value)
		{
			printf("在%d号位置找到\n",i+1);
			return true;
		}
	}
	return false;

}
bool DelVal(PList plist ,int pos,int value)// 删除指定Value值,从pos位开始的第一个
{
	if(Search(plist,pos,value))
	{
		for(int i = pos-1 ;i<plist->usedsize;++i)
		{
			if(plist->elem[i]== value)
			{
				DelList(plist,i+1,NULL);
				return true;
			}
		}
	}
	else
	{
		return false;
	}
}

int GetElem(PList plist,int pos)//得到pos位置的元素的值
{
	assert(plist!=NULL);
	return plist->elem[pos-1];
}

int GetLength(PList plist)//得到顺序表的长度
{
		assert(plist!=NULL);
	return plist->usedsize;
}
void Clear(PList plist)//清楚顺序表
{
	assert(plist!=NULL);
	plist->usedsize = 0;
}
void Destory(PList plist)//销毁 //二倍扩容 堆上分配 手动摧毁
{
	Clear(plist);
	free(plist->elem);
	plist->elem=NULL;
	plist->length=0;
}
void Show(PList plist)
{
	assert(plist!=NULL);
	for(int i = 0;i<plist->usedsize;++i)
	{
		printf("%d\t",plist->elem[i]);
	}
	printf("\n");
}


int main()
{
	SXList plist;
    Initisite(&plist);
	for(int i =0;i<40;++i )
	{
		AddList(&plist,i,i);
	}
	DelVal(&plist,10,7);
	Show(&plist);
	getchar();
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值