`
Angelialily
  • 浏览: 241645 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

实例 数组 广义表

阅读更多
1、
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].
恰好使所有元素都右移一次.
2、------------------------------------
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)
          printf("Found a saddle element!\nA[%d][%d]=%d",i,j,A[i][j]);
      }
  }//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[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
---------------------------------
4、
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].j;
      A.data[pc].e=B.data[pb].e;
      pb++;pc++;
    }
  }//for
  A.tu=pc;
  for(i=A.tu;i<MAXSIZE;i++) A.data[i]={0,0,0}; //清除原来的A中记录
}//TSMatrix_Addto
---------------------------------
5、
typedef struct{
                    int j;
                    int e;
                  } DSElem;
typedef struct{
                DSElem data[MAXSIZE];
                int cpot[MAXROW];//这个向量存储每一行在二元组中的起始位置
                int mu,nu,tu;
              } DSMatrix; //二元组矩阵类型
Status DSMatrix_Locate(DSMatrix A,int i,int j,int &e)//求二元组矩阵的元素A[i][j]的值e
{
  for(s=cpot[i];s<cpot[i+1]&&A.data[s].j!=j;s++);//注意查找范围
  if(A.data[s].i==i&&A.data[s].j==j) //找到了元素A[i][j]
  {
    e=A.data[s];
    return OK;
  }
  return ERROR;
}//DSMatrix_Locate

---------------------------------
6、
typedef struct{
                    int seq; //该元素在以行为主序排列时的序号
                    int e;
                  } SElem;
typedef struct{
                    SElem data[MAXSIZE];
                    int mu,nu,tu;
                  } SMatrix; //单下标二元组矩阵类型
Status SMatrix_Locate(SMatrix A,int i,int j,int &e)//求单下标二元组矩阵的元素A[i][j]的值e
{
  s=i*A.nu+j+1;p=1;
  while(A.data[p].seq<s) p++; //利用各元素seq值逐渐递增的特点
  if(A.data[p].seq==s) //找到了元素A[i][j]
  {
    e=A.data[p].e;
    return OK;
  }
  return ERROR;
}//SMatrix_Locate
-----------------------------------
7、
typedef struct{
                    int mu,nu;
                    int elem[MAXSIZE];
                    bool map[mu][nu];
                  } 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[i][j]&&B.map[i][j]&&(A.elem[pa]+B.elem[pb]))//结果不为0
      {
        C.elem[pc]=A.elem[pa]+B.elem[pb];
        C.map[i][j]=1;
        pa++;pb++;pc++;
      }
      else if(A.map[i][j]&&!B.map[i][j])
      {
        C.elem[pc]=A.elem[pa];
        C.map[i][j]=1;
        pa++;pc++;
      }
      else if(!A.map[i][j]&&B.map[i][j])
      {
        C.elem[pc]=B.elem[pb];
        C.map[i][j]=1;
        pb++;pc++;
      }
    }
}//BMMatrix_Add
----------------------------------
8、
void OLMatrix_Add(OLMatrix &A,OLMatrix B)//把十字链表表示的矩阵B加到A上
{
  for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针
  for(i=1;i<=A.mu;i++)
  {
    pa=A.rhead[i];pb=B.rhead[i];pre=NULL;
    while(pb)
    {
      if(pa==NULL||pa->j>pb->j) //新插入一个结点
      {
        p=(OLNode*)malloc(sizeof(OLNode));
        if(!pre) A.rhead[i]=p;
        else pre->right=p;
        p->right=pa;pre=p;
        p->i=i;p->j=pb->j;p->e=pb->e; //插入行链表中
        if(!A.chead[p->j])
        {
          A.chead[p->j]=p;
          p->down=NULL;
        }
        else
        {
          while(cp[p->j]->down) cp[p->j]=cp[p->j]->down;
          p->down=cp[p->j]->down;
          cp[p->j]->down=p;
        }
        cp[p->j]=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[i]=pa->right;
        else pre->right=pa->right;
        p=pa;pa=pa->right; //从行链表中删除
        if(A.chead[p->j]==p)
          A.chead[p->j]=cp[p->j]=p->down;
        else cp[p->j]->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


0
0
分享到:
评论

相关推荐

    数据机构第五章数组和广义表

    数据结构是计算机科学中的...第五章的PPT应该会深入讲解数组和广义表的定义、操作、优缺点以及实例应用,帮助读者深化对这两个概念的理解。建议结合PPT内容进行深入学习和实践,以提升自己的编程能力和问题解决能力。

    数据结构实验报告-数组与广义表-基于十字链表的稀疏矩阵转置5%(第8周完成)-实验内容及要求.docx

    在本实验中,采用了带总头节点、行头结点数组和列头结点数组的十字链表结构来表示稀疏矩阵。每个结点包含四个字段:行号、列号、数值域以及行指针和列指针,用于快速访问逻辑上相邻的结点。此外,还使用一个三元组来...

    第五章 数组和广义表(2).pdf

    - 课堂练习主要通过实例演示了如何获取广义表的表头和表尾,加深了对广义表操作的理解。 总结来说,数组和广义表是两种基本的数据结构,各有其特点和适用场景。数组具有固定的存储方式和高效的元素访问效率,适用...

    高一凡代码-第5章 数组和广义表.rar

    在"高一凡代码-第5章 数组和广义表.rar"这个压缩包中,你将找到关于数组和广义表的详细讲解和实例代码。通过学习这些材料,你可以掌握如何在实际编程中有效地利用这两种数据结构,提高编程效率和问题解决能力。对于...

    数据结构实验报告-数组与广义表-用顺序存储的半三角矩阵生成杨辉三角形5分-实验内容及要求.docx

    本次实验通过对杨辉三角形的生成与输出,不仅巩固了学生对于数组与广义表等基础数据结构的理解,还加深了对半三角矩阵存储方式的认识。通过实际编程实现了对这些理论知识的应用,有助于提高学生的编程能力和解决问题...

    数据结构实例教程(C语言版):第5章 二维数组及广义表的结构分析.ppt

    本篇教程聚焦于二维数组和广义表这两种重要数据结构的结构分析。 首先,二维数组可以被视为由多个一维数组(行或列向量)组成。存储结构分为行优先和列优先两种方式。行优先存储时,数组元素按行依次排列;而列优先...

    数据结构数组串广义表PPT学习教案.pptx

    在这个PPT学习教案中,主要探讨了三个重要的数据结构:数组、串和广义表。这些概念是编程语言的基础,尤其是在处理大量数据时显得尤为重要。 数组是一种线性数据结构,它将相同类型的数据元素以连续的内存位置存储...

    递归与广义表1

    标题中提到的“递归与广义表1”可能是指一个关于如何使用递归来处理数组和广义表的讨论,虽然广义表在这段代码中并未直接涉及,但我们可以看到递归在处理数组中的应用。 描述中提到了三个问题: 1. 求数组A中的最大...

    数据结构答案第4章.doc

    本章主要讨论了两种特定类型的数据结构:多维数组和广义表,这些都是在编程中广泛使用的数据结构。 首先,数组是一种基本的数据结构,它是由相同类型的数据元素构成的固定大小的序列。在标题中提到的“广义线性表...

    特殊矩阵广义表及其应用PPT课件.pptx

    矩阵的行和列也可以看作是一维数组,因此矩阵可以视为二维数组的实例。矩阵的运算包括加法、减法、乘法(矩阵乘法)以及一些特定的矩阵运算,如转置、求逆等。 在计算机中,数组的存储结构通常是顺序的,即元素在...

    数据结构课件完整的

    例如,“第5章 数组与广义表.ppt”可能会深入探讨数组和广义表的定义、操作、优缺点以及实例;“第3章 栈和队列(6学时).ppt”则可能涵盖栈和队列的理论知识、常见算法以及相关的编程实现;“第4章 串.ppt”可能...

    数据结构讲义[chm格式]

    章节目录:线性表 栈和队列 串 多维数组 广义表 树 图 排序 查找 文件 1线性表: 线性表的逻辑结构 逻辑结构 顺序存储结构 顺序表 顺序表上的基本运算 链式存储结构 单链表 单链表的运算 循环链表 双链表 顺序表和...

    数据结构实例

    数据结构实例通常包括实际问题的解决方案,通过代码来展示不同的数据结构(如线性表、栈、队列、串、数组、广义表、树、二叉树、图等)的应用。 线性表是最基础的数据结构之一,如学生成绩管理和考试报名管理,它们...

    【Java数据结构与算法】稀疏数组

    文章目录数据结构类型线性结构与非线性结构稀疏数组实例应用二维数组转稀疏数组的思路稀疏数组转原始的二维数组思路 数据结构类型 数据结构包括:线性结构和非...非线性结构包括:二维数组,多维数组,广义表,树结构,

    C程序范例宝典(基础代码详解)

    实例109 广义表的复制 156 3.5 二叉树 160 实例110 二叉树的递归创建 160 实例111 二叉树的遍历 162 实例112 线索二叉树的创建 164 实例113 二叉排序树 166 实例114 哈夫曼编码 167 3.6 图及图的应用...

    数据结构(c语言版)课件

    2. **数组与广义表**:数组可以看作是一维线性表,广义表则是其推广,可以处理具有复杂结构的数据。广义表不仅包含单个元素,还可以包含其他广义表,形成多级嵌套结构。 3. **树与二叉树**:树是一种非线性的数据...

    《数据结构》课程教学大纲.doc

    课程涵盖了多种数据结构,如线性表、栈、队列、串、数组、广义表、树和二叉树,以及与之相关的算法设计和效率分析。 一、课程基本信息 这门课程是计算机相关专业的必修课,适用于计算机科学与技术、软件工程、网络...

Global site tag (gtag.js) - Google Analytics