www.pudn.com > grahic.rar > grahic.c


# define true 1 
# define false 0 
# define ok 1 
# define error 0 
# define overflow -2 
# define null 0 
typedef int status; 
 
# include  
# include  
# include  
# define maxlen 10 
# define large 999 
 
typedef struct 
{ 
 int a[maxlen],b[maxlen],h[maxlen];/*第K边的起点,终点,权值*/ 
 char vexs[maxlen];/*顶点信息集合*/ 
 int vexnum,arcnum;/*顶点数和边数*/ 
 int kind;/*图的类型*/ 
 int arcs[maxlen][maxlen];/*邻接矩阵*/ 
}graph; 
 
typedef struct node/*表结点结构*/ 
{ 
 int adjvex;/*存放与头结点相邻接的顶点在数组中的序号*/ 
 int info;/*权值*/ 
 struct node *next;/*指向与头结点相邻接下一个顶点的表结点*/ 
}edgenode; 
 
typedef struct/*头结点结构*/ 
{ 
 int id;/*顶点入度*/ 
 char data;/*顶点信息*/ 
 edgenode *link;/*指向头结点对应的单链表中的表结点*/ 
}vexnode; 
 
typedef struct/*邻接表结构*/ 
{ 
 vexnode adjs[maxlen];/*邻接表的头结点集合*/ 
 int vexnum,arcnum;/*顶点数,边数*/ 
 int kind; 
}adjlist; 
 
typedef struct qnode/*队列存储结构*/ 
{int data; 
 struct qnode *next; 
}linkqlist; 
 
typedef struct 
{linkqlist *front;/*队头指针*/ 
 linkqlist *rear;/*队尾指针*/ 
} linkqueue; 
 
 
 
typedef struct/*栈结构*/ 
{int stack[maxlen]; 
 int top; 
}stackstru; 
 
int cnull=-1; 
graph g; 
adjlist adjl; 
stackstru *t;/*拓扑序列顶点栈*/ 
stackstru *s;/*零入度顶点栈*/ 
linkqueue *q; 
 
 
 
graph printf_adjmatrix(graph g)/*输出邻接矩阵*/ 
 { 
 int i,j; 
 printf("邻接矩阵:\n"); 
 printf("vertex\t"); 
 for (i=0;iadjvex=g.b[i]; 
	p->info=g.h[i]; 
	p->next=adjl.adjs[g.a[i]-1].link; 
	adjl.adjs[g.a[i]-1].link=p; 
	} 
     } 
 if(g.kind==2||g.kind==4)  
   { for(i=0;iinfo=g.h[i]; 
        p->adjvex=g.b[i]; 
       	p->next=adjl.adjs[g.a[i]-1].link; 
        adjl.adjs[g.a[i]-1].link=p; 
        
        p=(edgenode*)malloc(sizeof(edgenode)); 
        p->info=g.h[i]; 
        p->adjvex=g.a[i]; 
       	p->next=adjl.adjs[g.b[i]-1].link; 
	adjl.adjs[g.b[i]-1].link=p; 
	} 
     } 
printf("邻接表为:\n"); 
for(i=0;i",i+1,adjl.adjs[i].data); 
   p=adjl.adjs[i].link; 
   while(p!=cnull) 
    {printf("[%c,%d]-->",adjl.adjs[(p->adjvex)-1].data,p->info); 
   p=p->next; 
 } 
printf("^\n"); 
} 
return adjl; 
} 
 void initqueue(linkqueue *p) 
{    p->front=(linkqlist *)malloc(sizeof(linkqlist)); 
     p->rear=p->front; 
     (p->front)->next=null; 
     } 
 
status empty(linkqueue *q) 
{int v; 
 if(q->front==q->rear) v=true; 
 else   v=false; 
 return v; 
} 
status addqueue(linkqueue *q,int e)/*入队列*/ 
{ 
 q->rear->next=(linkqlist *)malloc(sizeof(linkqlist)); 
 q->rear=q->rear->next; 
 if(!q->rear) return -1; 
 q->rear->data=e; 
 q->rear->next=null; 
} 
 
status delqueue(linkqueue *q)/*出队列*/ 
{ 
  linkqlist *p; 
  int e; 
  if (q->front==q->rear) 
      printf("the linklist is overflow"); 
  else p=(q->front)->next; 
       (q->front)->next=p->next; 
  e=p->data; 
  if(q->rear==p) 
       q->rear=q->front; 
  free(p);/*释放P所指的内存区*/ 
 return(e); 
} 
 
 
void DFS(int i, adjlist adjl)/*深度优先搜索*/ 
{edgenode *p; 
 int j; 
 int visited[maxlen];/*访问标志数组,访问过为1,未访问过为0*/ 
 for(j=0;j",adjl.adjs[i-1].data); 
  visited[i-1]=1; 
  p=adjl.adjs[i-1].link; 
  while(p!=cnull) 
  {if (visited[(p->adjvex)-1]!=1) DFS((p->adjvex),adjl); 
     p=p->next; 
   } 
} 
 
void BFS(int i,adjlist adjl)/*广度优先搜索*/ 
{ edgenode *p; 
  int j; 
  int visited[maxlen]; 
  for (j=0;j",adjl.adjs[i-1].data); 
  visited[i-1]=1; 
  addqueue(q,i); 
  while(!empty(q)) 
    {i=delqueue(q); 
     p=adjl.adjs[i-1].link; 
     while(p!=cnull) 
       {if (visited[(p->adjvex)-1]==0) 
          {printf("%4c->",adjl.adjs[p->adjvex-1].data); 
           visited[(p->adjvex)-1]=1; 
           addqueue(q,p->adjvex); 
           p=p->next; 
           } 
        } 
     } 
} 
 
status initstack(stackstru *s)/*构造空栈*/ 
{s->top=0; 
 return ok; 
} 
 
status push(stackstru *s,int x)/*入栈*/ 
{if (s->top==maxlen) 
 printf("the stack is overflow!\n"); 
 else{ s->top=s->top+1; 
       s->stack[s->top]=x; 
      } 
} 
status pop(stackstru *s) 
{ int y; 
  if(s->top==0)printf("the stack is empty!\n"); 
  else {y=s->stack[s->top]; 
	s->top=s->top-1; 
	} 
  return y; 
} 
 
status stackempty(stackstru *s) 
{ if (s->top==maxlen) return (true); 
  else return (false); 
} 
 
 
  
 
status topsort(adjlist adjl)/*拓扑排序*/ 
{ 
  int i,k,count; 
  edgenode *p; 
   
  printf("拓扑排序序列为:\n"); 
  initstack(s); 
   
  for(i=0;i",adjl.adjs[i].data); 
      ++count; 
      for(p=adjl.adjs[i].link;p;p=p->next) 
         { k=p->adjvex; 
	   if(!(--adjl.adjs[k-1].id)) push(s,k-1); 
          } 
     } 
  if(countnext) 
        { k=p->adjvex; 
          if(--adjl.adjs[k-1].id==0) push(s,k-1); 
	  if(ve[j]+(p->info)>ve[k-1]) ve[k-1]=ve[j]+(p->info); 
         } 
     } 
  if(countnext) 
       { k=p->adjvex; dut=(p->info); 
         if(vl[k]-dutnext) 
      { k=p->adjvex;dut=p->info; 
        ee=ve[j];el=vl[k-1]-dut; 
        if(ee==el) printf("(%c,%c)->",adjl.adjs[j].data,adjl.adjs[k-1].data); 
       } 
} 
 
void shortpath_dijkstra(graph g) 
{ int cost[maxlen][maxlen]; 
  int dist[maxlen];/*某源点到各顶点的最短路径长度*/ 
  int path[maxlen];/*某源点到终点经过的顶点集合的数组*/ 
  int s[maxlen];/*最短路径的终点集合*/ 
  int i,j,n,v0,min,u;/*U存放最短路径的终点*/ 
  printf("\n请输入起点的编号:"); 
  scanf("%d",&v0); 
  v0--; 
  for(i=0;i0) path[i]=v0; 
      s[i]=0; 
     } 
  s[v0]=1; 
  for(i=0;i(short3[i][k]+short3[k][j])) 
	  { short3[i][j]=short3[i][k]+short3[k][j]; 
            path[i][j]=k; 
           } 
	 printf("(%4c->%4c):%d",g.vexs[i-1],g.vexs[j-1],short3[i][j]); 
       } 
} 
 
 
 
 
main() 
{ 
 
int a,i,j,k,h; 
printf("\n请输入图的类型(1:有向图 2:无向图 3:有向网 4:无向网):"); 
scanf("%d",&i); 
{g.kind=i;adjl.kind=i;} 
printf("请输入顶点数,边数:"); 
scanf("%d,%d",&i,&j); 
g.vexnum=i;adjl.vexnum=i; 
g.arcnum=j;adjl.arcnum=j; 
for (i=0;ig.vexnum||j<1||j>g.vexnum) 
       {printf("     编号超出范围,重新输入");goto label; 
 
	} 
       if (g.kind==3||g.kind==4) 
       {printf("\t该边的权值:"); 
	scanf("%d",&h); 
	g.h[k-1]=h; 
	} 
	else  g.h[k-1]=null; 
	adjl.adjs[i].id++; 
} 
loop1:printf("\n1__邻接矩阵\n"); 
printf("2__邻接表\n"); 
printf("3__深度优先搜索\n"); 
printf("4__广度优先搜索\n"); 
printf("5__最小生成树\n"); 
printf("6__拓扑排序\n"); 
printf("7__关键路径\n"); 
printf("8__从某个源点到其余各顶点的最短路径\n"); 
printf("9__每一对顶点之间的最短路径\n"); 
loop:printf("请选择图的实现:\t"); 
scanf("%d",&a); 
 switch(a) 
 { 
  case 1:creategraph(g);break; 
  case 2:createlist(g,adjl);break; 
  case 3:printf("请输入出发点编号:"); 
           scanf("%d",&k); 
          createlist(g,adjl); 
           printf("\n从第%d点出发深度优先搜索遍历序列:",k); 
	   DFS(k,adjl);break; 
  case 4:printf("请输入出发点编号:"); 
           scanf("%d",&k); 
           createlist( g,adjl); 
           printf("\n从第%d点出发广度优先搜索遍历序列:",k);	 
	   BFS( k,adjl); 
	   break; 
  case 5:if (g.kind==4) 
	       {create_4(g); prim(g);} 
	   else{printf("\t不能构造最小生成树,请重新选择:\n");goto loop;} 
           break; 
  case 6:if (g.kind==1||g.kind==3) 
	       {createlist(g,adjl); topsort(adjl);} 
	   else{printf("\t不能拓扑排序,请重新选择:\n");goto loop;} 
           break; 
  case 7:if (g.kind==3) 
	       {createlist(g,adjl); 
	       criticalpath( adjl); 
	       } 
	   else{printf("\t没有关键路径,请重新选择:\n");goto loop;} 
           break; 
  case 8:if (g.kind==3) 
	       {create_3(g); shortpath_dijkstra(g);} 
	   else{printf("\t没有最短路径,请重新选择:\n");goto loop;} 
           break; 
  case 9:if (g.kind==3) 
	       {create_3(g); shortpath_floyd(g);} 
	   else{printf("\t没有最短路径,请重新选择:\n");goto loop;} 
           break; 
  default:printf(" \n\t*** wrong ***\n"); 
  }/*switch*/ 
goto loop1; 
 }/*main()*/