线性表操作(三)

mac2022-06-30  97

两个等长的升序数组中,找出两个序列的中位数

思想:若a为A的中位数,b为B的中位数,若a=b,则就为两个数组的中位数,若a<b,则A舍弃左边,B舍弃右边,两边舍弃等长的部分,然后重新比较两个剩下部分的中位数,以此类推。

若a>b,则相反。

void SearchM(SqList &L1,SqList &L2){ int h1,h2,r1,r2; int m1,m2; r1=MaxSize-1; r2=MaxSize-1; h1=0; h2=0; while(h1!=r1||h2!=r2){ m1=(h1+r1)/2; m2=(h2+r2)/2; cout<<L1->data[m1]<<endl; cout<<L2->data[m2]<<endl; if(L1->data[m1]==L2->data[m2]){ cout<<L1->data[m1]; break; } if(L1->data[m1]<L2->data[m2]){ if((r1+h1)%2==0){ h1=m1; r2=m2; }//元素个数是奇数时,舍去中位数左边的值 else{ h1=m1+1; r2=m2; }//当元素个数是偶数时,舍去中位数及中位数左边的值 } if(L1->data[m1]>L2->data[m2]){ if((r2+h2)%2==0){ r1=m1; h2=m2; } else{ r1=m1; h2=m2+1; } } } if(L1->data[m1]<L2->data[m2]){cout<<L1->data[m1]<<endl;} else {cout<<L2->data[m2]<<endl;} }

找出数组中的主元素,即数组中一种元素最多的个数,若个数大于n/2(n为数组总数),则返回主元素,否则返回-1

思想:设计一个num和c,c为当前元素,num记录c是否为主元素,若下一个值与c不同,则num--,若num减为0,则当前的元素赋值给c,重新开始,num=1

最后确认c的真实个数,判断数组c是否为主元素

int MajorityNumber(SqList &L){ int count=1; int num=L->data[0];//记录数组中第一个值为初始元素,count为1 for(int i=1;i<MaxSize;i++){ if(num==L->data[i]){count++;} else {count--;} if(count==0){//若count减为0,则当前元素为num,重新开始 num=L->data[i]; count=1; } } count=0; for(int i=0;i<MaxSize;i++){ if(L->data[i]==num){count++;} }//最后判断num的真实个数 if(count>MaxSize/2){cout<<count<<endl;return 1;} else{cout<<"-1"<<endl;return -1;} }

 找出一个数组中未出现的最小正整数(MaxSize代表数组中的最大值)

void FindMin(SqList &L){ int B[MaxSize]; int i; for(int i=0;i<MaxSize;i++){B[i]=0;} for(int i=0;i<MaxSize;i++){ if(L->data[i]>0&&L->data[i]<MaxSize){ B[L->data[i]-1]=1;//将数组中的值存在值,则B相应的下表的值即为1 } } for(i=0;i<MaxSize;i++){ if(B[i]==0){break;} } cout<<i+1<<endl; }

 删除线性表中所有值为x的元素

void DeleteX(SqList &L,int x){ int k=0;//记录x出现的次数 for(int i=0;i<5;i++){ if(L->data[i]==x){ k=k+1; } else{L->data[i-k]=L->data[i];} } for(int i=0;i<5-k;i++){ cout<<L->data[i]<<" "; } }

删除有序线性表中所有重复的元素,是元素各部相同

void Delete_Same(SqList &L){ int k=0; for(int i=1;i<MaxSize;i++){ if(L->data[i]==L->data[i-1]){ k=k+1; } else{ L->data[i-k]=L->data[i]; } } L->length=MaxSize-k; for(int i=0;i<MaxSize-k;i++){ cout<<L->data[i]<<" "; } }

一维数组A[m+n]中存放两个线性表,将这两个线性表互换位置

void Merge(SqList &L,int i,int j){ int temp; j=j-1; while(i<j){ temp=L->data[i]; L->data[i]=L->data[j]; L->data[j]=temp; i=i+1; j=j-1; } }//将线性表i到j的位置逆置 void MergeList(SqList &L){ Merge(L,0,5); Merge(L,5,5+6); Merge(L,0,5+6); }

 判断一个链表是否中心对称

void dc(LinkList &L,int n){ LinkList p; int i,j; int s[n/2]; p=L->next; for(i=0;i<n/2;i++){ s[i]=p->data; p=p->next; } if(n%2==1){ p=p->next; }//若链表为奇数个,则从下一个开始 for(j=i-1;j>-1;j--){ if(s[j]==p->data){ p=p->next; } else{ cout<<"不是中心对称"<<endl; return; break; } } cout<<"是中心对称"<<endl; }

 

转载于:https://www.cnblogs.com/Yshun/p/11605011.html

最新回复(0)