⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aoesearch.c

📁 无向图的邻接表的建立和遍历
💻 C
字号:
/*无向图的邻接表的建立和遍历*/
#define MaxSize 100
#define NULL     0
struct ArcNode                   /*定义边结点*/
{int adjvex;
 struct ArcNode *nextarc;
};
struct Vnode                     /*定义定点结点*/ 
{int data;
    struct ArcNode *firstarc;
};
struct Vnode AdjList[MaxSize];
int m,n,v,cord;
main()
{void creatgraph(struct Vnode a[MaxSize]);
 void dfs(struct Vnode a[MaxSize]);
 void bfs(struct Vnode a[MaxSize]);
 do{printf("\n      main menu");
    printf("\n   1: creat wuxiangtu lianjiebiao");
    printf("\n   2: an shendu bianli tu");
    printf("\n   3: an guangdu bianli tu");
    printf("\n   4: exit");
    printf("----------------------------------------------------");
    printf("\n   please input your choice: 1,2,3,4\n");
    scanf("%d",&cord);
    switch(cord)
    {case 1:  creatgraph(AdjList); break;
     case 2:  dfs(AdjList); break;
     case 3:  bfs(AdjList); break;
     case 4:  exit(0);
    }
   }while(cord<=4);
}/*main end*/
void creatgraph(struct Vnode a[MaxSize])
{int i,j,k;
 struct ArcNode *p;
 printf("input arces and vexes:\n");     /*输入图的边数和顶点数*/ 
 scanf("%d,%d",&m,&n);
 for(k=0;k<n;k++)                        /*初始化顶点向量表*/ 
    {a[k].data=k+1;
     a[k].firstarc=NULL;
    }
 for(k=0;k<m;k++)
    {printf("\ninput arc:   ");          /*输入和边关联的顶点号,建立相应的链表*/
     scanf("%d,%d",&i,&j);
     p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
     p->adjvex=j;
     p->nextarc=a[i-1].firstarc;         /*每一个边结点均插入在链表的首部*/
     a[i-1].firstarc=p;
     p=(struct ArcNode *)malloc(sizeof(struct ArcNode));
     p->adjvex=i;
     p->nextarc=a[j-1].firstarc;
     a[j-1].firstarc=p;
     }
 printf("\n");
 for(k=0;k<n;k++)                        /*显示已建立的邻接表信息*/
    {printf("%d",a[k].data);
     p=a[k].firstarc;
     while(p)
          {printf("%d",p->adjvex);p=p->nextarc;}
     printf("\n");
    }
}/*creatgraph end*/
void dfs(struct Vnode a[MaxSize])
{struct ArcNode *p,*ar[MaxSize];         /*ar[MAX]作为顺序栈,存放遍历过程中边结点的地址*/
 int x,i,y,top=-1;
 int visited[MaxSize];                   /*用作存放已遍历过顶点的标记*/
 for(i=0;i<n;i++) visited[i]=0;
 printf("\ninput x:");
 scanf("%d",&x);                         /*输入图遍历的始顶点的编号*/
 printf("%d",x);
 visited[x-1]=1;
 p=a[x-1].firstarc;                      /*下一个要遍历的顶点所关联的边结点,向量表的下标从0开始*/
 while((p)||(top>=0))
      {if(!p) {p=ar[top]; top--;}
       y=p->adjvex;
       if(visited[y-1]==0)
         {visited[y-1]=1;                /*若未遍历过,则遍历,并且把下一个顶点进栈,从本顶点出发继续按深度遍历*/
	  printf("->%d",y);
	  p=p->nextarc;
          if(p) {top++;ar[top]=p;}
	  p=a[y-1].firstarc;
         }
       else p=p->nextarc;
      }
}/*dfs end*/
void bfs(struct Vnode A[MaxSize])
{struct ArcNode *p;
 int x,i,y,front=-1,rear=-1,ar[MaxSize],visited[MaxSize];  /*数组ar[MAX]为顺序队列存放刚遍历过的顶点号*/
 for(i=0;i<n;i++) visited[i]=0;
 printf("\ninput x:");
 scanf("%d",&x);                         /*输入图遍历的始顶点的编号*/
 printf("%d",x);
 visited[x-1]=1;
 p=A[x-1].firstarc;
 while((p)||(front!=rear))
      {if(!p){ front++;
	       y=ar[front];
	       p=A[y-1].firstarc;
	     }
       y=p->adjvex;
       if(visited[y-1]==0)                /*遍历顺点并插入队列*/
	     {visited[y-1]=1;
	      printf("->%d",y);
	      rear++;
	      ar[rear]=y;
	     }
       p=p->nextarc;
      }
}/*bfs*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -