/*参考顺序表的基本操作,设计有序顺序表L的基本操作,主要功能函数如下,
1、初始化有序顺序表L。
2、建立一个有序顺序表L。存放一组有序数,或产生一组随机数并排序。
3、求有序顺序表L的长度。
4、有序顺序表L中取出第i个元素。
5、定位函数,确定有序顺序表L值为e元素的位置。
6、在有序顺序表L插入一个值为e的元素,仍有序。
7、删除有序顺序表L中最后一个值为e的元素。
8、将有序顺序表L中值为e元素修改值为e1,仍有序。
9、将有序顺序表L中属于区间[low,high]的数据取出存入新的有序顺序表L1。
10、有序顺序表LA和有序顺序表LB分别存储两个集合A和B,利用归并法分别求出两个集合的并集、交集和差集。
11、已知顺序表L,试编写算法清除顺序表L中多余的重复元素。*/
#include <cstdlib>
#define MaxSize 10
typedef int ElemType; //自定义类型语句
typedef struct
{
int length;
ElemType data[MaxSize+1];
}SqList;
//1、初始化有序顺序表L。
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList));
L->length =0;
}
//2、建立一个有序顺序表L。存放一组有序数,或产生一组随机数并排序。
void CreateList(SqList *&L,ElemType a[],int n)//建立顺序表
{
int i;
for(i=1;i<=n;i++)
L->data[i]=a[i];
L->length=n;
}
//3、求有序顺序表L的长度。
int ListLength(SqList *L)
{
int n;
n=L->length ;
return n;
}
//4、有序顺序表L中取出第i个元素。
bool GetElem(SqList *L,int i,ElemType &e)
{
if(i<1 || i>L->length )
return false;
e=L->data[i];
return true;
}
//输出第i个数
int pushi(SqList *&L,int i)
{
if(i>L->length)
return false;
else
return(L->data[i]);
}
//5、定位函数,确定有序顺序表L值为e元素的位置。
int LocatElem(SqList *L,ElemType e)
{
int i=1;
while(i<=L->length && L->data[i]!=e)
i++;
if(i<=L->length)
return i;
else
return 0;
}
//6、在有序顺序表L插入一个值为e的元素,仍有序。
void ListInsert(SqList *&L,ElemType e)
{
int i=0;
int j;
while(i<=L->length&&e>=L->data[i])
i++;
for( j=L->length;j>=i;j--)
L->data[j+1]=L->data[j];
L->data[i]=e;
L->length ++;
}
//7、删除有序顺序表L中最后一个值为e的元素。
bool ListDelete(SqList *&L,ElemType e)
{ int i=L->length,k;
while(L->data[i]!=e)
i--;
if(i<0||(e<L->data[i]&&e>L->data[i-1]))
return false;
for(k=i;k<L->length;k++)
L->data[k]=L->data[k+1];
L->length --;
return true;
}
//8、将有序顺序表L中值为e元素修改值为e1,仍有序。
bool change(SqList *&L,ElemType e,ElemType e1)
{
//首先要找到e所在位置
int i=1,j;
while(L->data[i]!=e)
i++;
if(i>L->length)
return false;
if(L->data[i]==e)
j=i;//记下e所在位置序号
L->data[j]=e1;
//e1替换后,需要重新排序
int ii,jj,t;
for(ii=1;ii<=L->length;ii++)
{
for(jj=ii+1;jj<L->length;jj++)
{
if(L->data[ii]>L->data[jj])
{
t=L->data[jj];
L->data[jj]=L->data[ii];
L->data[ii]=t;
}
}
}
return true;
}
//9、将有序顺序表L中属于区间[low,high]的数据取出存入新的有序顺序表L1。
bool ex(SqList *&L,ElemType low,ElemType high,SqList *&L1)
{
int i=1;
while(i<=L->length&&L->data[i]<low)
i++;
if(i>L->length)
return false;
if(L->data[i]>high)
return false;
L1=(SqList *)malloc(sizeof(SqList));
L1->length =0;
int k=1,j;
j=i;
while(i<=L->length&&L->data[i]<=high)
{
L1->data[k]=L->data[i];
i++;k++;
}
L1->length=k-1;
while(i<L->length)
{
L->data[j]=L->data[i];
i++;j++;
}
return true;
}
//10、有序顺序表LA和有序顺序表LB分别存储两个集合A和B,利用归并法分别求出两个集合的并集、交集和差集。
//归并求并集
void unionsum(SqList *&LA,SqList *&LB,SqList *&LC)
{
InitList(LC);
int i,j,k;
i=1;k=1;j=1;
while(i<=LA->length&&j<=LB->length)
{
if(LA->data[i]<LB->data[j])
{
LC->data[k]=LA->data[i];
k++;
i++;
}
else if(LA->data[i]==LB->data[j])
{
LC->data[k]=LA->data[i];
k++;
i++;
j++;
}
else
{
LC->data[k]=LB->data[j];
k++;
j++;
}
}
while(i<LA->length)
{
LC->data[k]=LA->data[i];
i++;
k++;
}
while(j<LB->length)
{
LC->data[k]=LB->data[j];
j++;
k++;
}
}
//求交集
/*void intersection(SqList *&LA,SqList *&LB,SqList *&LC)
{
int i,j;
int K=1;
for(i=1,j=1;i<=LA->length,j<=LB->length;i++,j++)
{
while(LA->data[i]==LB->data[j])
{
LC->data[K]=LA->data[i];
k++;
}
}
}
//A-B(属于A但不属于B)
void complement(SqList *&LA,SqList *&LB,SqList *&LC)
{
int i,j;
int K=1;
for(i=1,j=1;i<=LA->length,j<=LB->length;i++,j++)
{
while(LA->data[i]!=LB->data[j])
{
LC->data[K]=LA->data[i];
k++;
}
}
}*/
//11、已知顺序表L,试编写算法清除顺序表L中多余的重复元素。
void delsame(SqList &L)
{ int i,j,k;
if (L.length>0)
{ j=0;
for(i=1;i<L.length;i++)
{k=0;
while (k<=j&&L.data[k]!=L.data[i])
k++;
if(k<j)
{j++;
L.data[j]=L.data[i];
}
}
L.length=j+1; }
}
void main()
{
SqList *L,*L1;
ElemType a[]={0,11,22,33,44,44,55,66,66,66,77},e;
InitList(L);
CreateList(L,a,10);
int len;
len=ListLength(L);
bool b;
b=GetElem(L,3,e);
b=ListDelete(L,66);
//b=ex(L,30,60,L1);
}