图的十字链表。
#include <stdio.h>
#include <malloc.h>
typedef struct EdgeNode
{
int tailvex; // 弧的起点下标
int headvex; // 弧的终点下标
struct EdgeNode *headlink,*taillink;
}EdgeNode;
typedef struct VertexNode
{
int data; /*顶点信息*/
EdgeNode *firstin,*firstout;
}VertexNode;
typedef struct
{
VertexNode vertex[100];
int vexnum,edgenum; /*图的顶点数和弧数*/
}GraphAdjList;
void CrtOrthList(GraphAdjList *G)
{
int i,j,k;
EdgeNode *p;
printf("请输入图的顶点个数和弧的个数:");
scanf("%d%d",&G->vexnum,&G->edgenum);
for(i = 0; i<G->vexnum; i++)
{
printf("请输入下标为%d的顶点信息:",i);
scanf("%d",&G->vertex[i].data);
G->vertex[i].firstin = NULL;
G->vertex[i].firstout = NULL;
}
for(k=0;k<G->edgenum;k++)
{
printf("请输入第%d条弧的两个顶点下标:",k+1);
scanf("%d%d",&i,&j);
p = (EdgeNode*)malloc(sizeof(EdgeNode));
p->tailvex = i;
p->headvex = j;
p->taillink = G->vertex[i].firstout;
G->vertex[i].firstout = p;
p->headlink = G->vertex[j].firstin;
G->vertex[j].firstin = p;
}
printf("*****顶点的入度表示为******\n");
for(i = 0;i < G->vexnum;i++)
{
printf("以下标为%d的顶点为弧头的顶点下标有:",i);
while(G->vertex[i].firstin != NULL)
{
printf("< %d,%d > ",G->vertex[i].firstin->tailvex,i);
G->vertex[i].firstin = G->vertex[i].firstin->headlink;
}
printf("\n");
}
printf("******顶点的出度表示为******\n");
for(i = 0;i < G->vexnum;i++)
{
printf("以下标为%d的顶点为弧尾的顶点下标有:",i);
while(G->vertex[i].firstout != NULL)
{
printf("< %d,%d > ",i,G->vertex[i].firstout->headvex);
G->vertex[i].firstout = G->vertex[i].firstout->taillink;
}
printf("\n");
}
}
int main()
{
GraphAdjList G;
CrtOrthList(&G);
}