国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

(05)第五章 數組和廣義表 題解

2019-11-17 05:46:08
字體:
來源:轉載
供稿:網友
                  第五章 數組和廣義表
5.18
void RSh(int A[n],int k)//把數組A的元素循環右移k位,只用一個輔助存儲空間
{
  for(i=1;i<=k;i++)
    if(n%i==0&&k%i==0) p=i;//求n和k的最大公約數p
  for(i=0;i<p;i++)
  {
    j=i;l=(i+k)%n;temp=A[i];
    while(l!=i)
    {
      A[j]=temp;
      temp=A[l];
      A[l]=A[j];
      j=l;l=(j+k)%n;
    }// 循環右移一步
    A[i]=temp;
  }//for
}//RSh
分析:要把A的元素循環右移k位,則A[0]移至A[k],A[k]移至A[2k]......直到最終回到A[0].然而這并沒有全部解決問題,因為有可能有的元素在此過程中始終沒有被訪問過,而是被跳了過去.分析可知,當n和k的最大公約數為p時,只要分別以A[0],A[1],...A[p-1]為起點執行上述算法,就可以保證每一個元素都被且僅被右移一次,從而滿足題目要求.也就是說,A的所有元素分別處在p個"循環鏈"上面.舉例如下:
n=15,k=6,則p=3.
第一條鏈:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].
第二條鏈:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].
第三條鏈:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].
恰好使所有元素都右移一次.
雖然未經數學證實,但作者相信上述規律應該是正確的.
5.19
void Get_Saddle(int A[m][n])//求矩陣A中的馬鞍點
{
  for(i=0;i<m;i++)
  {
    for(min=A[i][0],j=0;j<n;j++)
      if(A[i][j]<min) min=A[i][j]; //求一行中的最小值
    for(j=0;j<n;j++)
      if(A[i][j]==min) //判定這個(些)最小值是否鞍點
      {
        for(flag=1,k=0;k<m;k++)
          if(min<A[k][j]) flag=0;
        if(flag)
                }
  }//for
}//Get_Saddle
5.20
本題難度極大,故僅探討一下思路.這一題的難點在于,在多項式的元數m未知的情況下,如何按照降冪次序輸出各項.可以考慮采取類似于層序遍歷的思想,從最高次的項開始,依次對其每一元的次數減一,入一個隊列.附設訪問標志visited以避免重復.
5.21
void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)//三元組表示的稀疏矩陣加法
{
  C.mu=A.mu;C.nu=A.nu;C.tu=0;
  pa=1;pb=1;pc=1;
  for(x=1;x<=A.mu;x++) //對矩陣的每一行進行加法
  {
    while(A.data[pa].i<x) pa++;
    while(B.data[pb].i<x) pb++;
    while(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素
    {
      if(A.data[pa].j==B.data[pb].j)
      {
        ce=A.data[pa].e+B.data[pb].e;
        if(ce) //和不為0
        {
          C.data[pc].i=x;
          C.data[pc].j=A.data[pa].j;
          C.data[pc].e=ce;
          pa++;pb++;pc++;
        }
      }//if
      else if(A.data[pa].j>B.data[pb].j)
      {
        C.data[pc].i=x;
        C.data[pc].j=B.data[pb].j;
        C.data[pc].e=B.data[pb].e;
        pb++;pc++;
      }
      else
      {
        C.data[pc].i=x;
        C.data[pc].j=A.data[pa].j;
        C.data[pc].e=A.data[pa].e
        pa++;pc++;
      }
    }//while
    while(A.data[pa]==x) //插入A中剩余的元素(第x行)
    {
      C.data[pc].i=x;
      C.data[pc].j=A.data[pa].j;
      C.data[pc].e=A.data[pa].e
      pa++;pc++;
    }
    while(B.data[pb]==x) //插入B中剩余的元素(第x行)
    {
      C.data[pc].i=x;
      C.data[pc].j=B.data[pb].j;
      C.data[pc].e=B.data[pb].e;
      pb++;pc++;
    }
  }//for
  C.tu=pc;
}//TSMatrix_Add
5.22
void TSMatrix_Addto(TSMatrix &A,TSMatrix B)//將三元組矩陣B加到A上
{
  for(i=1;i<=A.tu;i++)
    A.data[MAXSIZE-A.tu+i]=A.data[i];/把A的所有元素都移到尾部以騰出位置
  pa=MAXSIZE-A.tu+1;pb=1;pc=1;
  for(x=1;x<=A.mu;x++) //對矩陣的每一行進行加法
  {
    while(A.data[pa].i<x) pa++;
    while(B.data[pb].i<x) pb++;
    while(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素
    {
      if(A.data[pa].j==B.data[pb].j)
      {
        ne=A.data[pa].e+B.data[pb].e;
        if(ne) //和不為0
        {
          A.data[pc].i=x;
          A.data[pc].j=A.data[pa].j;
          A.data[pc].e=ne;
          pa++;pb++;pc++;
        }
      }//if
      else if(A.data[pa].j>B.data[pb].j)
      {
        A.data[pc].i=x;
        A.data[pc].j=B.data[pb].j;
        A.data[pc].e=B.data[pb].e;
        pb++;pc++;
      }
      else
      {
        A.data[pc].i=x;
        A.data[pc].j=A.data[pa].j;
        A.data[pc].e=A.data[pa].e
        pa++;pc++;
      }
    }//while
    while(A.data[pa]==x) //插入A中剩余的元素(第x行)
    {
      A.data[pc].i=x;
      A.data[pc].j=A.data[pa].j;
      A.data[pc].e=A.data[pa].e
      pa++;pc++;
    }
    while(B.data[pb]==x) //插入B中剩余的元素(第x行)
    {
      A.data[pc].i=x;
      A.data[pc].j=B.data[pb


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东莞市| 乐都县| 土默特右旗| 青河县| 五华县| 木兰县| 沛县| 佳木斯市| 平利县| 淮南市| 扶沟县| 丹寨县| 张家川| 绥棱县| 区。| 财经| 万山特区| 延川县| 嵩明县| 甘南县| 渝北区| 大田县| 宜兰市| 尼木县| 翼城县| 云阳县| 中江县| 商南县| 北川| 建德市| 监利县| 肥东县| 开封市| 贵港市| 石屏县| 淮滨县| 湖州市| 织金县| 左云县| 湖北省| 义马市|