[键入文字]
数 据 结 构
实验报告
姓 名: 邱金梁
班 级: rJBJava101
学 号: [1**********]7
指导老师: 杨 关
时 间: 2012年6月13日
一 、最小生成树
#include//头文件 using namespace std;
#define MAX_VERTEX_NUM 20//最大结点数 #define MAX 200
typedef struct Close//结构体 {
char adjvex; int lowcost;
}Close,close[MAX_VERTEX_NUM]; typedef struct ArcNode {
int adjvex; ArcNode *nextarc; int info; }ArcNode;
typedef struct VNode { char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct {
AdjList verties; int vexnum,arcnum;
}ALGraph;
ALGraph G;//对象G
int LocateVek(ALGraph ,char );//返回结点位置 int minimum(close);//返回最小数
void MinSpanTree_PRIM(ALGraph,char);//最小生成树 void Create(ALGraph &);//创建邻接表 int main() { char a;int i=1; Create(G);
/*for(int i=1;i
for(s=G.verties[i].firstarc;s!=NULL;s=s->nextarc)
coutadjvex].datainfo
}*/
while(i)
{ cout>a; MinSpanTree_PRIM(G,a);
cout>i; } return 0; }
int LocateVek(ALGraph G,char u) {
int i; for(i=1;i
if(u==G.verties[i].data)
return i;
return -1; }
int minimum(close m)//返回最小数 { int i=0,j,n=200;
for(i=1;i
}
j=i;
return j; }
void MinSpanTree_PRIM(ALGraph G,char u) { int j,k,a;
close closedge;ArcNode *s,*p,*q; for(j=1;j
closedge[j].lowcost=MAX;//把所有值都赋为最大 k=LocateVek(G,u); for(j=1;j
if(j!=k)
{
closedge[j].adjvex=u;
for(s=G.verties[k].firstarc;s!=NULL;s=s->nextarc) if(j==s->adjvex)
{closedge[j].lowcost=s->info; break;
}
}
closedge[k].lowcost=0;
cout
k=minimum(closedge);
cout
for(p=G.verties[k].firstarc;p!=NULL;p=p->nextarc) if(p->infoadjvex) { }
closedge[i].adjvex=G.verties[k].data; closedge[i].lowcost=p->info;
}cout
cout=1;j--) { if(closedge[j].lowcost==0&&G.verties[j].data!=u) { cout
a=closedge[j].adjvex; for(q=G.verties[j].firstarc;q!=NULL;q=q->nextarc) if(a-64==q->adjvex) }
coutinfo
void Create(ALGraph &G) {
int i,j,k,x;
char a,b;ArcNode *s; cout>G.vexnum; cout
cin>>G.arcnum; cout
cin>>G.verties[i].data; G.verties[i].firstarc=NULL; } for(i=1;i
}
cout>a>>b;cin>>x;
j=a-64;k=b-64;//将字符型转化成整数型 s=new ArcNode; s->info=x; s->adjvex=k;
s->nextarc=G.verties[j].firstarc; G.verties[j].firstarc=s; s=new ArcNode; s->info=x;
s->adjvex=j;
s->nextarc=G.verties[k].firstarc; G.verties[k].firstarc=s;
二、最短路径
#include #include #include #include using namespace std;
enum Mark {UNVISITED,VISITED};
typedef struct DocuNode {
int n; Mark m; } DocuNode;
typedef struct Docu { int n;
DocuNode * Node; int** edge; } Docu;
Mark getMark(Docu*D , int i) {
return D->Node[i].m; }
void setMark(Docu*D,int v,Mark m) {
D->Node[v].m=m; }
int first(Docu*D , int v) {
int i;
for(i=0 ; in ; i++) if((D->edge[v][i])!=-1) return i; return i; }
int next(Docu*D , int v , int w) {
int i;
for(i=w+1 ; in ; i++) if((D->edge[v][i])!=-1) return i; return i; }
int weight(Docu*D,int v,int w) {
return D->edge[v][w]; }
int minV ertex(Docu*D , int *B) {
int i , v;
for(i=0; in; i++)
if(getMark(D,i)==UNVISITED) { v=i;
break; }
for(i++; in; i++)
if(getMark(D,i)==UNVISITED&&((((B[i]
return v; }
void Dijkstra(Docu*D , int *B , int s) {
int i,v,w;
for(i=0; in; i++) {
v=minVertex(D,B); if(B[v]==-1) return;
setMark(D,v,VISITED);
for(w=first(D,v); wn; w=next(D,v,w)) if((B[w]>(B[v]+weight(D,v,w)))||(B[w]==-1)) B[w]=B[v]+weight(D,v,w); } }
int main()
{
Docu* D;
ifstream fin("Docu.txt"); int i , j;
D=(Docu*)malloc(sizeof(Docu)); fin>>D->n;//从文件中读取节点数
D->Node=(DocuNode*)malloc(sizeof(DocuNode));
for(i=0 ; in ; i++)
D->Node[i].m=UNVISITED; //将所有节点设为未被访问的
D->edge=(int**)calloc(1,sizeof(int*)*D->n); if(!D->edge) //若内存未分配成功 coutn ; i++)
{
D->edge[i]=(int*)calloc(1,sizeof(int)*D->n); if(!D->edge[i]) //若内存未分配成功 cout
for(i=0 ; in ; i++)
for(j=0 ; jn ; j++)
fin>>D->edge[i][j]; //从文件中读取边权值
int start , end;
cout>start;
cout>end;
int *B;
B=(int *)malloc(D->n*sizeof(int));
for(i=0 ; in ; i++) B[i]=D->edge[start][i];
Dijkstra(D,B,start);
cout
}
[键入文字]
数 据 结 构
实验报告
姓 名: 邱金梁
班 级: rJBJava101
学 号: [1**********]7
指导老师: 杨 关
时 间: 2012年6月13日
一 、最小生成树
#include//头文件 using namespace std;
#define MAX_VERTEX_NUM 20//最大结点数 #define MAX 200
typedef struct Close//结构体 {
char adjvex; int lowcost;
}Close,close[MAX_VERTEX_NUM]; typedef struct ArcNode {
int adjvex; ArcNode *nextarc; int info; }ArcNode;
typedef struct VNode { char data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct {
AdjList verties; int vexnum,arcnum;
}ALGraph;
ALGraph G;//对象G
int LocateVek(ALGraph ,char );//返回结点位置 int minimum(close);//返回最小数
void MinSpanTree_PRIM(ALGraph,char);//最小生成树 void Create(ALGraph &);//创建邻接表 int main() { char a;int i=1; Create(G);
/*for(int i=1;i
for(s=G.verties[i].firstarc;s!=NULL;s=s->nextarc)
coutadjvex].datainfo
}*/
while(i)
{ cout>a; MinSpanTree_PRIM(G,a);
cout>i; } return 0; }
int LocateVek(ALGraph G,char u) {
int i; for(i=1;i
if(u==G.verties[i].data)
return i;
return -1; }
int minimum(close m)//返回最小数 { int i=0,j,n=200;
for(i=1;i
}
j=i;
return j; }
void MinSpanTree_PRIM(ALGraph G,char u) { int j,k,a;
close closedge;ArcNode *s,*p,*q; for(j=1;j
closedge[j].lowcost=MAX;//把所有值都赋为最大 k=LocateVek(G,u); for(j=1;j
if(j!=k)
{
closedge[j].adjvex=u;
for(s=G.verties[k].firstarc;s!=NULL;s=s->nextarc) if(j==s->adjvex)
{closedge[j].lowcost=s->info; break;
}
}
closedge[k].lowcost=0;
cout
k=minimum(closedge);
cout
for(p=G.verties[k].firstarc;p!=NULL;p=p->nextarc) if(p->infoadjvex) { }
closedge[i].adjvex=G.verties[k].data; closedge[i].lowcost=p->info;
}cout
cout=1;j--) { if(closedge[j].lowcost==0&&G.verties[j].data!=u) { cout
a=closedge[j].adjvex; for(q=G.verties[j].firstarc;q!=NULL;q=q->nextarc) if(a-64==q->adjvex) }
coutinfo
void Create(ALGraph &G) {
int i,j,k,x;
char a,b;ArcNode *s; cout>G.vexnum; cout
cin>>G.arcnum; cout
cin>>G.verties[i].data; G.verties[i].firstarc=NULL; } for(i=1;i
}
cout>a>>b;cin>>x;
j=a-64;k=b-64;//将字符型转化成整数型 s=new ArcNode; s->info=x; s->adjvex=k;
s->nextarc=G.verties[j].firstarc; G.verties[j].firstarc=s; s=new ArcNode; s->info=x;
s->adjvex=j;
s->nextarc=G.verties[k].firstarc; G.verties[k].firstarc=s;
二、最短路径
#include #include #include #include using namespace std;
enum Mark {UNVISITED,VISITED};
typedef struct DocuNode {
int n; Mark m; } DocuNode;
typedef struct Docu { int n;
DocuNode * Node; int** edge; } Docu;
Mark getMark(Docu*D , int i) {
return D->Node[i].m; }
void setMark(Docu*D,int v,Mark m) {
D->Node[v].m=m; }
int first(Docu*D , int v) {
int i;
for(i=0 ; in ; i++) if((D->edge[v][i])!=-1) return i; return i; }
int next(Docu*D , int v , int w) {
int i;
for(i=w+1 ; in ; i++) if((D->edge[v][i])!=-1) return i; return i; }
int weight(Docu*D,int v,int w) {
return D->edge[v][w]; }
int minV ertex(Docu*D , int *B) {
int i , v;
for(i=0; in; i++)
if(getMark(D,i)==UNVISITED) { v=i;
break; }
for(i++; in; i++)
if(getMark(D,i)==UNVISITED&&((((B[i]
return v; }
void Dijkstra(Docu*D , int *B , int s) {
int i,v,w;
for(i=0; in; i++) {
v=minVertex(D,B); if(B[v]==-1) return;
setMark(D,v,VISITED);
for(w=first(D,v); wn; w=next(D,v,w)) if((B[w]>(B[v]+weight(D,v,w)))||(B[w]==-1)) B[w]=B[v]+weight(D,v,w); } }
int main()
{
Docu* D;
ifstream fin("Docu.txt"); int i , j;
D=(Docu*)malloc(sizeof(Docu)); fin>>D->n;//从文件中读取节点数
D->Node=(DocuNode*)malloc(sizeof(DocuNode));
for(i=0 ; in ; i++)
D->Node[i].m=UNVISITED; //将所有节点设为未被访问的
D->edge=(int**)calloc(1,sizeof(int*)*D->n); if(!D->edge) //若内存未分配成功 coutn ; i++)
{
D->edge[i]=(int*)calloc(1,sizeof(int)*D->n); if(!D->edge[i]) //若内存未分配成功 cout
for(i=0 ; in ; i++)
for(j=0 ; jn ; j++)
fin>>D->edge[i][j]; //从文件中读取边权值
int start , end;
cout>start;
cout>end;
int *B;
B=(int *)malloc(D->n*sizeof(int));
for(i=0 ; in ; i++) B[i]=D->edge[start][i];
Dijkstra(D,B,start);
cout
}