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

📄 tu.c

📁 数据结构
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define m 20                      /*预定义图的最大顶点数*/
typedef char datatype;       /*顶点信息数据类型*/
typedef struct node{           /*边表结点*/
    int adjvex;                      /*邻接点*/
    struct node *next;
}edgenode;
typedef struct vnode{        /*头结点类型*/
   datatype vertex;             /*顶点信息*/
   edgenode *firstedge;     /*邻接链表头指针*/
}vertexnode;
typedef struct{                       /*邻接表类型*/
     vertexnode adjlist [m];     /*存放头结点的顺序表*/
     int n,e;                             /*图的顶点数与边数*/
}adjgraph;

void createadjgraph(adjgraph *g)
    { int i,j,k;
      edgenode *s;
      printf("Please input n and e:\n");
      scanf("%d%d",&g->n,&g->e);     /*输入顶点数与边数*/
      getchar();
      printf("Please input %d vertex:",g->n);
for(i=0;i<g->n;i++)
      {scanf("%c",&g->adjlist[i].vertex);      /*读入顶点信息*/
        g->adjlist[i].firstedge=NULL;            /*边表置为空表*/
        }
      printf("Please input %d edges:",g->e);
      for(k=0;k<g->e;k++)                 /*循环e次建立边表*/
        {   scanf("%d%d",&i,&j);         /*输入无序对(i,j)*/
         s=(edgenode *)malloc(sizeof(edgenode));
             s->adjvex=j;                      /*邻接点序号为j*/
         s->next=g->adjlist[i].firstedge;
         g->adjlist[i].firstedge=s;    /*将新结点*s插入顶点vi的边表头部*/
         s=(edgenode *)malloc(sizeof(edgenode));
             s->adjvex=i;                    /*邻接点序号为i*/
         s->next=g->adjlist[j].firstedge;
         g->adjlist[j].firstedge=s;      
             /*将新结点*s插入顶点vj的边表头部*/
        }
   }

int visited[m];
void dfs(adjgraph g,int i)
{  /*以vi为出发点深度优先遍历顶点vi所在的连通分量*/
  edgenode *p;
  printf("visit vertex: %c \n",g.adjlist[i].vertex);    /*访问顶点i*/
  visited[i]=1;
  p=g.adjlist[i].firstedge;
  while (p)               /*从p的邻接点出发进行深度优先搜索*/
    {  if (!visited[p->adjvex])    
                 dfs(g,p->adjvex);     /*递归*/
       p=p->next;
    }
}
void dfstraverse(adjgraph g)
{ /* 深度优先遍历图g */
 int i;
   for (i=0;i<g.n;i++)
       visited[i]=0;         /*初始化标志数组*/
   for (i=0;i<g.n;i++)
       if (!visited[i])        /*vi未访问过*/
               dfs(g,i);
 }
 void printadjgraph(adjgraph g)
{
    int i;
    for(i=0;i< g.n;i++)
    {
        printf("%c",g.adjlist[i].vertex);
        while(g.adjlist[i].firstedge)
        {
            printf("--->%d",g.adjlist[i].firstedge->adjvex);
            g.adjlist[i].firstedge=(g.adjlist[i].firstedge)->next;
        }
        printf("\n");
    }
}

void main()
{
    adjgraph g;
    createadjgraph(&g);
    printadjgraph(g);
}




⌨️ 快捷键说明

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