cs
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define MAXVex 20
typedef struct ArcNode
{
//int arcData;//这是权值,我们不需要暂时
int headVertex, tailVertex;//(vi,vj)入边->出边
struct ArcNode* nextHeadArc, * nextTailArc;//下一个出边地址 下一个入边地址
}ArcNode,*ArcList;
typedef struct VertexNode
{
char vertexData;
ArcList headList, tailList;//出边地址 入边地址
}VertexNode,*VertexList;
typedef struct
{
VertexList vertexList_arr;//VertexList类型数组
int numVertexs, numArcs;//顶点数+边数(弧);
}OLGraph;
//初始化十字链表
void initOLGraph(OLGraph* G)
{
G->numArcs = 0;
G->numVertexs = 0;
G->vertexList_arr = (VertexList*)malloc(MAXVex * sizeof(VertexNode));//给这个数组分配空间 20
int i;
for (i = 0; i < MAXVex; i++)
{
//出边地址和入边地址的指针全部申请空间
//指向头的的弧链表初始化
G->vertexList_arr[i].headList = (ArcNode*)malloc(sizeof(ArcNode));
G->vertexList_arr[i].headList->nextHeadArc = NULL;
G->vertexList_arr[i].headList->nextTailArc = NULL;
//指向尾的弧链表初始化
G->vertexList_arr[i].tailList = (ArcNode*)malloc(sizeof(ArcNode));
G->vertexList_arr[i].tailList->nextHeadArc = NULL;
G->vertexList_arr[i].tailList->nextTailArc = NULL;
}
printf("十字链表初始化成功\n");
}
void CreateOLGraph(OLGraph* G)
{
printf("请输入顶点数和边数\n");
scanf("%d%d", &G->numVertexs, &G->numArcs);
getchar();//吸收scanf残留的换行符
int i, j, k;
printf("请输入顶点的信息\n");
for (i = 0; i < G->numVertexs; i++)
{
scanf("%c", &G->vertexList_arr[i].vertexData);//3
}
for (k = 0; k < G->numArcs; k++)
{
printf("请输入(vi,vj)的边数,一共有%d条\n", G->numArcs);
scanf("%d%d", &i, &j);
ArcNode* s;
s = (ArcNode*)malloc(sizeof(ArcNode));
//(vi,vi)
s->headVertex = i;
s->tailVertex = j;
//由顶点的顺序结构出边地址指向s
//i是指向j的出度,那么j就是接收i的入度
s->nextHeadArc = G->vertexList_arr[i].headList->nextHeadArc;
G->vertexList_arr[i].headList->nextHeadArc = s;
s->nextTailArc = G->vertexList_arr[j].tailList->nextTailArc;
G->vertexList_arr[j].tailList->nextTailArc = s;
}
printf("十字链表创建完成\n");
}
void DisplayOLGraph(OLGraph G)
{
int i;
ArcNode* p;
for (i = 0; i < G.numVertexs; i++)
{
printf("顶点:%c\n", G.vertexList_arr[i].vertexData);
printf("\t出度: ");
p = G.vertexList_arr[i].headList;//p指向出度指针地址
while (p->nextHeadArc)//下一个出度不为NULL
{
p = p->nextHeadArc;//第一次指向第一个出度s 然后一直下一个出度地址
printf("(%c,%c) -> ",G.vertexList_arr[p->headVertex].vertexData,
G.vertexList_arr[p->tailVertex].vertexData);//p->headVertex -> i(0)即 V1
}
printf("NULL\n");
printf("\t入度: ");
p = G.vertexList_arr[i].tailList;//p指向入度的指针地址
while (p->nextTailArc)//下一个入度不为NULL
{
p = p->nextTailArc;//第一次指向第一个入度的s,然后一直下去找
printf("(%c,%c) -> ", G.vertexList_arr[p->headVertex].vertexData,
G.vertexList_arr[p->tailVertex].vertexData);
}
printf("NULL\n");
}
}
int main()
{
OLGraph G;
initOLGraph(&G);
CreateOLGraph(&G);
DisplayOLGraph(G);
return 0;
}
运行后终端输入内容如下:
十字链表初始化成功
请输入顶点数和边数
4 7
请输入顶点的信息
0123
请输入(vi,vj)的边数,一共有7条
0 1
请输入(vi,vj)的边数,一共有7条
0 2
请输入(vi,vj)的边数,一共有7条
3 0
请输入(vi,vj)的边数,一共有7条
3 1
请输入(vi,vj)的边数,一共有7条
3 2
请输入(vi,vj)的边数,一共有7条
2 0
请输入(vi,vj)的边数,一共有7条
2 3
十字链表创建完成
顶点:0
出度: (0,2) -> (0,1) -> NULL
入度: (2,0) -> (3,0) -> NULL
顶点:1
出度: NULL
入度: (3,1) -> (0,1) -> NULL
顶点:2
出度: (2,3) -> (2,0) -> NULL
入度: (3,2) -> (0,2) -> NULL
顶点:3
出度: (3,2) -> (3,1) -> (3,0) -> NULL
入度: (2,3) -> NULL