Angelialily 发表于 2013-2-5 02:23:44

实例 数组 广义表

1、
void RSh(int A,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;
    while(l!=i)
    {
      A=temp;
      temp=A;
      A=A;
      j=l;l=(j+k)%n;
    }// 循环右移一步
    A=temp;
}//for
}//RSh
分析:要把A的元素循环右移k位,则A移至A,A移至A......直到最终回到A.然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A,A,...A为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:
n=15,k=6,则p=3.
第一条链:A->A,A->A,A->A,A->A,A->A.
第二条链:A->A,A->A,A->A,A->A,A->A.
第三条链:A->A,A->A,A->A,A->A,A->A.
恰好使所有元素都右移一次.
2、------------------------------------
void Get_Saddle(int A)//求矩阵A中的马鞍点
{
for(i=0;i<m;i++)
{
    for(min=A,j=0;j<n;j++)
      if(A<min) min=A; //求一行中的最小值
    for(j=0;j<n;j++)
      if(A==min) //判断这个(些)最小值是否鞍点
      {
      for(flag=1,k=0;k<m;k++)
          if(min<A) flag=0;
      if(flag)
          printf("Found a saddle element!\nA[%d][%d]=%d",i,j,A);
      }
}//for
}//Get_Saddle
-----------------------------
3、
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.i<x) pa++;
    while(B.data.i<x) pb++;
    while(A.data.i==x&&B.data.i==x)//行列值都相等的元素
    {
      if(A.data.j==B.data.j)
      {
      ce=A.data.e+B.data.e;
      if(ce) //和不为0
      {
          C.data.i=x;
          C.data.j=A.data.j;
          C.data.e=ce;
          pa++;pb++;pc++;
      }
      }//if
      else if(A.data.j>B.data.j)
      {
      C.data.i=x;
      C.data.j=B.data.j;
      C.data.e=B.data.e;
      pb++;pc++;
      }
      else
      {
      C.data.i=x;
      C.data.j=A.data.j;
      C.data.e=A.data.e
      pa++;pc++;
      }
    }//while
    while(A.data==x) //插入A中剩余的元素(第x行)
    {
      C.data.i=x;
      C.data.j=A.data.j;
      C.data.e=A.data.e
      pa++;pc++;
    }
    while(B.data==x) //插入B中剩余的元素(第x行)
    {
      C.data.i=x;
      C.data.j=B.data.j;
      C.data.e=B.data.e;
      pb++;pc++;
    }
}//for
C.tu=pc;
}//TSMatrix_Add
---------------------------------
4、
void TSMatrix_Addto(TSMatrix &A,TSMatrix B)//将三元组矩阵B加到A上
{
for(i=1;i<=A.tu;i++)
    A.data=A.data;/把A的所有元素都移到尾部以腾出位置
pa=MAXSIZE-A.tu+1;pb=1;pc=1;
for(x=1;x<=A.mu;x++) //对矩阵的每一行进行加法
{
    while(A.data.i<x) pa++;
    while(B.data.i<x) pb++;
    while(A.data.i==x&&B.data.i==x)//行列值都相等的元素
    {
      if(A.data.j==B.data.j)
      {
      ne=A.data.e+B.data.e;
      if(ne) //和不为0
      {
          A.data.i=x;
          A.data.j=A.data.j;
          A.data.e=ne;
          pa++;pb++;pc++;
      }
      }//if
      else if(A.data.j>B.data.j)
      {
      A.data.i=x;
      A.data.j=B.data.j;
      A.data.e=B.data.e;
      pb++;pc++;
      }
      else
      {
      A.data.i=x;
      A.data.j=A.data.j;
      A.data.e=A.data.e
      pa++;pc++;
      }
    }//while
    while(A.data==x) //插入A中剩余的元素(第x行)
    {
      A.data.i=x;
      A.data.j=A.data.j;
      A.data.e=A.data.e
      pa++;pc++;
    }
    while(B.data==x) //插入B中剩余的元素(第x行)
    {
      A.data.i=x;
      A.data.j=B.data.j;
      A.data.e=B.data.e;
      pb++;pc++;
    }
}//for
A.tu=pc;
for(i=A.tu;i<MAXSIZE;i++) A.data={0,0,0}; //清除原来的A中记录
}//TSMatrix_Addto
---------------------------------
5、
typedef struct{
                  int j;
                  int e;
                  } DSElem;
typedef struct{
                DSElem data;
                int cpot;//这个向量存储每一行在二元组中的起始位置
                int mu,nu,tu;
            } DSMatrix; //二元组矩阵类型
Status DSMatrix_Locate(DSMatrix A,int i,int j,int &e)//求二元组矩阵的元素A的值e
{
for(s=cpot;s<cpot&&A.data.j!=j;s++);//注意查找范围
if(A.data.i==i&&A.data.j==j) //找到了元素A
{
    e=A.data;
    return OK;
}
return ERROR;
}//DSMatrix_Locate

---------------------------------
6、
typedef struct{
                  int seq; //该元素在以行为主序排列时的序号
                  int e;
                  } SElem;
typedef struct{
                  SElem data;
                  int mu,nu,tu;
                  } SMatrix; //单下标二元组矩阵类型
Status SMatrix_Locate(SMatrix A,int i,int j,int &e)//求单下标二元组矩阵的元素A的值e
{
s=i*A.nu+j+1;p=1;
while(A.data.seq<s) p++; //利用各元素seq值逐渐递增的特点
if(A.data.seq==s) //找到了元素A
{
    e=A.data.e;
    return OK;
}
return ERROR;
}//SMatrix_Locate
-----------------------------------
7、
typedef struct{
                  int mu,nu;
                  int elem;
                  bool map;
                  } BMMatrix; //用位图表示的矩阵类型
void BMMatrix_Add(BMMatrix A,BMMatrix B,BMMatrix &C)//位图矩阵的加法
{
C.mu=A.mu;C.nu=A.nu;
pa=1;pb=1;pc=1;
for(i=0;i<A.mu;i++) //每一行的相加
    for(j=0;j<A.nu;j++) //每一个元素的相加
    {
      if(A.map&&B.map&&(A.elem+B.elem))//结果不为0
      {
      C.elem=A.elem+B.elem;
      C.map=1;
      pa++;pb++;pc++;
      }
      else if(A.map&&!B.map)
      {
      C.elem=A.elem;
      C.map=1;
      pa++;pc++;
      }
      else if(!A.map&&B.map)
      {
      C.elem=B.elem;
      C.map=1;
      pb++;pc++;
      }
    }
}//BMMatrix_Add
----------------------------------
8、
void OLMatrix_Add(OLMatrix &A,OLMatrix B)//把十字链表表示的矩阵B加到A上
{
for(j=1;j<=A.nu;j++) cp=A.chead; //向量cp存储每一列当前最后一个元素的指针
for(i=1;i<=A.mu;i++)
{
    pa=A.rhead;pb=B.rhead;pre=NULL;
    while(pb)
    {
      if(pa==NULL||pa->j>pb->j) //新插入一个结点
      {
      p=(OLNode*)malloc(sizeof(OLNode));
      if(!pre) A.rhead=p;
      else pre->right=p;
      p->right=pa;pre=p;
      p->i=i;p->j=pb->j;p->e=pb->e; //插入行链表中
      if(!A.chead)
      {
          A.chead=p;
          p->down=NULL;
      }
      else
      {
          while(cp->down) cp=cp->down;
          p->down=cp->down;
          cp->down=p;
      }
      cp=p; //插入列链表中
      }//if
      else if(pa->j<pb->j)
      {
      pre=pa;
      pa=pa->right;
      } //pa右移一步
      else if(pa->e+pb->e)
      {
      pa->e+=pb->e;
      pre=pa;pa=pa->right;
      pb=pb->right;
      } //直接相加
      else
      {
      if(!pre) A.rhead=pa->right;
      else pre->right=pa->right;
      p=pa;pa=pa->right; //从行链表中删除
      if(A.chead==p)
          A.chead=cp=p->down;
      else cp->down=p->down; //从列链表中删除
      free (p);
      }//else
    }//while
}//for
}//OLMatrix_Add
--------------------------------------
9、void MPList_PianDao(MPList &L)//对广义表存储结构的多元多项式求第一变元的偏导
{
for(p=L->hp->tp;p&&p->exp;pre=p,p=p->tp)
{
    if(p->tag) Mul(p->hp,p->exp);
    else p->coef*=p->exp; //把指数乘在本结点或其下属结点上
    p->exp--;
}
pre->tp=NULL;
if(p) free (p); //删除可能存在的常数项
}//MPList_PianDao
void Mul(MPList &L,int x)//递归算法,对多元多项式L乘以x
{
for(p=L;p;p=p->tp)
{
    if(!p->tag) p->coef*=x;
    else Mul(p->hp,x);
}
}//Mul
-----------------------------
10、
void MPList_Add(MPList A,MPList B,MPList &C)//广义表存储结构的多项式相加的递归算法
{
C=(MPLNode*)malloc(sizeof(MPLNode));
if(!A->tag&&!B->tag) //原子项,可直接相加
{
    C->coef=A->coef+B->coef;
    if(!C->coef)
    {
      free(C);
      C=NULL;
    }
}//if
else if(A->tag&&B->tag) //两个多项式相加
{
    p=A;q=B;pre=NULL;
    while(p&&q)
    {
      if(p->exp==q->exp)
      {
      C=(MPLNode*)malloc(sizeof(MPLNode));
      C->exp=p->exp;
      MPList_Add(A->hp,B->hp,C->hp);
      pre->tp=C;pre=C;
      p=p->tp;q=q->tp;
      }
      else if(p->exp>q->exp)
      {
      C=(MPLNode*)malloc(sizeof(MPLNode));
      C->exp=p->exp;
      C->hp=A->hp;
      pre->tp=C;pre=C;
      p=p->tp;
      }
      else
      {
      C=(MPLNode*)malloc(sizeof(MPLNode));
      C->exp=q->exp;
      C->hp=B->hp;
      pre->tp=C;pre=C;
      q=q->tp;
      }
    }//while
    while(p)
    {
      C=(MPLNode*)malloc(sizeof(MPLNode));
      C->exp=p->exp;
      C->hp=p->hp;
      pre->tp=C;pre=C;
      p=p->tp;
    }
    while(q)
    {
      C=(MPLNode*)malloc(sizeof(MPLNode));
      C->exp=q->exp;
      C->hp=q->hp;
      pre->tp=C;pre=C;
      q=q->tp;
    } //将其同次项分别相加得到新的多项式,原理见第二章多项式相加一题
}//else if
else if(A->tag&&!B->tag) //多项式和常数项相加
{
    x=B->coef;
    for(p=A;p->tp->tp;p=p->tp);
    if(p->tp->exp==0) p->tp->coef+=x; //当多项式中含有常数项时,加上常数项
    if(!p->tp->coef)
    {
      free(p->tp);
      p->tp=NULL;
    }
    else
    {
      q=(MPLNode*)malloc(sizeof(MPLNode));
      q->coef=x;q->exp=0;
      q->tag=0;q->tp=NULL;
      p->tp=q;
    } //否则新建常数项,下同
}//else if
else
{
    x=A->coef;
    for(p=B;p->tp->tp;p=p->tp);
    if(p->tp->exp==0) p->tp->coef+=x;
    if(!p->tp->coef)
    {
      free(p->tp);
      p->tp=NULL;
    }
    else
    {
      q=(MPLNode*)malloc(sizeof(MPLNode));
      q->coef=x;q->exp=0;
      q->tag=0;q->tp=NULL;
      p->tp=q;
    }
}//else
}//MPList_Add
--------------------------------
11、
int GList_Equal(GList A,GList B)//判断广义表A和B是否相等,是则返回1,否则返回0
{ //广义表相等可分三种情况:
if(!A&&!B) return 1; //空表是相等的
if(!A->tag&&!B->tag&&A->atom==B->atom) return 1;//原子的值相等
if(A->tag&&B->tag)
    if(GList_Equal(A->ptr.hp,B->ptr.hp)&&GList_Equal(A->ptr.tp,B->ptr.tp))
      return 1; //表头表尾都相等
return 0;
}//GList_Equal
-------------------------------------
12、void GList_PrintList(GList A)//按标准形式输出广义表
{
if(!A) printf("()"); //空表
else if(!A->tag) printf("%d",A->atom);//原子
else
{
    printf("(");
    GList_PrintList(A->ptr.hp);
    if(A->ptr.tp)
    {
      printf(",");
      GList_PrintList(A->ptr.tp);
    } //只有当表尾非空时才需要打印逗号
    printf(")");
}//else
}//GList_PrintList
页: [1]
查看完整版本: 实例 数组 广义表