主题:几个让我头痛的算法
#include <stdio.h>
#include <alloc.h>
#define MAX_VERTEX_NUM 30 /*图中最多顶点数*/
typedef struct edgenode /*邻接表中链表的结点类型*/
{int vertex; /*邻接顶点的顶点序号*/
int value; /*边/弧的权值*/
struct edgenode *next; /*后继邻接顶点*/
}edgenode;
typedef struct vernode /*邻接表中数组类型*/
{int vertex;
edgenode *next;
}vernode;
typedef vernode lgraph[MAX_VERTEX_NUM]; /*邻接表类型*/
typedef int mgraph[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*邻接矩阵类型*/
int visited[MAX_VERTEX_NUM]; /*访问标志*/
int queue[MAX_VERTEX_NUM]; /*广度优先搜索遍历存储队列*/
void create_mgraph(mgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接矩阵*/
{int e,i,j,source,destination;
printf("Input num of vertex and edge:");
scanf("%d%d",n,&e);
for(i=0;i<*n;i++)
for(j=0;j<*n;j++)
g[i][j]=1000; /*置空邻接矩阵*/
for(i=0;i<e;) /*构造邻接矩阵的每条弧*/
{printf("Input edge's source:");
scanf("%d",&source); /*输入弧的起点*/
printf("Input edge's destination:");
scanf("%d",&destination); /*输入弧的终点*/
if(source==destination)
printf("Error:self loop!\n");
else if(source>=*n||destination>=*n)
printf("Error:out of range!\n");
else
{printf("Input edge's value:");
scanf("%d", (1) ); /*输入弧的权值*/
i++;
}
}
}
void print_mgraph(mgraph g,int n) /*打印图的邻接矩阵*/
{int i,j;
printf(" ");
for(i=0;i<n;i++)
printf("%6d",i); /*打印列标*/
printf("\n");
for(i=0;i<n;i++)
{printf("%2d",i); /*打印行标*/
for(j=0;j<n;j++)
printf("%6d",g[i][j]); /*打印邻接矩阵每条弧的权值*/
printf("\n");
}
}
void create_lgraph(lgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接表*/
{int e,i,source,destination;
edgenode *p,*q;
printf("Input num of vertex and edge:");
scanf("%d%d",n,&e);
for(i=0;i<*n;i++)
{g[i].vertex=i;
g[i].next=NULL; /*置空邻接表*/
}
for(i=0;i<e;) /*构造邻接表的每条弧*/
{printf("Input edge's source:");
scanf("%d",&source); /*输入弧的起点*/
printf("Input edge's destination:");
scanf("%d",&destination); /*输入弧的终点*/
if(source==destination)
printf("Error:self loop!\n");
else if(source>=*n||destination>=*n)
printf("Error:out of range!\n");
else
{p= (2) ; /*为弧结点申请空间*/
p->vertex=destination;
printf("Input edge's value:");
scanf("%d",&p->value);
p->next=NULL;
q=g[source].next;
if(q==NULL)
g[source].next=p;
else
{while(q->next!=NULL)
q=q->next;
q->next=p;
}
i++;
}
}
}
void print_lgraph(lgraph g,int n) /*打印图的邻接表*/
{int i;
edgenode *p;
for(i=0;i<n;i++)
{p=g[i].next;
printf("[%6d]",g[i].vertex); /*打印弧的起点*/
while(p!=NULL)
{printf("-->%d,%d",p->vertex,p->value);
(3) ;
}
printf("\n");
}
}
void dfs(lgraph g,int v)
/*邻接表表示的图的以v为起点深度优先搜索遍历*/
{edgenode *p;
printf("%4d",v); /*访问顶点i*/
visited[v]=1; /*置顶点i已被访问*/
p=g[v].next;
while(p!=NULL) /*检查所有与顶点i相邻接的顶点*/
{if( (4) ) /*如果该顶点未被访问过*/
dfs(g,p->vertex); /*从邻接顶点出发深度优先搜索*/
p=p->next; /*考察下一个顶点*/
}
}
void bfs(lgraph g,int v)
/*邻接表表示的图的以v为起点广度优先搜索遍历*/
{int i,front,rear;
edgenode *p;
front=rear=0; /*队列置空*/
printf("%4d",v); /*访问出发顶点*/
visited[v]=1; /*置该顶点为已被访问标志*/
queue[rear++]=v; /*出发顶点入队列*/
while( (5) )
{v=queue[front++]; /*取队列首元素*/
for(p=g[v].next;p!=NULL;p=p->next)
{/*按邻接表顺序考察与顶点v邻接的各顶点p->vertex*/
if( (6) )
{/*顶点w未被访问过*/
printf("%4d",p->vertex); /*访问顶点p->vertex*/
visited[p->vertex]=1; /*置顶点p->vertex为已被访问标志*/
queue[rear++]=p->vertex; /*顶点p->vertex入队列*/
}
}
}
}
main()
{lgraph lg;
mgraph mg;
int n,i;
clrscr();
create_mgraph(mg,&n); /*调用create_mgraph函数,建立图的邻接矩阵*/
print_mgraph(mg,n); /*调用print_mgraph函数,输出图的邻接矩阵*/
create_lgraph(lg,&n); /*调用create_lgraph函数,建立图的邻接表*/
print_lgraph(lg,n); /*调用print_lgraph函数,输出图的邻接表*/
for(i=0;i<n;i++)
visited[i]=0; /*置全部顶点未访问标志*/
printf("\nThe depth-first-search is:");
dfs(lg,0); /*调用dfs函数*/
for(i=0;i<n;i++)
visited[i]=0; /*置全部顶点未访问标志*/
printf("\nThe breadth-first-search is:");
bfs(lg,0); /*调用bfs函数*/
}
求有识之士帮忙解决一下我心中的烦恼
#include <alloc.h>
#define MAX_VERTEX_NUM 30 /*图中最多顶点数*/
typedef struct edgenode /*邻接表中链表的结点类型*/
{int vertex; /*邻接顶点的顶点序号*/
int value; /*边/弧的权值*/
struct edgenode *next; /*后继邻接顶点*/
}edgenode;
typedef struct vernode /*邻接表中数组类型*/
{int vertex;
edgenode *next;
}vernode;
typedef vernode lgraph[MAX_VERTEX_NUM]; /*邻接表类型*/
typedef int mgraph[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*邻接矩阵类型*/
int visited[MAX_VERTEX_NUM]; /*访问标志*/
int queue[MAX_VERTEX_NUM]; /*广度优先搜索遍历存储队列*/
void create_mgraph(mgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接矩阵*/
{int e,i,j,source,destination;
printf("Input num of vertex and edge:");
scanf("%d%d",n,&e);
for(i=0;i<*n;i++)
for(j=0;j<*n;j++)
g[i][j]=1000; /*置空邻接矩阵*/
for(i=0;i<e;) /*构造邻接矩阵的每条弧*/
{printf("Input edge's source:");
scanf("%d",&source); /*输入弧的起点*/
printf("Input edge's destination:");
scanf("%d",&destination); /*输入弧的终点*/
if(source==destination)
printf("Error:self loop!\n");
else if(source>=*n||destination>=*n)
printf("Error:out of range!\n");
else
{printf("Input edge's value:");
scanf("%d", (1) ); /*输入弧的权值*/
i++;
}
}
}
void print_mgraph(mgraph g,int n) /*打印图的邻接矩阵*/
{int i,j;
printf(" ");
for(i=0;i<n;i++)
printf("%6d",i); /*打印列标*/
printf("\n");
for(i=0;i<n;i++)
{printf("%2d",i); /*打印行标*/
for(j=0;j<n;j++)
printf("%6d",g[i][j]); /*打印邻接矩阵每条弧的权值*/
printf("\n");
}
}
void create_lgraph(lgraph g,int *n)
/*输入有向图的顶点和弧,建立图的邻接表*/
{int e,i,source,destination;
edgenode *p,*q;
printf("Input num of vertex and edge:");
scanf("%d%d",n,&e);
for(i=0;i<*n;i++)
{g[i].vertex=i;
g[i].next=NULL; /*置空邻接表*/
}
for(i=0;i<e;) /*构造邻接表的每条弧*/
{printf("Input edge's source:");
scanf("%d",&source); /*输入弧的起点*/
printf("Input edge's destination:");
scanf("%d",&destination); /*输入弧的终点*/
if(source==destination)
printf("Error:self loop!\n");
else if(source>=*n||destination>=*n)
printf("Error:out of range!\n");
else
{p= (2) ; /*为弧结点申请空间*/
p->vertex=destination;
printf("Input edge's value:");
scanf("%d",&p->value);
p->next=NULL;
q=g[source].next;
if(q==NULL)
g[source].next=p;
else
{while(q->next!=NULL)
q=q->next;
q->next=p;
}
i++;
}
}
}
void print_lgraph(lgraph g,int n) /*打印图的邻接表*/
{int i;
edgenode *p;
for(i=0;i<n;i++)
{p=g[i].next;
printf("[%6d]",g[i].vertex); /*打印弧的起点*/
while(p!=NULL)
{printf("-->%d,%d",p->vertex,p->value);
(3) ;
}
printf("\n");
}
}
void dfs(lgraph g,int v)
/*邻接表表示的图的以v为起点深度优先搜索遍历*/
{edgenode *p;
printf("%4d",v); /*访问顶点i*/
visited[v]=1; /*置顶点i已被访问*/
p=g[v].next;
while(p!=NULL) /*检查所有与顶点i相邻接的顶点*/
{if( (4) ) /*如果该顶点未被访问过*/
dfs(g,p->vertex); /*从邻接顶点出发深度优先搜索*/
p=p->next; /*考察下一个顶点*/
}
}
void bfs(lgraph g,int v)
/*邻接表表示的图的以v为起点广度优先搜索遍历*/
{int i,front,rear;
edgenode *p;
front=rear=0; /*队列置空*/
printf("%4d",v); /*访问出发顶点*/
visited[v]=1; /*置该顶点为已被访问标志*/
queue[rear++]=v; /*出发顶点入队列*/
while( (5) )
{v=queue[front++]; /*取队列首元素*/
for(p=g[v].next;p!=NULL;p=p->next)
{/*按邻接表顺序考察与顶点v邻接的各顶点p->vertex*/
if( (6) )
{/*顶点w未被访问过*/
printf("%4d",p->vertex); /*访问顶点p->vertex*/
visited[p->vertex]=1; /*置顶点p->vertex为已被访问标志*/
queue[rear++]=p->vertex; /*顶点p->vertex入队列*/
}
}
}
}
main()
{lgraph lg;
mgraph mg;
int n,i;
clrscr();
create_mgraph(mg,&n); /*调用create_mgraph函数,建立图的邻接矩阵*/
print_mgraph(mg,n); /*调用print_mgraph函数,输出图的邻接矩阵*/
create_lgraph(lg,&n); /*调用create_lgraph函数,建立图的邻接表*/
print_lgraph(lg,n); /*调用print_lgraph函数,输出图的邻接表*/
for(i=0;i<n;i++)
visited[i]=0; /*置全部顶点未访问标志*/
printf("\nThe depth-first-search is:");
dfs(lg,0); /*调用dfs函数*/
for(i=0;i<n;i++)
visited[i]=0; /*置全部顶点未访问标志*/
printf("\nThe breadth-first-search is:");
bfs(lg,0); /*调用bfs函数*/
}
求有识之士帮忙解决一下我心中的烦恼