题目:
1. 已知稀疏矩阵采用三元组表压缩存储,试编写算法求稀疏矩阵中所有数的平均数。
2. 已知稀疏矩阵采用十字链表压缩存储,试编写算法求稀疏矩阵中所有数的平均数。。
3. 试编写算法比较两个广义表是否相等。
实现代码:
/*试编写算法比较两个广义表是否相等*/
#include <iostream>
#include <malloc.h>
using namespace std;
typedef char ElemType;
typedef struct lnode
{ int tag; //结点类型
union
{ ElemType data;
struct lnode *sublist;
} val;
struct lnode *link;//兄弟结点
} GLNode;
//创建
GLNode *CreateGL(char *&s)
{ GLNode *g;
char ch = *s++; //ch仍指向串的第一个字符,s指向下一个字符;
if (ch != '\0')
{ g = (GLNode *)malloc(sizeof(GLNode)); //创建一个新结点
if (ch == '(')
{ g->tag = 1;
g->val.sublist = CreateGL(s); //子表,这个结点作为新的头结点
}
else if (ch == ')')
g = NULL; //子表结束,g置为空
else if (ch == '#') //空表
g = NULL;
else
{ g->tag = 0;
g->val.data = ch;
}
}
else
g = NULL; //串结束
ch = *s++; //取下一个字符
if (g != NULL) //串未结束,继续构造兄递结点
{ if (ch == ',') //当前字符为','
g->link = CreateGL(s); //递归构造兄递结点
else //没有兄弟了,将兄弟指针置为NULL
g->link = NULL;
}
return g; //返回广义表g
}
//输出
void DispGL(GLNode *g)
{ if (g != NULL)
{ if (g->tag == 0)
cout << g->val.data;
else//为子表
{ cout << "(";
if (g->val.sublist == NULL) //空表
cout << "#";
else
DispGL(g->val.sublist);//非空子表递归输出
cout << ")";
}
if (g->link != NULL) //兄弟结点的内容
{ cout << ",";
DispGL(g->link); //递归输出后续表的内容
}
}
}
int equal(GLNode *g1, GLNode *g2)
{ int n = 1;
if (g1 == NULL && g2 == NULL)
return 1;
if (g1->tag == 0 && g2->tag == 0 && g1->val.data == g2->val.data)
n = n && equal(g1->link, g2->link); //递归继续判断兄弟结点,做与运算
else if (g1->tag == 1 && g2->tag == 1)
{ n = n && equal(g1->val.sublist, g2->val.sublist);
n = n && equal(g1->link, g2->link);
}
else
return 0;
}
int main()
{ GLNode *g1, *g2;
int flag;
char x[] = "(a,b,c,(d,e),(f,(#)))";
// char y[] = "(a,b,c,(d,e),(f,(#)))";
char y[] = "(a,b,c,(d,(e)))";
char *s1 = x, *s2 = y;
g1 = CreateGL(s1);
g2 = CreateGL(s2);
cout << "广义表1:";
DispGL(g1);
cout << endl;
cout << "广义表2:";
DispGL(g2);
cout << endl;
flag = equal(g1, g2);
cout << "是否相等?(0否1是)" << " " << flag << endl;
}