#include
#include
// 定义 状态代码 及 数据类型
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFINITY 255
#define MAX_VERTEX_NUM 20
typedef int Status;
typedef int ElemType;
// 边结构
typedef struct EBox{
int ivex,jvex;
struct EBox *ilink,*jlink;
}EBox;
// 顶点结构
typedef struct VexBox{
char data;
EBox *firstedge;
}VexBox;
// 图结构
typedef struct{
VexBox adjlist[MAX_VERTEX_NUM];
int vexnum,edgenum;
}AMLGraph;
// 队列结构
// 节点存储结构
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
// 队列
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
// 初始化队列
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(!Q.front)
return ERROR;
Q.front->next=NULL;
return OK;
}
// 入队
Status EnQueue(LinkQueue &Q,ElemType e){
QueuePtr p=NULL;
p=new QNode;
if(!p)
return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
// 出队
Status DeQueue(LinkQueue &Q,ElemType &e){
QueuePtr p=NULL;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) // 注意当出队后为空队的情况
Q.rear=Q.front;
delete p;
return OK;
}
// 判断是否为空队列
Status QueueEmpty(LinkQueue &Q){
return Q.front==Q.rear?OK:ERROR;
}
// 建立图
void createAMLGraph(AMLGraph &G,int *edges){
int t,i,j;
EBox *p;
// initializtion
for(t=0;t
G.adjlist[t].firstedge=NULL;
}
// create edges
for(t=0;t
edges++;
j=*edges;
edges++;
p=new EBox;
p->ivex=i;
p->ilink=G.adjlist[i].firstedge;
p->jvex=j;
p->jlink=G.adjlist[j].firstedge;
G.adjlist[i].firstedge=G.adjlist[j].firstedge=p;
}
}
int LocateVex(AMLGraph &G,char v)
//在图中找到某一个元素
{
int n;
for(n=0;n
return n;
}
// 返回图G中v顶点的第一个邻接顶点
int FirstAdjVex(AMLGraph &G,int v){
if(G.adjlist[v].firstedge==NULL)
return -1;
else if(v==G.adjlist[v].firstedge->ivex){
return G.adjlist[v].firstedge->jvex;
}
else{
return G.adjlist[v].firstedge->ivex;
}
}
// 返回图G中v顶点中邻接顶点w接下来的邻接顶点
int NextAdjVex(AMLGraph &G,int v,int w){
EBox *p;
p=G.adjlist[v].firstedge;
while(p!=NULL){
if(v==p->ivex){
if(w==p->jvex){
if(p->ilink==NULL)
return -1;
else
return p->ilink->ivex==v?p->ilink->jvex:p->ilink->ivex;
}
else
p=p->ilink;
}
else{
if(w==p->ivex){
if(p->jlink==NULL)
return -1;
else
return p->jlink->ivex==v?p->jlink->jvex:p->jlink->ivex;
}
else
p=p->jlink;
}
}//while
}
// ----------------------- 深度及广度优先遍历 -------------------------
// 对已经访问的顶点做标记
int visited[MAX_VERTEX_NUM];
// 深度优先遍历的递归函数DFS()
void DFS(AMLGraph &G,int i){
int j;
visited[i]=TRUE;
printf("%c ",G.adjlist[i].data);//标记并输出这个点
for(j=FirstAdjVex(G,i);j>=0;j=NextAdjVex(G,i,j)){
if(visited[j]!=TRUE){
DFS(G,j);
}
}
}
// 深度优先遍历图
void DFSTraverse(AMLGraph &G){
int i;
printf("\nDFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
DFS(G,i);
}
}
}
// 广度优先遍历图
void BFSTraverse(AMLGraph &G){
int i,j;
LinkQueue Q;
InitQueue(Q);
printf("\nBFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
visited[i]=TRUE;
EnQueue(Q,i);
while(!QueueEmpty(Q)){
DeQueue(Q,i);
printf("%c ",G.adjlist[i].data);
for(j=FirstAdjVex(G,i);j>=0;j=NextAdjVex(G,i,j))
if(!visited[j]){
visited[j]=TRUE;
EnQueue(Q,j);
}//if
}//while
}//if
}
main(){
AMLGraph G;
int i,j=0,v,e;
int *edges;
char a[100];
printf("输入顶点数和弧数:");
scanf("%d%d",&v,&e);
G.vexnum=v;
G.edgenum=e;
for(i=0;i
printf("输入顶点%d:",i);
G.adjlist[i].data = getchar();
if(G.adjlist[i].data=='\n')
{
i--;
printf("\b\b\b\b\b\b\b\b\b\b");
}
}
for(i=0;i
a[j]=getchar();
if(a[j]=='\n')
a[j]=getchar();
a[j+1]=getchar();
j=j+2;
}
for(i=0;i
*edges=LocateVex(G,a[i]);
edges++;
}
createAMLGraph(G,edges);
DFSTraverse(G);
BFSTraverse(G);
getch();
}
又改了下回答:但是还是存在问题,麻烦高手看看!谢谢!
#include
#include
// 定义 状态代码 及 数据类型
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFINITY 255
#define MAX_VERTEX_NUM 20
typedef int Status;
typedef int ElemType;
// 边结构
typedef struct EBox{
int ivex,jvex;
struct EBox *ilink,*jlink;
}EBox;
// 顶点结构
typedef struct VexBox{
char data;
EBox *firstedge;
}VexBox;
// 图结构
typedef struct{
VexBox adjlist[MAX_VERTEX_NUM];
int vexnum,edgenum;
}AMLGraph;
// 队列结构
// 节点存储结构
typedef struct QNode{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
// 队列
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
// 初始化队列
Status InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(!Q.front)
return ERROR;
Q.front->next=NULL;
return OK;
}
// 入队
Status EnQueue(LinkQueue &Q,ElemType e){
QueuePtr p=NULL;
p=new QNode;
if(!p)
return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
// 出队
Status DeQueue(LinkQueue &Q,ElemType &e){
QueuePtr p=NULL;
if(Q.front==Q.rear)
return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) // 注意当出队后为空队的情况
Q.rear=Q.front;
delete p;
return OK;
}
// 判断是否为空队列
Status QueueEmpty(LinkQueue &Q){
return Q.front==Q.rear?OK:ERROR;
}
// 建立图
void createAMLGraph(AMLGraph &G,int *edges){
int t,i,j;
EBox *p;
// initializtion
for(t=0;t
G.adjlist[t].firstedge=NULL;
}
// create edges
for(t=0;t
edges++;
j=*edges;
edges++;
p=new EBox;
p->ivex=i;
p->ilink=G.adjlist[i].firstedge;
p->jvex=j;
p->jlink=G.adjlist[j].firstedge;
G.adjlist[i].firstedge=G.adjlist[j].firstedge=p;
}
}
int LocateVex(AMLGraph &G,char v)
//在图中找到某一个元素
{
int n;
for(n=0;n
return n;
}
// 返回图G中v顶点的第一个邻接顶点
int FirstAdjVex(AMLGraph &G,int v){
if(G.adjlist[v].firstedge==NULL)
return -1;
else if(v==G.adjlist[v].firstedge->ivex){
return G.adjlist[v].firstedge->jvex;
}
else{
return G.adjlist[v].firstedge->ivex;
}
}
// 返回图G中v顶点中邻接顶点w接下来的邻接顶点
int NextAdjVex(AMLGraph &G,int v,int w){
EBox *p;
p=G.adjlist[v].firstedge;
while(p!=NULL){
if(v==p->ivex){
if(w==p->jvex){
if(p->ilink==NULL)
return -1;
else
return p->ilink->ivex==v?p->ilink->jvex:p->ilink->ivex;
}
else
p=p->ilink;
}
else{
if(w==p->ivex){
if(p->jlink==NULL)
return -1;
else
return p->jlink->ivex==v?p->jlink->jvex:p->jlink->ivex;
}
else
p=p->jlink;
}
}//while
}
// ----------------------- 深度及广度优先遍历 -------------------------
// 对已经访问的顶点做标记
int visited[MAX_VERTEX_NUM];
// 深度优先遍历的递归函数DFS()
void DFS(AMLGraph &G,int i){
int j;
visited[i]=TRUE;
printf("%c ",G.adjlist[i].data);//标记并输出这个点
for(j=FirstAdjVex(G,i);j>=0;j=NextAdjVex(G,i,j)){
if(visited[j]!=TRUE){
DFS(G,j);
}
}
}
// 深度优先遍历图
void DFSTraverse(AMLGraph &G){
int i;
printf("\nDFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
DFS(G,i);
}
}
}
// 广度优先遍历图
void BFSTraverse(AMLGraph &G){
int i,j;
LinkQueue Q;
InitQueue(Q);
printf("\nBFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
visited[i]=TRUE;
EnQueue(Q,i);
while(!QueueEmpty(Q)){
DeQueue(Q,i);
printf("%c ",G.adjlist[i].data);
for(j=FirstAdjVex(G,i);j>=0;j=NextAdjVex(G,i,j))
if(!visited[j]){
visited[j]=TRUE;
EnQueue(Q,j);
}//if
}//while
}//if
}
main(){
AMLGraph G;
int i,j=0,v,e;
int *edges;
char a[100];
printf("输入顶点数和弧数:");
scanf("%d%d",&v,&e);
G.vexnum=v;
G.edgenum=e;
for(i=0;i
printf("输入顶点%d:",i);
G.adjlist[i].data = getchar();
if(G.adjlist[i].data=='\n')
{
i--;
printf("\b\b\b\b\b\b\b\b\b\b");
}
}
for(i=0;i
a[j]=getchar();
if(a[j]=='\n')
a[j]=getchar();
a[j+1]=getchar();
j=j+2;
}
for(i=0;i
*edges=LocateVex(G,a[i]);
edges++;
}
createAMLGraph(G,edges);
DFSTraverse(G);
BFSTraverse(G);
getch();
}
这是问题继续的补充:
// 返回图G中v顶点中邻接顶点w接下来的邻接顶点
int NextAdjVex(AMLGraph &G,char v,char w){
EBox *p;
p=G.adjlist[v].firstedge;
while(p!=NULL){
if(v==p->ivex){
if(w==p->jvex){
if(p->ilink==NULL)
return -1;
return p->ilink->ivex==v?p->ilink->jvex:p->ilink->ivex;
}else{
p=p->ilink;
}
}else{
if(w==p->ivex){
if(p->jlink==NULL)
return -1;
return p->jlink->ivex==v?p->jlink->jvex:p->jlink->ivex;
}else{
p=p->jlink;
}
}
}
return -1;
}
//深度广度遍历:
// ----------------------- 深度及广度优先遍历 -------------------------
// 对已经访问的顶点做标记
int visited[MAX_VERTEX_NUM];
// 深度优先遍历的递归函数DFS()
void DFS(AMLGraph &G,int i,char *edges){
int j,k=0,n=0;
visited[i]=TRUE;
printf("%c ",edges[i]);//标记并输出这个点
for(j=0;j
k=j;
for(j=0;j
n=j;
for(j=k;j>=0;j=n){
if(visited[j]!=TRUE){
DFS(G,j,edges);
}
}
}
// 深度优先遍历图
void DFSTraverse(AMLGraph &G,char *edges){
int i;
printf("\nDFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
DFS(G,i,edges);
}
}
}
// 广度优先遍历图
void BFSTraverse(AMLGraph &G,char *edges){
int i,j,k=0,n=0;
LinkQueue Q;
InitQueue(Q);
printf("\nBFSTraverse--------------------\n\n");
for(i=0;i
}
for(i=0;i
visited[i]=TRUE;
EnQueue(Q,i);
while(!QueueEmpty(Q)){
DeQueue(Q,edges[i]);
for(j=0;j
k=j;
for(j=0;j
n=j;
for(j=k;j>=0;j=n){
if(!visited[j]){
visited[j]=TRUE;
EnQueue(Q,j);
printf("%c ",edges[j]);
}
}
}
}
}
}
main(){
AMLGraph G;
int i,j=0,v,e;
char a[100],*edges=a;
printf("输入顶点数和弧数:");
scanf("%d %d",&v,&e);
printf("\n");
for(i=0;i
printf("输入顶点%d:",i);
a[i]=getc(stdin);
printf("\n");
}
for(i=0;i
G.adjlist[i].firstedge[i].ivex=getc(stdin);
G.adjlist[i].firstedge[i].jvex=getc(stdin);
printf("\n");
}
createAMLGraph(G,v,e,edges);
PrintGraph(G);
DFSTraverse(G,edges);
BFSTraverse(G,edges);
}
注:问题补充里面的“// 打印出每个顶点的邻接顶点”可以不要。