有向图的十字链表表示方法

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define OK 1
  4 #define NO 0
  5 #define TRUE 1
  6 #define FALSE 0
  7 #define ERROR -1
  8 #define MAX_VERTEX_NUM 20 //最大顶点个数
  9 typedef int Status;
 10 
 11 typedef struct ArcBox
 12 {
 13     int tailvex,headvex;   //该弧的头结点和尾结点  尾--->头
 14     struct ArcBox *hlink,*tlink;//分别指向具有相同弧头和相同弧尾的链域
 15 
 16 }ArcBox;
 17 
 18 typedef char VertexType_OL;//有向图的顶点类型
 19 typedef struct VexNode
 20 {
 21     VertexType_OL data;
 22     ArcBox *firstin,*firstout;//指向第一条入弧和出弧
 23 
 24 }VexNode;
 25 
 26 typedef struct
 27 {
 28     VexNode xlist[MAX_VERTEX_NUM+1];//表头向量
 29     int vexnum,arcnum;
 30 }OLGraph;
 31 
 32 Status CreateDG_OL(OLGraph *G);
 33 
 34 
 35 int LocateVex_AL(OLGraph G,VertexType_OL u);
 36 
 37 void OutputOLGraph(OLGraph G);
 38 
 39 int main(int argc,char**argv)
 40 {
 41     OLGraph G;
 42     printf("1\n函数CreateDG_OL等测试..\n");
 43     {
 44         printf("初始化有向图G..\n");
 45         CreateDG_OL(&G);
 46         printf("\n");
 47     
 48     }
 49     printf("15\n函数OutputOLGraph 测试..\n");
 50     {
 51         printf("输出有向图的十字链表 G=\n");
 52         OutputOLGraph(G);
 53         printf("\n");
 54     }
 55 
 56 
 57 
 58 
 59 return 0;
 60 }
 61 
 62 Status CreateDG_OL(OLGraph *G){
 63     int i,j,k;
 64     VertexType_OL v1,v2;
 65     ArcBox *p;
 66      printf("输入顶点数 ");
 67     scanf("%d",&(G->vexnum));
 68     printf("输入弧数 ");
 69     scanf("%d",&(G->arcnum));
 70     printf("输入各个顶点值 ");
 71     getchar();
 72     for(i=1;i<=G->vexnum;i++)
 73     {
 74         scanf("%c",&(G->xlist[i].data));
 75         G->xlist[i].firstin=NULL;
 76         G->xlist[i].firstout=NULL;
 77     }
 78     
 79     printf("读取各边,构造十字链表\n");
 80     for(k=1;k<=G->arcnum;k++)
 81     {
 82         getchar();
 83         printf("输入相邻结点(添加弧的信息)");
 84         scanf("%c%c",&v1,&v2);
 85         i=LocateVex_AL(*G,v1); //第i个结点的链表相连
 86         j=LocateVex_AL(*G,v2);
 87         p=(ArcBox*)malloc(sizeof(ArcBox));
 88         if(!p)
 89             exit(ERROR);
 90         p->tailvex=i;
 91         p->headvex=j;
 92         p->hlink=G->xlist[j].firstin;//把p插到第一个结点中去
 93         G->xlist[j].firstin=p;
 94         
 95         p->tlink=G->xlist[i].firstout;
 96         G->xlist[i].firstout=p;
 97     
 98     }
 99 
100 return OK;
101 
102 
103 
104 }
105 
106 
107 int LocateVex_AL(OLGraph G,VertexType_OL u)
108 {
109     int i;
110     for(i=1;i<=G.vexnum;i++)
111     {
112         if(G.xlist[i].data==u)
113             return i;
114     }
115     return 0;
116 
117 }
118 
119 void OutputOLGraph(OLGraph G){
120     int i,j;
121     ArcBox *p;
122     if(!G.arcnum&&!G.vexnum)
123         printf("空图!!\n");
124     else
125     {
126         for(i=1;i<=G.vexnum;i++)
127         {
128             printf("%c-> ",G.xlist[i].data);
129             p=G.xlist[i].firstout;
130             j=1;
131             while(p)   
132             {
133                 while(p->headvex!=j) //已经确定尾部都是i因此找到所有的头部存在的弧就好,另一端弧的head从小到大,因为输入的时候就是从大到小
134                 {
135                     printf("    ");
136                     j++;
137                 }
138                 printf("(%c,%c)",G.xlist[p->tailvex].data,G.xlist[p->headvex].data);
139                 p=p->tlink;
140                 j++;
141             
142             }
143         printf("\n");
144         
145         }
146     
147     
148     
149     }
150 
151 
152 
153 }

posted @ 2017-10-25 22:03  accomplishment  阅读(2023)  评论(0编辑  收藏  举报