数据结构 线性表-顺序表
含(初始化,插入,查找(按值/下标),删除(按值/下标/值范围),输出,销毁,逆置以及求并集)
#include <iostream>
using namespace std;
#define ERROR 0
#define OK 1
typedef struct seqlist{ //顺序表结构体
int n;
int maxlength;
int *element;
}Seqlist;
int init (Seqlist *L,int msize){ //初始化
L->maxlength = msize;
L->n =0;
L->element = (int*)malloc(sizeof(int)*msize);
return OK;
}
int find (Seqlist *L,int i,int *x){ //查找下标为i的元素
if (i<0||i>L->n-1)
return ERROR;
*x =L->element[i];
return OK;
}
int Findx(Seqlist *L,int x){ //查找值为x的元素,返回值为小标
int i;
for(i=0;i<L->n;i++){
if(L->element[i]==x)
return i;
}
return -1;
}
void Append(Seqlist *L,int x){ //
L->element[L->n]=x;
L->n++;
}
void Union(Seqlist *A,Seqlist *B,Seqlist *C){ //求A∪B,并存于C
int i=0;
C->n=0;
for(i=0;i<A->n;i++){
if(Findx(B,A->element[i])==-1)
Append(C,A->element[i]);
}
for(i=0;i<B->n;i++)
Append(C,B->element[i]);
}
int Update(Seqlist *L,int i,int x){ //更新下标为i的元素值为x
if(i<0||i>L->n-1)
return ERROR;
L->element[i]=x;
return OK;
}
int insert(Seqlist *L,int i,int x){ //在下标为i的元素后插入数据x
if (i<-1||i>L->n-1)
return ERROR;
if (L->n == L->maxlength)
return ERROR;
int j;
for (j=L->n-1;j>i;j--)
L->element[j+1]=L->element[j];
L->element[i+1]=x;
L->n = L->n+1;
return OK;
}
int Delete(Seqlist *L,int i){ //删除下标为i的元素
if (i<0||i>L->n-1){
return ERROR;
}
if (!L->n)
return ERROR;
int j;
for(j=i+1;j<L->n;j++)
L->element[j-1]=L->element[j];
L->n--;
return OK;
}
int DeleteX(Seqlist *L,int x){ //删除数值为x的元素
if (!L->n)
return ERROR;
for(int i=0;i<L->n;i++){
if (L->element[i]==x)
{
Delete(L,i);
i--;
}
}
return OK;
}
int DeleteAB(Seqlist *L,int x,int y){ //删除数值介于AB之间的元素
if(!L->n)
return ERROR;
for (int i=0;i<L->n;i++)
{
if (L->element[i]>x&&L->element[i]<y)
{
Delete(L,i);
i--;
}
}
return OK;
}
int Reverse(Seqlist *L){ //逆置顺序表
if (!L->n)
return ERROR;
int i;
int j=L->n-1;
int temp;
for(i=0;i<j;i++,j--)
{
temp=L->element[i];
L->element[i]=L->element[j];
L->element[j]=temp;
}
return OK;
}
int output(Seqlist *L){ //输出顺序表元素
int i;
if (L->n==0)
return ERROR;
for(i=0;i<=L->n-1;i++)
cout << L->element[i] <<" ";
cout<<endl;
return OK;
}
void Destroy(Seqlist *L){ //销毁顺序表
L->n=0;
L->maxlength=0;
free(L->element);
}
int main(){
int i;
Seqlist l;
init (&l,10);
for (i=0;i<9;i++)
insert(&l,i-1,i);
output (&l);
Delete(&l,0);
cout<<"delete [0]"<<endl;
output(&l);
Delete(&l,10);
cout<<"delete [10]"<<endl;
output(&l);
DeleteX(&l,3);
cout<<"delete 3"<<endl;
output(&l);
DeleteAB(&l,2,5);
cout<<"delete 2-5"<<endl;
output(&l);
Update(&l,0,9);
cout<<"Update [0]->9"<<endl;
output(&l);
Reverse(&l);
cout<<"Reserve"<<endl;
output(&l);
Destroy(&l);
Seqlist A;
init (&A,10);
for (i=0;i<5;i++)
insert(&A,i-1,i);
cout<<"A"<<endl;
output (&A);
Seqlist B;
init (&B,10);
for (i=0;i<5;i++)
insert(&B,i-1,2*i);
cout<<"B"<<endl;
output (&B);
Seqlist C;
init (&C,20);
Union(&A,&B,&C);
cout<<"A+B"<<endl;
output (&C);
Destroy(&A);
Destroy(&B);
Destroy(&C);
system("pause");
return 0;
}
运行结果图示: