第五次大数据结构上机实验报告材料

第五次大数据结构上机实验报告材料
第五次大数据结构上机实验报告材料

图用0和1表示是否相邻,对于有向图有向网用权值类型表示

InfoType* info; //该弧相关信息的指针

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct {//点的值

char name;

char* data;

}VertexType[MAX_VERTEX_NUM];

typedef struct{

VertexType vexs; //顶点向量

AdjMatrix arcs; //邻接矩阵

int vexnum; //图的当前顶点数

int arcnum; //图的当前弧数

GraphKind kind; //图的种类标志

}MGraph;

//***********************以下操作默认是无向网,即Kind = AG**************************

//***********************顶点是名称字母。书上的是数字,例如v************************

Status LocateVex(MGraph G,char u){

if(G.vexnum == 0) return -1; //图不存在

int i;

for(i = 0;i < G.vexnum;i++)

if(G.vexs[i].name == u)

return i;

return -2; //图中不存在与u相等的点}

Status CreateGraph(MGraph& G){

int i,j,k;

VRType w;

char v1,v2;

char data[50];

cout << "你想要创建几个顶点? " << endl;

cin >> G.vexnum;

cout << "你想要创建几条弧? " << endl;

cin >> G.arcnum;

cout << "依次输入顶点名称:" << endl;

for(i = 0;i < G.vexnum;i++)

cin >> G.vexs[i].name; //构造顶点向量for(i = 0;i < G.vexnum;i++)

for(j = 0;j < G.vexnum;j++){

G.arcs[i][j].adj = INFINITY; //初始化邻接矩阵

G.arcs[i][j].info = NULL;

}

for(k = 0;k < G.arcnum;k++){ //构造邻接矩阵

cout << "输入一条边依附的两个顶点: ";

cin >> v1 >> v2;

cout << "输入这条边的权值: " << endl;

cin >> w;

cout << "输入这条边的信息: " << endl;

cin >> data;

i = LocateVex(G,v1);

j = LocateVex(G,v2);

G.arcs[i][j].adj = w;

G.arcs[i][j].info = data;

G.arcs[j][i] = G.arcs[i][j];

}

return 1;

}

Status DestroyGraph(MGraph& G){

G.vexnum = NULL;

G.arcnum = NULL;

return 1;

}

char* GetVex(MGraph G,char v){

if(G.vexnum == 0) return NULL;

int i;

i = LocateVex(G,v);

if(i >= 0) //判断是否是图上的顶点,后面的函数省略了这一步

return G.vexs[i].data;

else

return NULL;

}

Status PutVex(MGraph& G,char v,char* value){

if(G.vexnum == 0) return 0;

int i;

i = LocateVex(G,v);

G.vexs[i].data = value;

return 1;

}

//VertexType FirstAdjVex(MGraph G,char v) {}//返回第一个邻接顶点,邻接表操作

//VertexType NextAdjVex(MGraph G,char v,char w) {} //邻接表操作

Status InsertVex(MGraph& G,char v){

if(G.vexnum == 0) return 0;

int i;

G.vexs[G.vexnum].name = v;

G.vexnum++;

for(i = 0;i < G.vexnum;i++){

G.arcs[i][G.vexnum - 1].adj = INFINITY;

G.arcs[G.vexnum - 1][i].adj = INFINITY;

}

return 1;

}

Status DeleteVex(MGraph& G,char v){

if(G.vexnum == 0) return 0;

int i,j,k;

k = LocateVex(G,v);

for(i = 0,j = 0;i < G.vexnum;i++)

if(G.arcs[i][k].adj != INFINITY)

j++;

for(i = k;i < G.vexnum - 1;i++)

G.vexs[i] = G.vexs[i+1];

G.vexs[i].name = NULL;

G.vexs -> data = NULL;

G.vexnum--;

G.arcnum = G.arcnum - j;

return 1;

}

Status InsertArc(MGraph& G,char v,char w){ if(G.vexnum == 0) return 0;

int i,j;

VRType q;

char data[50];

i = LocateVex(G,v);

j = LocateVex(G,w);

cout << "输入这条边的权值: " << endl;

cin >> q;

cout << "输入这条边的信息: " << endl;

cin >> data;

G.arcs[i][j].adj = q;

G.arcs[i][j].info = data;

G.arcs[j][i] = G.arcs[i][j];

G.arcnum = G.arcnum + 2;

return 1;

}

Status DeleteArc(MGraph& G,char v,char w){

if(G.vexnum == 0) return 0;

int i,j;

i = LocateVex(G,v);

j = LocateVex(G,w);

G.arcs[i][j].adj = INFINITY;

G.arcs[i][j].info = NULL;

G.arcs[j][i] = G.arcs[i][j];

G.arcnum = G.arcnum - 2;

return 1;

}

Status Print(MGraph G){

int i,j;

for(i = 0;i < G.vexnum ;i++){

for(j = 0;j < G.vexnum ;j++)

cout << G.arcs [i][j].adj << " ";

cout << endl;

}

return 1;

}

int main()

{

int j;

char i,c,d;

MGraph G;

CreateGraph(G);

cout << "此时矩阵为: " << endl;

Print(G);

cout << "输入i::";

cin >> i;

j = LocateVex(G,i);

cout << "i为第"<< j+1 << "个顶点" << endl;

cout << "为两个点添加边,输入添加边的两个顶点: " << endl;

cin >> c >> d;

InsertArc(G,c,d);

cout << "此时矩阵为: " << endl;

Print(G);

DeleteArc(G,c,d);

cout << "添加顶点V;" << endl;

cout << "此时矩阵为: " << endl;

Print(G);

c = 'V';

InsertVex(G,c);

cout << "此时矩阵为: " << endl;

Print(G);

cout << "删除顶点B;" << endl;

d = 'B';

DeleteVex(G,d);

cout << "此时矩阵为: " << endl;

Print(G);

DestroyGraph(G);

return 0;

}

运行结果:

2、

题目:2. 哈夫曼树的建立。

算法思想:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

//初始化

for(i=0;i<2*n-1;i++){

HFMTree[i].weight=0;

HFMTree[i].parent=-1;

HFMTree[i].lchild=-1;

HFMTree[i].rchild=-1;

}

cout<<"请输入结点权值:"<

for(i=0;i

cin>>HFMTree[i].weight;

}

for(i=0;i

x1=x2=MAXVALUE;

m1=m2=0;

for(j=0;j

if(HFMTree[j].parent==-1&&HFMTree[j].weight

x2=x1;

m2=m1;

x1=HFMTree[j].weight;

m1=j;

}

else if(HFMTree[j].parent==-1&&HFMTree[j].weight

m2=j;

}

}

HFMTree[m1].parent=n+i;HFMTree[m2].parent=n+i;

HFMTree[n+i].weight=HFMTree[m1].weight+HFMTree[m2].weight; HFMTree[n+i].lchild=m1;

HFMTree[n+i].rchild=m2;

}

}

//转化编码

void createHFMCode(HNodeType HFMTree[],HCodeType HFMCode[]){ HCodeType cd;

int i,j,c,p;

for(i=0;i

cd.start=n-1;

c=i;

p=HFMTree[c].parent;

while(p!=-1)

{

if(HFMTree[p].lchild==c)cd.bit[cd.start]=0;

else cd.bit[cd.start]=1;

cd.start--;

c=p;

p=HFMTree[c].parent;

}

for(j=cd.start+1;j

HFMCode[i].bit[j]=cd.bit[j];

HFMCode[i].start=cd.start+1;

}

}

//主函数

int main()

{

int i,j;

//创建树

createHFMTree(HFMTree,n);

//转码

createHFMCode(HFMTree,HFMCode);

cout<

for(i=0;i

{

for(j=HFMCode[i].start;j<=n-1;j++) {

cout<

}

cout<

}

return 0;

}

运行结果:

相关主题
相关文档
最新文档