当前位置:   article > 正文

通过代码快速上手C语言数据结构-数组和广义表_广义表数据结构代码

广义表数据结构代码

5.1稀疏矩阵转置经典

5.2稀疏矩阵列序递增转置

  1. #include <malloc.h>
  2. #include <stdio.h>
  3. //#include "array.h"
  4. #define MAXSIZE 1000 /*非零元素的个数最多为1000*/
  5. #define ElementType int
  6. /*稀疏矩阵三元组表的类型定义*/
  7. #define MAXSIZE 1000 /*非零元素的个数最多为1000*/
  8. #define ElementType int
  9. /*稀疏矩阵三元组表的类型定义*/
  10. typedef struct
  11. {
  12. int row,col; /*该非零元素的行下标和列下标*/
  13. ElementType e; /*该非零元素的值*/
  14. }Triple;
  15. typedef struct
  16. {
  17. Triple data[MAXSIZE+1]; /* 非零元素的三元组表。data[0]未用*/
  18. int m,n,len; /*矩阵的行数、列数和非零元素的个数*/
  19. }TSMatrix;
  20. /*矩阵转置的经典算法*/
  21. /*"列序"递增转置法*/
  22. void TransposeTSMatrix(TSMatrix A,TSMatrix *B)
  23. { /*把矩阵A转置到B所指向的矩阵中去。矩阵用三元组表表示*/
  24. int i,j,k;
  25. B->m=A.n;
  26. B->n=A.m;
  27. B->len=A.len;
  28. if(B->len>0)
  29. {
  30. j=1; /*j为辅助计数器,记录转置后的三元组在三元组表B中的下标值*/
  31. for(k=1; k<=A.n; k++) /*扫描三元组表A 共k次,每次寻找列值为k的三元组进行转置*/
  32. for(i=1; i<=A.len; i++)
  33. if(A.data[i].col==k)
  34. {
  35. B->data[j].row=A.data[i].col;/*从头至尾扫描三元组表A,寻找col值为k的三元组进行转置*/
  36. B->data[j].col=A.data[i].row;
  37. B->data[j].e=A.data[i].e;
  38. j++; /*计数器j自加,指向下一个存放转置后三元组的下标*/
  39. }/*内循环中if的结束*/
  40. }/* if(B->len>0)的结束*/
  41. }/* end of TransposeTSMatrix */
  42. /*"按位快速转置"法*/
  43. void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)
  44. {
  45. /*基于矩阵的三元组表示,采用"按位快速转置"法,将矩阵A转置为矩阵B*/
  46. int col,t,p,q;
  47. int num[MAXSIZE], position[MAXSIZE];
  48. B->len=A.len;
  49. B->n=A.m;
  50. B->m=A.n;
  51. if(B->len)
  52. {
  53. for(col=1;col<=A.n;col++)
  54. num[col]=0;
  55. for(t=1;t<=A.len;t++)
  56. num[A.data[t].col]++; /*计算每一列的非零元素的个数*/
  57. position[1]=1;
  58. for(col=2;col<=A.n;col++) /*求col列中第一个非零元素在B.data[ ]中的正确位置*/
  59. position[col]=position[col-1]+num[col-1];
  60. for(p=1;p<=A.len;p++)/*将被转置矩阵的三元组表A从头至尾扫描一次,实现矩阵转置*/
  61. {
  62. col=A.data[p].col;
  63. q=position[col];
  64. B->data[q].row=A.data[p].col;
  65. B->data[q].col=A.data[p].row;
  66. B->data[q].e=A.data[p].e;
  67. position[col]++;/* position[col]加1,指向下一个列号为col的非零元素在三元组表B中的下标值*/
  68. }/*end of for*/
  69. }
  70. }
  71. #include <malloc.h>
  72. #include <stdio.h>
  73. //#include "array.h"
  74. #define MAXSIZE 1000 /*非零元素的个数最多为1000*/
  75. #define ElementType int
  76. /*稀疏矩阵三元组表的类型定义*/
  77. void main()
  78. {
  79. int i;
  80. int a[8]={1,1,3,3,4,5,6,6};
  81. int b[8]={2,3,1,6,3,2,1,4};
  82. int c[8]={12,9,-3,14,24,18,15,-7};
  83. TSMatrix A;
  84. TSMatrix *B;
  85. A.n=8;
  86. A.m=1;
  87. A.len=8;
  88. B=(TSMatrix *)malloc(sizeof(TSMatrix));
  89. for(i=0;i<8;i++)
  90. {
  91. A.data[i+1].row=a[i];
  92. A.data[i+1].col=b[i];
  93. A.data[i+1].e=c[i];
  94. }
  95. TransposeTSMatrix(A,B);
  96. for(i=1;i<=8;i++)
  97. {
  98. printf("%3d",B->data[i].row);
  99. }
  100. printf("\n");
  101. for(i=1;i<=8;i++)
  102. {
  103. printf("%3d",B->data[i].col);
  104. }
  105. printf("\n");
  106. for(i=1;i<=8;i++)
  107. {
  108. printf("%3d",B->data[i].e);
  109. }
  110. printf("\n");
  111. getchar();
  112. }
  113. void main()
  114. {
  115. int i;
  116. int a[8]={1,1,3,3,4,5,6,6};
  117. int b[8]={2,3,1,6,3,2,1,4};
  118. int c[8]={12,9,-3,14,24,18,15,-7};
  119. TSMatrix A;
  120. TSMatrix *B;
  121. A.n=8;
  122. A.m=1;
  123. A.len=8;
  124. B=(TSMatrix *)malloc(sizeof(TSMatrix));
  125. for(i=0;i<8;i++)
  126. {
  127. A.data[i+1].row=a[i];
  128. A.data[i+1].col=b[i];
  129. A.data[i+1].e=c[i];
  130. }
  131. TransposeTSMatrix(A,B);
  132. for(i=1;i<=8;i++)
  133. {
  134. printf("%3d",B->data[i].row);
  135. }
  136. printf("\n");
  137. for(i=1;i<=8;i++)
  138. {
  139. printf("%3d",B->data[i].col);
  140. }
  141. printf("\n");
  142. for(i=1;i<=8;i++)
  143. {
  144. printf("%3d",B->data[i].e);
  145. }
  146. printf("\n");
  147. getchar();
  148. }

 

5.3稀疏矩阵—次定位快速转置

  1. #include <malloc.h>
  2. #include <stdio.h>
  3. //#include "array.h"
  4. #define MAXSIZE 1000 /*非零元素的个数最多为1000*/
  5. #define ElementType int
  6. /*稀疏矩阵三元组表的类型定义*/
  7. #define MAXSIZE 1000 /*非零元素的个数最多为1000*/
  8. #define ElementType int
  9. /*稀疏矩阵三元组表的类型定义*/
  10. typedef struct
  11. {
  12. int row,col; /*该非零元素的行下标和列下标*/
  13. ElementType e; /*该非零元素的值*/
  14. }Triple;
  15. typedef struct
  16. {
  17. Triple data[MAXSIZE+1]; /* 非零元素的三元组表。data[0]未用*/
  18. int m,n,len; /*矩阵的行数、列数和非零元素的个数*/
  19. }TSMatrix;
  20. /*矩阵转置的经典算法*/
  21. /*"列序"递增转置法*/
  22. void TransposeTSMatrix(TSMatrix A,TSMatrix *B)
  23. { /*把矩阵A转置到B所指向的矩阵中去。矩阵用三元组表表示*/
  24. int i,j,k;
  25. B->m=A.n;
  26. B->n=A.m;
  27. B->len=A.len;
  28. if(B->len>0)
  29. {
  30. j=1; /*j为辅助计数器,记录转置后的三元组在三元组表B中的下标值*/
  31. for(k=1; k<=A.n; k++) /*扫描三元组表A 共k次,每次寻找列值为k的三元组进行转置*/
  32. for(i=1; i<=A.len; i++)
  33. if(A.data[i].col==k)
  34. {
  35. B->data[j].row=A.data[i].col;/*从头至尾扫描三元组表A,寻找col值为k的三元组进行转置*/
  36. B->data[j].col=A.data[i].row;
  37. B->data[j].e=A.data[i].e;
  38. j++; /*计数器j自加,指向下一个存放转置后三元组的下标*/
  39. }/*内循环中if的结束*/
  40. }/* if(B->len>0)的结束*/
  41. }/* end of TransposeTSMatrix */
  42. /*"按位快速转置"法*/
  43. void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)
  44. {
  45. /*基于矩阵的三元组表示,采用"按位快速转置"法,将矩阵A转置为矩阵B*/
  46. int col,t,p,q;
  47. int num[MAXSIZE], position[MAXSIZE];
  48. B->len=A.len;
  49. B->n=A.m;
  50. B->m=A.n;
  51. if(B->len)
  52. {
  53. for(col=1;col<=A.n;col++)
  54. num[col]=0;
  55. for(t=1;t<=A.len;t++)
  56. num[A.data[t].col]++; /*计算每一列的非零元素的个数*/
  57. position[1]=1;
  58. for(col=2;col<=A.n;col++) /*求col列中第一个非零元素在B.data[ ]中的正确位置*/
  59. position[col]=position[col-1]+num[col-1];
  60. for(p=1;p<=A.len;p++)/*将被转置矩阵的三元组表A从头至尾扫描一次,实现矩阵转置*/
  61. {
  62. col=A.data[p].col;
  63. q=position[col];
  64. B->data[q].row=A.data[p].col;
  65. B->data[q].col=A.data[p].row;
  66. B->data[q].e=A.data[p].e;
  67. position[col]++;/* position[col]加1,指向下一个列号为col的非零元素在三元组表B中的下标值*/
  68. }/*end of for*/
  69. }
  70. }
  71. void main()
  72. {
  73. int i;
  74. int a[8]={1,1,3,3,4,5,6,6};
  75. int b[8]={2,3,1,6,3,2,1,4};
  76. int c[8]={12,9,-3,14,24,18,15,-7};
  77. TSMatrix A;
  78. TSMatrix *B;
  79. A.n=8;
  80. A.m=1;
  81. A.len=8;
  82. B=(TSMatrix *)malloc(sizeof(TSMatrix));
  83. for(i=0;i<8;i++)
  84. {
  85. A.data[i+1].row=a[i];
  86. A.data[i+1].col=b[i];
  87. A.data[i+1].e=c[i];
  88. }
  89. FastTransposeTSMatrix(A,B);
  90. for(i=1;i<=8;i++)
  91. {
  92. printf("%3d",B->data[i].row);
  93. }
  94. printf("\n");
  95. for(i=1;i<=8;i++)
  96. {
  97. printf("%3d",B->data[i].col);
  98. }
  99. printf("\n");
  100. for(i=1;i<=8;i++)
  101. {
  102. printf("%3d",B->data[i].e);
  103. }
  104. getchar();
  105. }

 

5.4建立稀疏矩阵的十字链表

  1. /*建立稀疏矩阵的十字链表的算法*/
  2. //#include "crosslistarray.h"
  3. #include <malloc.h>
  4. #include <stdio.h>
  5. #define NULL 0;
  6. /*十字链表的结构类型定义如下:*/
  7. typedef struct OLNode
  8. {
  9. int row,col; /*非零元素的行和列下标*/
  10. int value;
  11. struct OLNode *right; /*非零元素所在行表、列表的后继链域*/
  12. struct OLNode *down;
  13. }OLNode,* OLink;
  14. typedef struct
  15. {
  16. OLink *row_head; /*行、列链表的头指针向量*/
  17. OLink *col_head;
  18. int m,n,len; /*稀疏矩阵的行数、列数、非零元素的个数*/
  19. }CrossList;
  20. void CreateCrossList(CrossList *M)
  21. {
  22. int m,n,t;
  23. OLNode *p,*q;
  24. int i,j,e;
  25. /*采用十字链表存储结构,创建稀疏矩阵M*/
  26. printf("输入M的行数,列数和非零元素的个数\n");
  27. scanf("%d,%d,%d",&m,&n,&t); /*输入M的行数,列数和非零元素的个数*/
  28. M->m=m;
  29. M->n=n;
  30. M->len=t;
  31. if(!(M->row_head=(OLink *)malloc((m+1)*sizeof(OLink))))
  32. printf("error");
  33. if(!(M->col_head=(OLink *)malloc((n+1)*sizeof(OLink))))
  34. printf("error");
  35. M->row_head=M->col_head=NULL; /*初始化行、列头指针向量,各行、列链表为空的链表*/
  36. printf("输入\n");
  37. for(scanf("%d,%d,%d",&i,&j,&e);i!=0;scanf("%d,%d,%d",&i,&j,&e))
  38. {
  39. if(!(p=(OLNode *)malloc(sizeof(OLNode))))
  40. printf("error");
  41. p->row=i;
  42. p->col=j;
  43. p->value=e; /*生成结点*/
  44. if(M->row_head[i]==NULL)
  45. M->row_head[i]=p;
  46. else
  47. {
  48. /*寻找行表中的插入位置*/
  49. for(q=M->row_head[i];q->right&&q->right->col<j;q=q->right); /*空循环体*/
  50. p->right=q->right;
  51. q->right=p; /*完成插入*/
  52. }
  53. if(M->col_head[j]==NULL)
  54. M->col_head[j]=p;
  55. else
  56. {
  57. /*寻找列表中的插入位置*/
  58. for(q=M->col_head[j];q->down&&q->down->row<i;q=q->down); /*空循环体*/
  59. p->down=q->down;
  60. q->down=p; /*完成插入*/
  61. }
  62. }
  63. }
  64. void main()
  65. {
  66. CrossList M;
  67. CreateCrossList(&M);
  68. }

 

5.5求广义表的表头

  1. /*求广义表的表头*/
  2. GList Head(GList L)
  3. {
  4. if(L==NULL)
  5. return(NULL); /* 空表无表头 */
  6. if(L->tag==ATOM)
  7. exit(0); /* 原子不是表 */
  8. else
  9. return(L->atom_htp.htp.hp);
  10. }

5.6求广义表的表尾

  1. /*求广义表的表尾*/
  2. GList Tail(GList L)
  3. {
  4. if(L==NULL)
  5. return(NULL); /* 空表无表尾 */
  6. if(L->tag==ATOM)
  7. exit(0); /* 原子不是表*/
  8. else
  9. return(L->atom_htp.htp.tp);
  10. }

5.7求广义表的长度

  1. int Length(GList L)
  2. {
  3. int n=0;
  4. GLNode *s;
  5. if(L==NULL)
  6. return(0); /* 空表长度为0 */
  7. if(L->tag==ATOM)
  8. exit(0); /* 原子不是表 */
  9. s=L;
  10. while(s!=NULL) /* 统计最上层表的长度 */
  11. {
  12. k++;
  13. s=s->atom_htp.htp.tp;
  14. }
  15. return(k);
  16. }

5.8求广义表的深度

  1. int Depth(GList L)
  2. {
  3. int d, max;
  4. GLNode *s;
  5. if(L==NULL)
  6. return(1); /* 空表深度为1 */
  7. if(L->tag==ATOM)
  8. return(0); /* 原子深度为0 */
  9. s=L;
  10. while(s!=NULL) /* 求每个子表的深度的最大值 */
  11. {
  12. d=Depth(s->atom_htp.htp.hp);
  13. if(d>max) max=d;
  14. s=s->atom_htp.htp.tp;
  15. }
  16. return(max+1); /* 表的深度等于最深子表的深度加1 */
  17. }

5.9-1统计广义表中原子数目方法

  1. int CountAtom(GList L)
  2. { /*求广义表L中原子结点数目,并返回原子结点数目值*/
  3. int n;
  4. GLNode *s;
  5. if(L==NULL)
  6. return(0); /* 空表中没有原子 */
  7. if(L->tag==ATOM)
  8. return(1); /* L指向单个原子 */
  9. s=L;
  10. n=0;
  11. while(s!=NULL) /* 求每个子表的原子数目之和 */
  12. {
  13. n=n+CountAtom(s->atom_htp.htp.hp);
  14. s=s->atom_htp.htp.tp;
  15. }
  16. return(n);
  17. }

5.9-2统计广义表中原子数目方法

  1. int CountAtom(GList L)
  2. {
  3. int n1, n2;
  4. if(L==NULL)
  5. return(0); /* 空表中没有原子 */
  6. if(L->tag==ATOM)
  7. return(1); /* L指向单个原子 */
  8. n1=CountAtom(L->atom_htp.htp.hp); /* 求表头中的原子数目 */
  9. n2=CountAtom(L->atom_htp.htp.tp); /* 求表尾中的原子数目 */
  10. return(n1+n2);
  11. }

5.10复制广义表

  1. int CopyGList(GList S, GList *T)
  2. {
  3. if(S==NULL)
  4. {
  5. *T=NULL;
  6. return(OK);
  7. } /* 复制空表 */
  8. *T=(GLNode *)malloc(sizeof(GLNode));
  9. if(*T==NULL)
  10. return(ERROR);
  11. (*T)->tag=S->tag;
  12. if(S->tag==ATOM)
  13. (*T)->atom=S->atom; /* 复制单个原子 */
  14. else
  15. {
  16. CopyGList(S->atom_htp.htp.hp, &((*T)->atom_htp.htp.hp)); /* 复制表头 */
  17. CopyGList(S->atom_htp.htp.tp, &((*T)->atom_htp.htp.tp)); /* 复制表尾 */
  18. }
  19. return(OK);
  20. }

 5.5-5.10

  1. //#include "seqstack.h"
  2. #define TRUE 1
  3. #define FALSE 0
  4. #define Stack_Size 50
  5. /*顺序栈-整型*/
  6. typedef struct
  7. {
  8. int elem[Stack_Size]; /*用来存放栈中元素的一维数组*/
  9. int top; /*用来存放栈顶元素的下标,top为-1表示栈是空栈*/
  10. }nStack;
  11. /*初始化*/
  12. void nInitStack(nStack *S)
  13. {
  14. /*构造一个空栈S*/
  15. S->top=-1;
  16. }
  17. /*判栈空*/
  18. int nIsEmpty(nStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
  19. {
  20. return(S->top==-1?TRUE:FALSE);
  21. }
  22. /*判栈满*/
  23. int nIsFull(nStack *S) /*判断栈S为满栈时返回值为真,反之为假*/
  24. {
  25. return(S->top==Stack_Size-1?TRUE:FALSE);
  26. }
  27. int nPush(nStack * S, int x)
  28. {
  29. if(S->top== Stack_Size-1) return(FALSE); /*栈已满*/
  30. S->top++;
  31. S->elem[S->top]=x;
  32. return(TRUE);
  33. }
  34. int nPop(nStack * S, int *x)
  35. { /* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
  36. if(S->top==-1) /*栈为空*/
  37. return(FALSE);
  38. else
  39. {
  40. *x= S->elem[S->top];
  41. S->top--; /* 修改栈顶指针 */
  42. return(TRUE);
  43. }
  44. }
  45. int nGetTop(nStack *S, int *x)
  46. { /* 将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变 */
  47. if(S->top==-1) /*栈为空*/
  48. return(FALSE);
  49. else
  50. {
  51. *x = S->elem[S->top];
  52. return(TRUE);
  53. }
  54. }
  55. /*顺序栈-字符型*/
  56. typedef struct
  57. {
  58. char elem[Stack_Size]; /*用来存放栈中元素的一维数组*/
  59. int top; /*用来存放栈顶元素的下标,top为-1表示栈是空栈*/
  60. }strStack;
  61. /*初始化*/
  62. void strInitStack(strStack *S)
  63. {
  64. /*构造一个空栈S*/
  65. S->top=-1;
  66. }
  67. /*判栈空*/
  68. int strIsEmpty(strStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
  69. {
  70. return(S->top==-1?TRUE:FALSE);
  71. }
  72. /*判栈满*/
  73. int strIsFull(strStack *S) /*判断栈S为满栈时返回值为真,反之为假*/
  74. {
  75. return(S->top==Stack_Size-1?TRUE:FALSE);
  76. }
  77. char strPush(strStack * S, char x)
  78. {
  79. if(S->top== Stack_Size-1) return(FALSE); /*栈已满*/
  80. S->top++;
  81. S->elem[S->top]=x;
  82. return(TRUE);
  83. }
  84. char strPop(strStack * S, char *x)
  85. { /* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
  86. if(S->top==-1) /*栈为空*/
  87. return(FALSE);
  88. else
  89. {
  90. *x= S->elem[S->top];
  91. S->top--; /* 修改栈顶指针 */
  92. return(TRUE);
  93. }
  94. }
  95. int strGetTop(strStack *S, char *x)
  96. { /* 将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变 */
  97. if(S->top==-1) /*栈为空*/
  98. return(FALSE);
  99. else
  100. {
  101. *x = S->elem[S->top];
  102. return(TRUE);
  103. }
  104. }
  105. /*功能函数*/
  106. int Match(char ch,char str)
  107. {
  108. if(ch=='('&&str==')')
  109. {
  110. return TRUE;
  111. }
  112. else if(ch=='['&&str==']')
  113. {
  114. return TRUE;
  115. }
  116. else if(ch=='{'&&str=='}')
  117. {
  118. return TRUE;
  119. }
  120. else return FALSE;
  121. }
  122. int In(char ch)
  123. {
  124. if(ch=='+')
  125. {
  126. return TRUE;
  127. }
  128. else if(ch=='-')
  129. {
  130. return TRUE;
  131. }
  132. else if(ch=='*')
  133. {
  134. return TRUE;
  135. }
  136. else if(ch=='/')
  137. {
  138. return TRUE;
  139. }
  140. else if(ch=='(')
  141. {
  142. return TRUE;
  143. }
  144. else if(ch==')')
  145. {
  146. return TRUE;
  147. }
  148. else if(ch=='#')
  149. {
  150. return TRUE;
  151. }
  152. else return FALSE;
  153. }
  154. char Compare(char x,char ch)
  155. {
  156. switch(x)
  157. {
  158. case '+':
  159. if(ch=='+'||ch=='-'||ch==')'||ch=='#')
  160. return '>';
  161. else if(ch=='*'||ch=='/'||ch=='(')
  162. return '<';
  163. break;
  164. case '-':
  165. if(ch=='+'||ch=='-'||ch==')'||ch=='#')
  166. return '>';
  167. else if(ch=='*'||ch=='/'||ch=='(')
  168. return '<';
  169. break;
  170. case '*':
  171. if(ch=='(')
  172. {
  173. return '<';
  174. }
  175. else
  176. {
  177. return '>';
  178. }
  179. break;
  180. case '/':
  181. if(ch=='(')
  182. return '<';
  183. else
  184. return '>';
  185. break;
  186. case '(':
  187. if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
  188. return '<';
  189. else if(ch==')')
  190. return '=';
  191. else if(ch=='#')
  192. return '0';
  193. break;
  194. case ')':
  195. if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#')
  196. return '>';
  197. else if(ch=='(')
  198. return '0';
  199. break;
  200. case '#':
  201. if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
  202. return '<';
  203. else if(ch=='#')
  204. return '=';
  205. else if(ch==')')
  206. return '0';
  207. break;
  208. default:
  209. return '0';
  210. break;
  211. }
  212. }
  213. int Execute(int a,char op,int b)
  214. {
  215. switch(op)
  216. {
  217. case '+':
  218. return (a+b);
  219. break;
  220. case '-':
  221. return (a-b);
  222. break;
  223. case '*':
  224. return (a*b);
  225. break;
  226. case '/':
  227. return (a/b);
  228. break;
  229. }
  230. }
  231. #include "stdio.h"
  232. #include <conio.h>
  233. /*求广义表的表头*/
  234. GList Head(GList L)
  235. {
  236. if(L==NULL)
  237. return(NULL); /* 空表无表头 */
  238. if(L->tag==ATOM)
  239. exit(0); /* 原子不是表 */
  240. else
  241. return(L->atom_htp.htp.hp);
  242. }
  243. /*求广义表的表尾*/
  244. GList Tail(GList L)
  245. {
  246. if(L==NULL)
  247. return(NULL); /* 空表无表尾 */
  248. if(L->tag==ATOM)
  249. exit(0); /* 原子不是表*/
  250. else
  251. return(L->atom_htp.htp.tp);
  252. }
  253. int Length(GList L)
  254. {
  255. int n=0;
  256. GLNode *s;
  257. if(L==NULL)
  258. return(0); /* 空表长度为0 */
  259. if(L->tag==ATOM)
  260. exit(0); /* 原子不是表 */
  261. s=L;
  262. while(s!=NULL) /* 统计最上层表的长度 */
  263. {
  264. k++;
  265. s=s->atom_htp.htp.tp;
  266. }
  267. return(k);
  268. }
  269. int Depth(GList L)
  270. {
  271. int d, max;
  272. GLNode *s;
  273. if(L==NULL)
  274. return(1); /* 空表深度为1 */
  275. if(L->tag==ATOM)
  276. return(0); /* 原子深度为0 */
  277. s=L;
  278. while(s!=NULL) /* 求每个子表的深度的最大值 */
  279. {
  280. d=Depth(s->atom_htp.htp.hp);
  281. if(d>max) max=d;
  282. s=s->atom_htp.htp.tp;
  283. }
  284. return(max+1); /* 表的深度等于最深子表的深度加1 */
  285. }
  286. int CountAtom(GList L)
  287. { /*求广义表L中原子结点数目,并返回原子结点数目值*/
  288. int n;
  289. GLNode *s;
  290. if(L==NULL)
  291. return(0); /* 空表中没有原子 */
  292. if(L->tag==ATOM)
  293. return(1); /* L指向单个原子 */
  294. s=L;
  295. n=0;
  296. while(s!=NULL) /* 求每个子表的原子数目之和 */
  297. {
  298. n=n+CountAtom(s->atom_htp.htp.hp);
  299. s=s->atom_htp.htp.tp;
  300. }
  301. return(n);
  302. }
  303. int CountAtom(GList L)
  304. {
  305. int n1, n2;
  306. if(L==NULL)
  307. return(0); /* 空表中没有原子 */
  308. if(L->tag==ATOM)
  309. return(1); /* L指向单个原子 */
  310. n1=CountAtom(L->atom_htp.htp.hp); /* 求表头中的原子数目 */
  311. n2=CountAtom(L->atom_htp.htp.tp); /* 求表尾中的原子数目 */
  312. return(n1+n2);
  313. }

马鞍点

  1. /*如果矩阵A中存在这样的一个元素A[i][j]满足条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的
  2. 元素,则称之为该矩阵的一个马鞍点。编写一个函数计算出1×n的矩阵A的所有马鞍点。
  3. 算法思想:依题意,先求出每行的最小值元素,放入min[m]之中,再求出每列的最大值元素,放入max[n]之中,若某
  4. 元素既在min[i]中,又在max[j]中,则该元素A[i][j]便是马鞍点,找出所有这样的元素,即找到了所有马鞍点。因此,
  5. 实现本题功能的程序如下:*/
  6. #include <stdio.h>
  7. #define m 3
  8. #define n 3
  9. void minmax(int a[m][n])
  10. {
  11. int i1,j,have=0;
  12. int min[m],max[n];
  13. for(i1=0;i1<m;i1++)/*计算出每行的最小值元素,放入min[m]之中*/
  14. {
  15. min[i1]=a[i1][0];
  16. for(j=1;j<n;j++)
  17. if(a[i1][j]<min[i1]) min[i1]=a[i1][j];
  18. }
  19. for(j=0;j<n;j++)/*计算出每列的最大值元素,放入max[n]之中*/
  20. {
  21. max[j]=a[0][j];
  22. for(i1=1;i1<m;i1++)
  23. if(a[i1][j]>max [j]) max[j]=a[i1][j];
  24. }
  25. for(i1=0;i1<m;i1++)
  26. for(j=0;j<n;j++)
  27. if(min[i1]==max[j])
  28. {
  29. printf("(%d,%d):%d\n",i1,j,a[i1][j]);
  30. have=1;
  31. }
  32. if(!have) printf("没有鞍点\n");
  33. }
  34. void main()
  35. {
  36. int a[m][n];
  37. int i,j;
  38. printf("请输入一个数组\n");
  39. for(i=0;i<m;i++)
  40. for(j=0;j<n;j++)
  41. scanf("%d",&a[i][j]);
  42. minmax(a);
  43. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/675133
推荐阅读
相关标签
  

闽ICP备14008679号