鱼C论坛

 找回密码
 立即注册
查看: 4052|回复: 0

[学习笔记] 数据结构自用

[复制链接]
发表于 2021-6-29 16:25:22 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #define MAX 20

  4. typedef struct
  5. {
  6.         int vexs[MAX];
  7.         int arcs[MAX][MAX];
  8.         int len,ArcNum,VexNum;
  9. }NetGraph;

  10. void buigra(NetGraph *G)
  11. {
  12.         int i,j,k,s;
  13.         printf("请输入结点数和边数:");
  14.         scanf("%d %d",&G->VexNum,&G->ArcNum);
  15.         printf("请输入结点:\n");
  16.         for(i=0;i<G->VexNum;i++)
  17.         {
  18.                 scanf("%d",&G->vexs[i]);
  19.         }
  20.         printf("请输入边两端和权值:\n");
  21.         for(i=0;i<G->VexNum;i++)
  22.         {
  23.                 for(j=0;j<G->VexNum;j++)
  24.                 {
  25.                         G->arcs[i][j] = 0;
  26.                 }
  27.         }
  28.         for(k=0;k<G->ArcNum;k++)
  29.         {
  30.                 scanf("%d %d %d",&i,&j,&s);
  31.                 G->arcs[i-1][j-1] = s;
  32.                 G->arcs[j-1][i-1] = s;
  33.         }
  34. }

  35. void disng(NetGraph G)
  36. {
  37.         int i,j;
  38.         printf("%*s",2," ");
  39.         for(i=0;i<G.VexNum;i++)
  40.         {
  41.                 printf("%d ",G.vexs[i]);
  42.         }
  43.         printf("\n");
  44.         for(i=0;i<G.VexNum;i++)
  45.         {
  46.                 printf("%d ",G.vexs[i]);
  47.                 for(j=0;j<G.VexNum;j++)
  48.                 {
  49.                         printf("%d ",G.arcs[i][j]);
  50.                 }
  51.                 printf("\n");
  52.         }
  53. }

  54. void sholen(NetGraph G)
  55. {
  56.         int i, j, k=0, si, sj;
  57.         for(i=0;i<G.VexNum;i++)
  58.                 for(j=0;j<G.VexNum;j++)
  59.                 {
  60.                         if(G.arcs[i][j]!=0 && k==0)
  61.                         {
  62.                                 k = G.arcs[i][j];
  63.                                 si = G.vexs[i];
  64.                                 sj = G.vexs[j];
  65.                         }
  66.                         else if(G.arcs[i][j]!=0 && G.arcs[i][j]<k)
  67.                         {
  68.                                 k = G.arcs[i][j];
  69.                                 si = G.vexs[i];
  70.                                 sj = G.vexs[j];
  71.                         }
  72.                 }
  73.                 printf("最短的边是%d---%d",si,sj);
  74. }

  75. void insertarc(NetGraph *G)
  76. {
  77.         int i, j, s;
  78.         printf("请输入插入的边两端和权值:\n");
  79.         scanf("%d %d %d",&i,&j,&s);
  80.         G->arcs[i-1][j-1] = s;
  81.         G->arcs[j-1][i-1] = s;
  82.         printf("Finished!");
  83. }

  84. void delarc(NetGraph *G)
  85. {
  86.         int i, j;
  87.         printf("请输入要删除的边:\n");
  88.         scanf("%d %d",&i,&j);
  89.         G->arcs[i-1][j-1] = 0;
  90.         G->arcs[j-1][i-1] = 0;
  91.         printf("Finished!");
  92. }

  93. void getdu(NetGraph G)
  94. {
  95.         int i,j,n;
  96.         for(i=0;i<G.VexNum;i++)
  97.         {
  98.                 n = 0;
  99.                 for(j=0;j<G.VexNum;j++)
  100.                 {
  101.                         if(G.arcs[i][j]!=0)
  102.                                 n++;
  103.                 }
  104.                 printf("第%d个结点的度是%d\n",i+1,n);
  105.         }
  106. }

  107. void arrive(NetGraph G,int v,int key,int *flag,int visited[])
  108. {
  109.         int i;
  110.         if(G.vexs[v]==key)
  111.         {
  112.                 printf("Yes!");
  113.                 *flag = 1;
  114.                 return;
  115.         }
  116.         visited[v] = 1;
  117.         for(i=0;i<G.VexNum;i++)
  118.         {
  119.                 if(G.arcs[v][i]!=0 && visited[i]==0)
  120.                         arrive(G,i,key,flag,visited);
  121.         }
  122. }

  123. int menu()
  124. {
  125.         int n;
  126.         while(1)
  127.         {
  128.                 system("cls");
  129.                 printf("1.创建\t\t2.输出\t\t3.最短边\n");
  130.                 printf("4.插入边\t5.删除边\t6.求度\n");
  131.                 printf("7.可达性\t8.退出\n");
  132.                 printf("请选择功能:");
  133.                 scanf("%d",&n);
  134.                 return n;
  135.         }
  136. }

  137. void main()
  138. {
  139.         NetGraph G;
  140.         int n;
  141.         while(1)
  142.         {
  143.                 n = menu();
  144.                 switch(n)
  145.                 {
  146.                 case 1:{
  147.                         buigra(&G);
  148.                         system("pause");
  149.                         getchar();
  150.                         break;
  151.                            }
  152.                 case 2:{
  153.                         disng(G);
  154.                         system("pause");
  155.                         getchar();
  156.                         break;
  157.                            }
  158.                 case 3:{
  159.                         sholen(G);
  160.                         system("pause");
  161.                         getchar();
  162.                         break;
  163.                            }
  164.                 case 4:{
  165.                         insertarc(&G);
  166.                         system("pause");
  167.                         getchar();
  168.                         break;
  169.                            }
  170.                 case 5:{
  171.                         delarc(&G);
  172.                         system("pause");
  173.                         getchar();
  174.                         break;
  175.                            }
  176.                 case 6:{
  177.                         getdu(G);
  178.                         system("pause");
  179.                         getchar();
  180.                         break;
  181.                            }
  182.                 case 7:{
  183.                         int key,v,flag=0,visited[MAX]={0};
  184.                         printf("请输入两个点:");
  185.                         scanf("%d %d",&v,&key);
  186.                         arrive(G,v,key,&flag,visited);
  187.                         if(flag == 0) printf("NO!");
  188.                         system("pause");
  189.                         getchar();
  190.                         break;
  191.                            }
  192.                 case 8:{
  193.                         exit(0);
  194.                            }
  195.                 }
  196.         }
  197. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-12 21:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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