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;
}