C++类霍夫曼树文本解码与编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define UNVISITED 0;
using namespace std;
template
class edge
{
public:
int start, end;
int weight; //start是边的始点,end是边的终点,weight是边的权重
edge();
edge(int st, int en, int w) //构造边(st,en),权重为w
{
start = st;
end = en;
weight = w;
}
bool operator >(edge oneedge); // 重载运算符>,通过边权重比较变的大小
bool operator <(edge oneedge); // 重载运算符<,通过边权重比较变的大小
};
template
class graph
{
public:
int vertexnum; //图顶点的数目
int edgenum; //图边的数目
int *mark; //标记某些顶点是否被访问过
EdgeType pro;
graph(){
vertexnum = 0;
edgenum = 0;
}
graph(int ver)
{
vertexnum = ver;
edgenum = 0;
mark = new int[vertexnum];
pro = new EdgeType[vertexnum];
for (int i = 0; i < vertexnum; i++)
{
mark[i] = UNVISITED;
}
}
virtual edge
virtual edge
bool isedge(edge
{
if (one.weight>0&& one.end >= 0)
return true;
else
return false;
}
};
template
class Agraph :public ::graph
{
private:
int **mat; //指向邻接矩阵的指针
public:
Agraph(){}
Agraph(int ver) :graph(ver)
{
int i, j;
mat = new int*[ver]; //申请ver大小的mat数组
for (i = 0; i < ver; i++)
mat[i] = new int[ver];
for (i = 0; i < ver; i++)
{
for (j = 0;; j < ver; j++)
mat[i][j] = 0;
}
}
edge
{
edge
tmp.start = one; //将one作为边的起点
for (int i = 0; i < vertexnum; i++)
{
if (mat[one][i] != 0)
{
tmp.end = i;
tmp.weight = mat[one][i];
break;
}
}
return tmp;
}
edge
{
edge
tmp.start = one.start;
for (int i = one.end + 1; i < ver; i++)
{
if (mat[one.start][i] != 0)
{
tmp.end = i;
tmp.weight = mat[one.start][i];
break;
}
}
return tmp;
}
void setedge(int start, int end, int weight)
{
if (mat[start][end] == 0)
{
edgenum++;
}
mat[start][end] = weight;
}
void deledge(int start, int end)
{
if (mat[start][end] != 0)
{
edgenum--;
}
mat[start][end] = 0;
}
void build()
{
EdgeType a;
/*cout << "输入要建的图的顶点个数:";
cin >> n;
Agraph(n);*/
cout << "输入顶点所包含的内容:";
for (int i = 0; i < vertexnum; i++)
{
cin >> a;
pro[i] = a;
}
cout << "建立个顶点之间的边:";
int i=0,j=0,n = 0;
while (i < 0 || j <0 || n < 0)
{
cout << "请依次输入起点
,终点和权重(当三者有一个为负数时结束!!)";
cin >> i >> j >> n;
setedge(i, j, n);
}
}
};
int main()
{
Agraph
a.build();
return 0;
}