图的遍历——C语言

利用邻接矩阵存储一张图,分别采用图的深度优先搜索和广度优先搜索遍历该图,并输出遍历结果。


主程序:

#include <stdio.h>
#include <stdlib.h>


#define MAXVEX  100                      //最大顶点数
#define INFINITY    65535               //用65535来代表无穷大


int visited[MAXVEX]={0};


typedef struct
{
    char vexs[MAXVEX];            //顶点表
    int  arc[MAXVEX][MAXVEX];         //邻接矩阵,可看作边
    int  numVertexes, numEdges;      //图中当前的顶点数和边数
}Graph;




void CreateGraph(Graph *g)
{    int i,j,k,w,t;
     printf("输入顶点数,边数和t(中间用空格):");
     scanf("%d %d %d", &(g->numVertexes), &(g->numEdges),&t);
     printf("\n");
	 for(i=1;i<=g->numVertexes;i++)
     {
     	 getchar();
	     printf("输入第%d顶点信息vexs[%d]=",i,i);
	     scanf("%c",&(g->vexs[i]));
     }
     printf("\n");
     for(i=1;i<=g->numVertexes;i++)
            for(j=1;j<=g->numVertexes;j++)
                if (t>2)    g->arc[i][j] = INFINITY;
                else        g->arc[i][j]=0;
     for(k=1;k<=g->numEdges;k++)
           {
            printf("输入i j(中间用空格):");
		    scanf("%d %d",&i,&j);
            if(i>g->numVertexes ||j>g->numVertexes)  exit(0);
            if(t>2)
            {
                  printf("输入w:");
			      scanf("%d",&w);
                  g->arc[i][j]=w;
                  if(t==3)  g->arc[j][i]=w;
            }
            else
            {     g->arc[i][j]=1;
                  if (t==1)    g->arc[j][i]=1;
            }
     }
     printf("\n");
     printf("输出邻接矩阵:\n");
     for(i=1;i<=g->numVertexes ;i++)
     {


     for(j=1;j<=g->numVertexes ;j++)
     {
     	printf("%8d",g->arc[i][j]);
     
		  if(t>2&&g->arc[i][j]==65535)
     	      g->arc[i][j]=0;
		  else if(t>2&&g->arc[i][j]!=65535)
              g->arc[i][j]=1;
	 }
	 printf("\n");
     }




}


void dfs (Graph g,int i)         //广度优先搜索,从顶点i开始遍历
{
       int j;
       printf("%d->",i);         //输出访问顶点
        visited[i]=1;            //全局数组访问标记置1表示已经访问
        for(j=1; j<=g.numVertexes; j++)
               if ((g.arc[i][j]==1)&&(!visited[j]))
                        dfs (g,j);
}


void bfs (Graph g,int i)
{
	  int visited[MAXVEX]={0};
      int  q[g.numVertexes+1] ;
      int  f,r,j ;
      f=r=0 ;
      printf("%d->",i);
      visited[i]=1 ;
      r++;
	  q[r]=i ;
      while (f<r)
      {    f++; i=q[f] ;
            for (j=1; j<=g.numVertexes; j++)
                   if ((g.arc[i][j]==1)&&(!visited[j]))
                   {    printf("%d->",j);    ;     visited[j]=1 ;     r++; q[r]=j ;  }
       }
}


int main()
{
    Graph g;
    int i;
    printf("t为1~4,分别表示无向图、有向图、带权无向图、带权有向图\n");
    CreateGraph(&g);
    printf("\n输入i:");
    scanf("%d",&i);
    printf("\n深度优先搜索遍历:");
    dfs (g,i);
    printf("NULL\n");
    printf("广度优先搜索遍历:");
    bfs (g,i);
    
    printf("NULL\n");
    return 0;
}
输入输出示例:

1.无向图

t为1~4,分别表示无向图、有向图、带权无向图、带权有向图
输入顶点数,边数和t(中间用空格):8 10 1

输入第1顶点信息vexs[1]=1
输入第2顶点信息vexs[2]=2
输入第3顶点信息vexs[3]=3
输入第4顶点信息vexs[4]=4
输入第5顶点信息vexs[5]=5
输入第6顶点信息vexs[6]=6
输入第7顶点信息vexs[7]=7
输入第8顶点信息vexs[8]=8

输入i j(中间用空格):1 2
输入i j(中间用空格):1 3
输入i j(中间用空格):2 4
输入i j(中间用空格):2 5
输入i j(中间用空格):3 6
输入i j(中间用空格):3 7
输入i j(中间用空格):4 8
输入i j(中间用空格):5 8
输入i j(中间用空格):6 8
输入i j(中间用空格):7 8

输出邻接矩阵:
       0       1       1       0       0       0       0       0
       1       0       0       1       1       0       0       0
       1       0       0       0       0       1       1       0
       0       1       0       0       0       0       0       1
       0       1       0       0       0       0       0       1
       0       0       1       0       0       0       0       1
       0       0       1       0       0       0       0       1
       0       0       0       1       1       1       1       0

输入i:1

深度优先搜索遍历:1->2->4->8->5->6->3->7->NULL
广度优先搜索遍历:1->2->3->4->5->6->7->8->NULL

--------------------------------
Process exited after 74.92 seconds with return value 0
请按任意键继续. . .

2.带权无向图

t为1~4,分别表示无向图、有向图、带权无向图、带权有向图
输入顶点数,边数和t(中间用空格):5 8 3

输入第1顶点信息vexs[1]=1
输入第2顶点信息vexs[2]=2
输入第3顶点信息vexs[3]=3
输入第4顶点信息vexs[4]=4
输入第5顶点信息vexs[5]=5

输入i j(中间用空格):1 2
输入w:6
输入i j(中间用空格):1 3
输入w:1
输入i j(中间用空格):1 5
输入w:3
输入i j(中间用空格):2 5
输入w:9
输入i j(中间用空格):2 4
输入w:8
输入i j(中间用空格):4 5
输入w:7
输入i j(中间用空格):4 3
输入w:2
输入i j(中间用空格):3 5
输入w:4

输出邻接矩阵:
   65535       6       1   65535       3
       6   65535   65535       8       9
       1   65535   65535       2       4
   65535       8       2   65535       7
       3       9       4       7   65535


输入i:3

深度优先搜索遍历:3->1->2->4->5->NULL
广度优先搜索遍历:3->1->4->5->2->NULL

--------------------------------
Process exited after 42.63 seconds with return value 0
请按任意键继续. . .



  • 29
    点赞
  • 180
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
二叉查找树(Binary Search Tree,BST)是一种二叉树,其中每个节点都包含一个关键字以及其对应的值。对于任意节点,左子树中的所有节点的关键字都小于该节点的关键字,右子树中的所有节点的关键字都大于该节点的关键字。 此外,BST 具有以下性质: - 在 BST 中进行查找、插入和删除操作的时间复杂度均为 O(log n),其中 n 为 BST 中节点的数量; - 中序遍历 BST 可以得到有序的节点序列; - 对于任意节点,其左子树和右子树均为 BST。 下面是 C 语言实现 BST 的代码: ```c #include <stdio.h> #include <stdlib.h> // BST 节点结构体 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 创建一个新的 BST 节点 struct TreeNode *createTreeNode(int val) { struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 在 BST 中查找节点 val struct TreeNode *findNode(struct TreeNode *root, int val) { if (root == NULL || root->val == val) { return root; } if (val < root->val) { return findNode(root->left, val); } else { return findNode(root->right, val); } } // 在 BST 中插入一个新的节点 val struct TreeNode *insertNode(struct TreeNode *root, int val) { if (root == NULL) { return createTreeNode(val); } if (val < root->val) { root->left = insertNode(root->left, val); } else { root->right = insertNode(root->right, val); } return root; } // 在 BST 中删除一个节点 val struct TreeNode *deleteNode(struct TreeNode *root, int val) { if (root == NULL) { return NULL; } if (val < root->val) { root->left = deleteNode(root->left, val); } else if (val > root->val) { root->right = deleteNode(root->right, val); } else { if (root->left == NULL) { struct TreeNode *temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct TreeNode *temp = root->left; free(root); return temp; } else { struct TreeNode *temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; root->right = deleteNode(root->right, temp->val); } } return root; } // 中序遍历 BST void inOrderTraversal(struct TreeNode *root) { if (root != NULL) { inOrderTraversal(root->left); printf("%d ", root->val); inOrderTraversal(root->right); } } int main() { struct TreeNode *root = NULL; root = insertNode(root, 5); root = insertNode(root, 3); root = insertNode(root, 7); root = insertNode(root, 1); root = insertNode(root, 9); printf("BST 中序遍历结果:"); inOrderTraversal(root); // 1 3 5 7 9 root = deleteNode(root, 3); printf("\nBST 删除节点 3 后中序遍历结果:"); inOrderTraversal(root); // 1 5 7 9 return 0; } ``` 以上代码实现了 BST 的查找、插入和删除操作,并且提供了中序遍历 BST 的函数。在 main 函数中,我们创建了一个 BST,插入了几个节点,然后进行了一次删除操作,并输出删除后的中序遍历结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值