顺序表作业

/*参考顺序表的基本操作,设计有序顺序表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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值