Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156315
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: C/C++

2012-09-03 10:48:34

图的创建有两种方法,一种是邻接矩阵,一种是邻接表,邻接矩阵的相对比较好理解,它就是使用一个一维数组存放顶点信息,使用一个二维数组存放弧(边长)。而邻接表将它存放成了两个表的形式,一个叫做“边表”,一个叫做“表头节点表”。表头节点表中存放的就是各个节点的信息,而边表中存放的是与他临接的节点的序列号。
1:创建算法
也就是先用一个函数寻找这个节点在二维数组中的位置,然后返回,在这个新的函数中,先是各种初始化活动,如果有权值的话就设置权值,没有权值的话就采用“1”表示邻接,用”0“表示邻接不上。具体代码见下面例子。
2:深度优先,广度优先:
深度优先相当于从一条路一直走到无路可走。
广度优先相当于将每个节点的路都走过一遍,然后返回接着走。
具体算法见下面例子:

点击(此处)折叠或打开

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

  3. #define MAX 20
  4. #define INFINITY 32768
  5. #define ERROR 0
  6. #define OK 1
  7. typedef enum
  8. {
  9.     DG,DN,UDG,UDN
  10. }GraphKind;

  11. typedef char VetexData;
  12. typedef struct ArcNode
  13. {
  14.     int adj;
  15.     int info;
  16. }ArcNode;

  17. typedef struct
  18. {
  19.     VetexData vertex[MAX];//记录顶点的顶点数组
  20.     ArcNode arcs[MAX][MAX];//记录邻接矩阵
  21.     int vexnum,arcnum;//顶点数和弧数
  22.     GraphKind kind;
  23. }AdjMatrix;
  24. typedef struct Node
  25. {
  26.     int data;
  27.     struct Node *next;
  28. }SeqNode;
  29. typedef struct node
  30. {
  31.     SeqNode *front;
  32.     SeqNode *rear;
  33. }SeqQueue;
  34. void InitQueue(SeqQueue *Q)
  35. {
  36.     Q->front=Q->rear=NULL;
  37. }
  38. int Isempty(SeqQueue *Q)
  39. {
  40.     if(Q->front==Q->rear)
  41.         return OK;
  42.     else
  43.         return ERROR;
  44. }
  45. int EnterQueue(SeqQueue *Q,int x)
  46. {
  47.     SeqNode *NewNode;
  48.     NewNode=(SeqNode *)malloc(sizeof(SeqNode));
  49.     if(NewNode==NULL)
  50.     {
  51.         printf("内存分配失败!\n");
  52.         return ERROR;
  53.     }
  54.     NewNode->data=x;
  55.     NewNode->next=NULL;
  56.     if(Q->rear==NULL)
  57.         Q->front=Q->rear=NewNode;
  58.     else
  59.     {
  60.         Q->rear->next=NewNode;
  61.         Q->rear=NewNode;
  62.     }
  63.     return OK;    
  64. }
  65. int DeleteQueue(SeqQueue *Q,int *x)
  66. {
  67.     SeqNode *p;
  68. //    if(Q->front==Q->rear)
  69. //        return ERROR;
  70.     p=Q->front;
  71.     Q->front=Q->front->next;
  72.     if(Q->rear==p->next)
  73.         Q->rear=Q->front;
  74.     *x=p->data;
  75.     free(p);
  76.     return OK;
  77. }
  78. int LocateVetex(AdjMatrix *G,VetexData v)//寻找顶点位置
  79. {
  80.     int j=ERROR;
  81.     int k;
  82.     for(k=0;k<G->vexnum;k++)
  83.         if(G->vertex[k]==v)
  84.         {
  85.             j=k;
  86.             break;
  87.         }
  88.     return j;
  89. }
  90. void OutPut(AdjMatrix G)
  91. {
  92.     int i,j;
  93.     for(i=0;i<G.vexnum;i++)
  94.         printf("%c ",G.vertex[i]);
  95.     printf("\n");
  96.     for(i=0;i<G.vexnum;i++)
  97.     {
  98.         for(j=0;j<G.vexnum;j++)
  99.             printf("%d ",G.arcs[i][j].adj);
  100.         printf("\n");
  101.     }
  102. }
  103. int CreateDN(AdjMatrix *G)
  104. {
  105.     char ch;
  106.     int i,j,k,weight;
  107.     int m,n;
  108.     VetexData v1,v2;
  109.     printf("请输入图的顶点数目和弧数目:");
  110.     scanf("%d %d",&G->vexnum,&G->arcnum);
  111.     setbuf(stdin,NULL);
  112.     printf("请输入顶点:");
  113.     ch=getchar();
  114.     i=0;
  115.     while(i<G->vexnum)
  116.     {
  117.         G->vertex[i]=ch;
  118.         i++;
  119.         ch=getchar();
  120.         fflush(stdin);
  121.     }
  122.     printf("顶点输入完毕,请输入邻接矩阵:\n");
  123.     for(i=0;i<G->vexnum;i++)
  124.         for(j=0;j<G->vexnum;j++)
  125.             G->arcs[i][j].adj=INFINITY;
  126.     OutPut(*G);
  127.     m=0;
  128.     n=0;
  129.     for(k=0;k<G->arcnum;k++)
  130.     {
  131.         
  132.         printf("请输入邻接矩阵:");
  133.         fflush(stdin);
  134.         scanf("%c%c%d",&v1,&v2,&weight);
  135.         getchar();
  136.         printf("%c %c %d\n",v1,v2,weight);
  137.      m=LocateVetex(G,v1);
  138.         n=LocateVetex(G,v2);
  139.         printf("%d %d\n",m,n);
  140.         G->arcs[m][n].adj=weight;
  141.     }

  142.     return OK;
  143. }
  144. //深度优先
  145. int visited[MAX];
  146. void DFS(AdjMatrix G,int v)
  147. {
  148.     int w;
  149.     printf("%c ",G.vertex[v]);
  150.     visited[v]=OK;
  151.     for(w=0;w<G.vexnum;w++)
  152.     {
  153.         if(!visited[w]&&G.arcs[v][w].adj!=INFINITY)
  154.             DFS(G,w);
  155.     }
  156. }
  157. void DSF_Traverse(AdjMatrix G)
  158. {
  159.     int i;
  160.     for(i=0;i<G.vexnum;i++)
  161.         visited[i]=ERROR;
  162.     for(i=0;i<G.vexnum;i++)
  163.         if(!visited[i])
  164.             DFS(G,i);
  165. }

  166. //广度优先
  167. void BFS(AdjMatrix G,int v)
  168. {
  169.     int w,i;
  170.     SeqQueue Q;
  171.     InitQueue(&Q);
  172.     printf("%c ",G.vertex[v]);
  173.     visited[v]=OK;
  174.     EnterQueue(&Q,v);
  175.     while(Q.front!=NULL)
  176.     {
  177.         DeleteQueue(&Q,&w);
  178.         for(i=0;i<G.vexnum;i++)
  179.         {
  180.             if(!visited[i]&&G.arcs[w][i].adj!=INFINITY)
  181.             {
  182.                 printf("%c ",G.vertex[i]);
  183.                 visited[i]=OK;
  184.                 EnterQueue(&Q,i);
  185.             }
  186.         }
  187.     }

  188. }
  189. int main()
  190. {
  191.     AdjMatrix G;
  192.     int v;
  193.     CreateDN(&G);
  194.     OutPut(G);
  195.     printf("深度优先遍历的结果:");
  196.     DSF_Traverse(G);
  197.     printf("\n");
  198.     printf("广度优先遍历的结果:");
  199.     for(v=0;v<G.vexnum;v++)
  200.         BFS(G,v);
  201.     printf("\n");

  202. }

阅读(2066) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~