顺序表作业

来源:互联网 发布:转行程序员 编辑:程序博客网 时间:2024/06/06 07:45
/*参考顺序表的基本操作,设计有序顺序表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 10typedef  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);}

原创粉丝点击