顺序表

C语言实现顺序表

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define NUM 10
typedef struct SQList
{
	int *elem;//动态内存的地址
	int length;//有效数据长度
	int listsize;//总容量
}SQList,*PSQList;
//初始化
void InitSqList(PSQList ps)
{
	assert(ps!=NULL);
	if(ps == NULL)
		return ;
	ps->elem = (int *)malloc(NUM*sizeof(int));
	ps->length  = 0;
	ps->listsize = NUM;
}
//判满
static bool IsFull(PSQList ps)
{
	return ps->length == ps->listsize;
}
//判空
bool empty(PSQList ps)
{
	return ps->length == 0;
}
//清空数据
void Clear(PSQList ps)
{
	ps->length == 0;
}
//容量增长函数,容量变为原来的两倍
static bool Inc(PSQList ps)
{
	ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
	assert(ps->elem!=NULL);
	ps->listsize *= 2;
	return true;
}
//插入
bool Insert(PSQList ps,int pos,int val)
{
	if(pos<0||pos>ps->length)
		return false;
	if(IsFull(ps))
		Inc(ps);
	//移动后面的数据
	for(int i = ps->length-1;i>=pos;i--)
	{
		ps->elem[i+1] = ps->elem[i];
	}
	//插入新的数据
	ps->elem[pos] = val;
	//有效数据个数+1
	ps->length++;
	return true;
}
//在ps中查找第一个key,找到返回下标,没有找到返回-1
int Search(PSQList ps,int key)
{
	for(int i = 0;i<ps->length;i++)
	{
		if(key == ps->elem[i])
			return i;
	}
	return -1;
}
//删除pos位置的值
bool DelPos(PSQList ps,int pos)
{
	//判断Pos位置是否合法
	if(pos<0||pos>ps->length)
		return false;
	//将后面的数据往前移
	for(int i = pos;i<ps->length-1;i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;
	return true;
}
//删除第一个val值
bool DelVal(PSQList ps,int val)
{
	int i = Search(ps,val);
	if(i<0)
		return false;
	return DelPos(ps,i);
}
//返回key的前驱下标,如果不存在前驱则返回-1
int GetPrio(PSQList ps,int key)
{
	int i = Search(ps,key);
	if(i<=0)
		return -1;
	return i-1;
}
//返回key的后继,如果不存在后继则返回-1
int GetNext(PSQList ps,int key)
{
	int i = Search(ps,key);
	if(i<0||i==ps->length-1)
		return -1;
	return i+1;
}
void Show(PSQList ps)
{
	for(int i = 0;i<ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}
void Destroy(PSQList ps)
{
	free(ps->elem);
	ps->elem = NULL;
	ps->length = 0;
	ps->listsize = 0;
}
int main()
{
	SQList sq;
	InitSqList(&sq);
	for(int i = 0;i<20;i++)
	{
		Insert(&sq,i,i);
	}
	Show(&sq);
	return 0;
}

C++实现顺序表

#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
using namespace std;
#define SIZE 10
template<typename T>
class SQList
{
private:
	T* elem;//动态内存的地址
	int length;//有效数据长度
	int listsize;//总容量
public:
	SQList();
	~SQList();
	bool IsFull();
	bool IsEmpty();
	bool Inc();//扩容,容量变为原来的二倍
	bool InsertPos(int pos,T val);//按位插入
	int Search(int key);//查找第一个key,找到返回下标,没有找到返回-1	
	bool DelPos(int pos);//删除pos位置的值
	bool DelVal(T val);//删除第一个val值
	int GetPrio(int key);//返回key的前驱下标
	int GetNext(int key);//返回key的后继下标
	void Show();//打印
};
template<typename T>
SQList<T>::SQList()
{
	elem = new T[SIZE];
	length = 0;
	listsize = SIZE;
}
template<typename T>
SQList<T>::	~SQList()
{
	delete elem;
	elem = nullptr;
	length = 0;
	listsize = 0;
}
template<typename T>
bool SQList<T>::IsFull()
{
	return length == listsize;
}
template<typename T>
bool SQList<T>::IsEmpty()
{
	return length == 0;
}
template<typename T>
bool SQList<T>::Inc()
{
	T* p = new T[listsize*2];
	memcpy(p,elem,sizeof(int)*length);
	/*for(int i = 0;i<length;i++)
	{
		p[i] = elem[i];
	}*/
	delete elem;
	elem = p;
	listsize *= 2;
	return true;
}
template<typename T>
bool SQList<T>::InsertPos(int pos,T val)
{
	if(pos<0||pos>length)
		return false;
	if(IsFull())
		Inc();
	//移动后面的数据
	for(int i = length-1;i>=pos;i--)
	{
		elem[i+1] = elem[i];
	}
	//插入新的数据
	elem[pos] = val;
	//有效数据个数+1
	length++;
	return true;
}
template<typename T>
int SQList<T>::Search(int key)
{
	for(int i = 0;i<length;i++)
	{
		if(elem[i] == key)
			return i;
	}
	return -1;
}
template<typename T>
bool SQList<T>::DelPos(int pos)
{
	//判断pos位置是否合法
	if(pos<0||pos>length)
		return false;
	//将后面的数据往前移
	for(int i = pos;i<length-1;i++)
	{
		elem[i] = elem[i+1];
	}
	length--;
	return true;
}
template<typename T>
bool SQList<T>::DelVal(T val)
{
	int i = Search(val);
	if(i<0)
		return false;
	return DelPos(i);
}
template<typename T>
int SQList<T>::GetPrio(int key)
{
	int i = Search(key);
	if(i<0)
		return -1;
	return i-1;
}
template<typename T>
int SQList<T>::GetNext(int key)
{
	int i = Search(key);
	if(i<0||i == length-1)
		return -1;
	return i+1;
}
template<typename T>
void SQList<T>::Show()
{
	for(int i = 0;i<length;i++)
	{
		cout<<elem[i]<<" ";
	}
	cout<<endl;
}
int main()
{
	SQList<int> Q;
	for(int i = 0;i<20;i++)
	{
		Q.InsertPos(i,i);
	}
	Q.Show();
	cout<<Q.GetPrio(5)<<endl;
	cout<<Q.GetNext(5)<<endl;
	Q.DelPos(2);
	Q.DelVal(3);
	Q.Show();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值