线性表操作(三)

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

思想:若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;
}

 

posted on 2019-09-28 21:36  一仟零一夜丶  阅读(214)  评论(0)    收藏  举报