計算機應用專業(yè)上機考試數(shù)據(jù)結構輔導

字號:

編一C程序,它能讀入集合A的一串整數(shù)(以-9999為結束標記,整數(shù)個數(shù)小于1000)和集合B的一串整數(shù)(以-9999為結束標記,整數(shù)個數(shù)小于1000),計算出A與B的交集,
    并以由小到大的次序輸出A與B的交集中的所有整數(shù)(輸入整數(shù)時,相鄰的兩個用空格隔開。為A或B輸入時,同一個數(shù)可能出現(xiàn)多次,而A與B的交集中同一個數(shù)不能出現(xiàn)多次)。(注:程序的可執(zhí)行文件名必須是 e2.exe)。
    */
    //注意調(diào)試程序時要多輸入重復數(shù)據(jù)調(diào)試;本程序是根據(jù)青龍?zhí)峁┑某绦蚋木?,消除了重復?shù)據(jù)的錯誤!
    #include
    #include
    void BuCountbbleSort(int r[],int n)
    {//冒泡排序
     int i,j,k;
     int exchange;
     for(i=0;i<=n;i++)
     {
     exchange=0;
     for(j=n-1;j>=i;j--)
     if(r[j+1]     {
     k=r[j+1];
     r[j+1]=r[j];
     r[j]=k;
     exchange=1;
     }
     if(!exchange)
     break;
     }
    }
    int BingJi(int m[],int n[],int l[],int Countaa,int Countbb)
    {//求集合的并集
     int i=0,j=0,k=0;
     while(i<=Countaa&&j<=Countbb)
     {
     if(m[i]     {//如果 m[i]     l[k]=m[i];
     k++;
     i++;
     }//endif
     else if(m[i]>n[j])
     {//如果 m[i]>n[j]則取小的值n[j],然后j++;
     l[k]=n[j];
     k++;
     j++;
     }//end elseif
     else
     {//如果 m[i]==n[j],可以任取一個值,然后i++;j++;
     l[k]=m[i];
     k++;
     i++;
     j++;
     }//endelse
     }//endwhile
     if(i>Countaa)
     {//如果i>Countaa,即數(shù)組m[i]中的元數(shù)個數(shù)較少,
     //則把n[j]中的剩余元素,都付給l[]。
     while(j<=Countbb)
     {
     l[k]=n[j];
     j++;
     k++;
     }//endwhile
     }//endif
     if(j>Countbb)
     {//如果j>Countbb,即數(shù)組n[i]中的元數(shù)個數(shù)較少,
     //則把m[j]中的剩余元素,都付給l[]。
     while(i<=Countaa)
     {
     l[k]=m[i];
     i++;
     k++;
     }//endwhile
     }//endif
    return k;//返回生成的數(shù)組的元數(shù)個數(shù)
    }//end BuCountbbleSort
    int JiaoJi(int m[],int n[],int l[],int Countaa,int Countbb)
    {//求集合的交集
     ///////////////////////////////////
     //消除數(shù)組m[]中的重復元素
    int w,x,y;
     for(w=0;w<=Countaa;w++)
     {
     for(x=w+1;x<=Countaa;x++)
     {
     if(m[w]==m[x])
     {
     Countaa--;
     for(y=x;y<=Countaa;y++)
     {
     m[y]=m[y+1];
     }//endfor
     x--;
     }//endif
     }//endfor
     }//endfor
     /*
     //測試消除數(shù)組中的重復元素的效果用下列循環(huán)輸出
     int z;
     for(z=0;z<=Countaa;z++)
     {
     printf("%d",m[z]);
     }
     printf("\n");
     */
     //消除結束
     ///////////////////////////////////
    ///////////////////////////////////
     //求交集
     int i=0,j=0,k=0;
    while(i<=Countaa)
     {
     for(j=0;j<=Countbb;j++)
     {//用集合的第一個元素分別和另一個集合的各元素相比較
     //然后再用第二個元素(直到最后一個元素)和另一個集合的各元素相比較
     if(m[i]==n[j])
     {//如果有相同的就保存到l[]中,這樣同時消掉了n[]中的重復元素
     l[k]=m[i];
     k++;
     break;
     }//endif
    }//endfor
     i++;
     }//endwhile
     //求交集結束
     //////////////////////////////////
     return k;
    }
    void main()
    {
     int a[1000], b[1000],c[2000];
     int exchange=0;
     int i,CountA,CountB,CountC;
     printf("input a\n");
     for(i=0;i<=1000;i++)
     {
     scanf("%d",&a[i]);
     if(a[i]==-9999)
     break;
     }//endfor
     CountA=i-1;
     BuCountbbleSort(a,CountA);//先將集合A排序
     printf("\ninput b\n");
     for(i=0;i<=1000;i++)
     {
     scanf("%d",&b[i]);
     if(b[i]==-9999)
     break;
     }//endfor
     CountB=i-1;
     BuCountbbleSort(b,CountB);//集合B排序
    // CountC=BingJi(a,b,c,CountA,CountB);
     CountC=JiaoJi(a,b,c,CountA,CountB);
     printf("\n\n");
     for(i=0;i<=CountC-1;i++)
     {
     printf("%d ",c[i]);
     }
     printf("\n");
    }