| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 753 人关注过本帖
标题:[开源]我的图结构
只看楼主 加入收藏
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
 问题点数:0 回复次数:3 
[开源]我的图结构
节点只能输入大写字母如:ABC输入完毕按两次回车。不知道怎样能改好(请大家指点一下)
搜索更多相关主题的帖子: 结构 开源 节点 ABC 字母 
2007-06-14 12:47
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
得分:0 

#include "stdio.h"
#include "malloc.h"
#define OK 0
#define TRUE 1
#define MAX 20
#define FALSE 0
#define OVERFLOW 0
typedef char VertexType;
typedef int InfoType;
typedef int VRType;

typedef struct ArcCell{
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix;

typedef struct {
VertexType vex[MAX];
AdjMatrix arcs[MAX][MAX];
int vexnum,arcnum;
}MGraph; // 邻接矩阵


typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode;

typedef struct{
VNode vertices[MAX];
int arcnum,vexnum;
}ALGraph,*ALG; //邻接表

int visit[MAX]={0};

/*****************************函数定义*************************************/
//邻接表
void Createadj(ALG &p,MGraph g) //邻接表结构
{
int i,j;
ArcNode *q;
p=(ALGraph *)malloc(sizeof(ALGraph)); //创建首元素
p->vexnum=g.vexnum; //存入点个数
for(i=0;i<p->vexnum;i++)
{
p->vertices[i].firstarc=0; //将点的表示记录如邻接表
p->vertices[i].data=g.vex[i];


}


for(i=0;i<p->vexnum;i++)

for(j=p->vexnum-1;j>=0;j--)
{
if(g.arcs[i][j].adj!=0)
{
q=(ArcNode *)malloc(sizeof(ArcNode)); //每次将新加入的点添加在头部
q->adjvex=j;
q->nextarc=p->vertices[i].firstarc;
p->vertices[i].firstarc=q;
p->arcnum++;
}
}

}


void displayALGraph(ALG G) //邻接表的显示
{
ArcNode *p;
int i;
char d;
printf("\n以下为邻接表\n");
for(i=0;i<G->vexnum;i++)
{
printf("%c -> ",G->vertices[i].data); //显示头节点的值

p=G->vertices[i].firstarc;
while(p!=NULL) //////////有问题
{
d=p->adjvex+'A';
printf("%c -> ",d); //显示下一个元素
p=p->nextarc;
}
printf("\n");
}
printf("\n");
}

void DFS(ALG g,int v)
{
ArcNode *p;
char show=v+'A';
visit[v]=1;
printf("%c",show);
p=g->vertices[v].firstarc;
while(p!=0){
if(visit[p->adjvex]==0)
DFS(g,p->adjvex);
p=p->nextarc;
}
}

//////////////////////////////////////////////////////////////////////
//临界矩阵
int CreatUDN(MGraph &G)
{
char v1,v2;
int i,j,k,w;
printf("请输入有向网的节点,弧的个数\n");
scanf("%d",&G.vexnum);
printf("\n");
scanf("%d",&G.arcnum);
printf("请输入定点向量\n"); //输入节点的名字如A,B,C
for(i=0;i<G.vexnum;i++)
{
scanf("%s",G.vex);
getchar();
break;

}

for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j].adj=0; //对所有节点初始化
for(k=0;k<G.arcnum;k++)
{
printf("输入对应一条边以及依附的节点\n"); //输入依附的一条边及节点
printf("头为\n");
scanf("%c",&v1);
getchar();
printf("尾为\n");
scanf("%c",&v2);
getchar();
printf("权值为\n");
scanf("%d",&w);
getchar();
i=v1-'A'; //相当于取得节点在数组中的位置loacate()
j=v2-'A'; //相当于取得节点在数组中的位置loacate()
G.arcs[i][j].adj=w;
G.arcs[j][i]=G.arcs[i][j]; //无向图是对称的如果是有向图就去掉这句
}
return OK;
}

void displayMGraph(MGraph G)
{
char c,d;
int i,j;

for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
printf("%d",G.arcs[i][j].adj); //以矩阵的形式输出联系关系
printf("\n");
}
printf("\n");
printf("以下为指向关系\n");
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
if(G.arcs[i][j].adj!=0)
{
c=i+'A'; //以A->B的形式输出链接关系
d=j+'A';
printf("%c -> %c %d\n",c,d,G.arcs[i][j].adj);
}
}

////////////////////////////////////////////////////////////////////////////////////

//函数结束
int main()
{
MGraph a;
ALG g;
/* int j;
printf("请输入要创建的结构(1)无向图\n(2)有向图\n(3)无向网\n(4)有向网\n");
scanf("%d",&j);*/
CreatUDN(a);
displayMGraph(a);
printf("%s",a.vex);//OK

Createadj(g,a);
displayALGraph(g);
printf("\n");
printf("深度优先遍历是\n");
DFS(g,0);
printf("\n");
return 1;

}


新手!老纯啦...
2007-06-14 12:53
滨海
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2007-6-3
收藏
得分:0 

你的程序应该是数据类型没弄好,你检查一下程序中所有的变量类型

----->>>建议用模版类...


让暴风雨来的更猛烈些吧!!
2007-06-15 20:09
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
得分:0 
我也尝试过模板!学的不精.谢谢你的建议

新手!老纯啦...
2007-06-18 17:40
快速回复:[开源]我的图结构
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017041 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved