鱼C论坛

 找回密码
 立即注册
查看: 2477|回复: 3

无向图的建立(邻接表)、遍历(深度优先)

[复制链接]
发表于 2020-5-5 17:34:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define MAXVEX 20
  4. #define MAX 10
  5. typedef char VertexType;

  6. //边表结点
  7. typedef struct EdgeNode{
  8.     int adjvex;  //邻接点在数组中的位置下标
  9.     struct EdgeNode *next;  //指向下一个邻接点的指针
  10. }EdgeNode;

  11. //顶点表结点
  12. typedef struct VertexNode{
  13.     VertexType data;  //顶点的数据域
  14.     EdgeNode *firstedge;  //指向邻接点的指针
  15. }VertexNode,AdjList[MAXVEX];  //存储各链表头结点的数组

  16. typedef struct{
  17.     AdjList adjlist;  //存储图中顶点及各邻接点的数组
  18.     int vexnum,arcnum;  //记录图中顶点数和边或弧数
  19. }GraphAdjList;

  20. //创建邻接表
  21. void Create(GraphAdjList *G){
  22.     //总顶点个数,总边数

  23.     int i,j,k;
  24.     EdgeNode *p;

  25.     printf("输入顶点数和边数:\n");
  26.     scanf("%d%d",&G->vexnum,&G->arcnum);  //获取顶点数和边数

  27.     //输入顶点信息
  28.     printf("输入顶点信息:\n");
  29.     for(i=0;i<G->vexnum;i++){
  30.         getchar();
  31.         scanf("%c",&G->adjlist[i].data);  //获取顶点值
  32.         G->adjlist[i].firstedge=NULL;           //将指向边表的指针初始化,置空
  33.     }

  34.     //建立边表
  35.     printf("输入边(Vi,Vj)中的下标i,j:\n");
  36.     for(k=0;k<G->arcnum;k++){
  37.         scanf("%d%d",&i,&j);  //输入i,j 在图中有i指向j
  38.         p=(EdgeNode *)malloc(sizeof(EdgeNode));
  39.         p->adjvex=j;                                //存储弧头
  40.         p->next=G->adjlist[i].firstedge;            //头插法插入边结点
  41.         G->adjlist[i].firstedge=p;

  42.         p=(EdgeNode *)malloc(sizeof(EdgeNode));
  43.         p->adjvex=i;                                //存储弧头
  44.         p->next=G->adjlist[j].firstedge;            //头插法插入边结点
  45.         G->adjlist[j].firstedge=p;  //把新建的结点链接在顶点后面
  46.     }
  47. }
  48. void PrintfList(GraphAdjList *G){
  49.     //打印邻接表
  50.         int i;
  51.         EdgeNode *p;
  52.     printf("邻接表为:\n");
  53.     for(i=0;i<G->vexnum;i++){
  54.         p=G->adjlist[i].firstedge;
  55.         while(p){
  56.             printf("(%c,%c)",G->adjlist[i].data,G->adjlist[p->adjvex].data);
  57.             p=p->next;
  58.         }
  59.         printf("\n");

  60.     }
  61.                         getchar();
  62. }

  63. int visited[MAX];

  64. //深度优先搜索
  65. void DFS(GraphAdjList *G,int vi){
  66.         int v;
  67.         EdgeNode *p;
  68.         visited[vi] = 1;  //0没有被访问过,1访问过
  69.         printf("%d:%s",vi , G->adjlist[vi].data);  //问题可能出现在这里!!!

  70.         p = G->adjlist[vi].firstedge;
  71.         while(p != NULL)
  72.         {
  73.                 v = p->adjvex;
  74.                 if(visited[v] == 0)
  75.                 {
  76.                         DFS(G,v);
  77.                 }
  78.                 p = p->next;
  79.         }
  80. }

  81. //深度优先遍历
  82. void DFSTraverse(GraphAdjList *G){
  83.         int vi;
  84.         printf("深度优先遍历:\n");
  85.         for(vi = 0;vi < G->vexnum;vi++)
  86.         {
  87.                 visited[vi] = 0;
  88.         }
  89.         for(vi = 0;vi < G->vexnum;vi++)
  90.         {
  91.                 if (visited[vi] == 0)
  92.                 {
  93.                         DFS(G,vi);
  94.                 }
  95.         }
  96. }
  97. int main(){

  98.     GraphAdjList G;
  99.     Create(&G);
  100.         PrintfList(&G);
  101.         DFSTraverse(&G);
  102.         getchar();
  103.         return 0;
  104. }
复制代码


运行的时候会中断,可能是深度优先搜索里面的输入语句有问题,因为我把那一句注释掉程序就不会中断了,这一句是我看书上的代码,不知道怎么改,改过但是不正确。
中断时候报的是:0x5E45ED6C (msvcr110d.dll) (图.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x00000031 时发生访问冲突。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-6 21:23:14 | 显示全部楼层
问题已解决,printf("%d:%s",vi , G->adjlist[vi].data);这一行改为printf("%d:%c",vi , G->adjlist[vi].data);因为我前面定义的data是VertexType类型的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-30 16:04:36 | 显示全部楼层
可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-4 15:42:31 | 显示全部楼层
太强了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表