数据结构十字链表(C语言代码)

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

相关推荐
没书读了5 小时前
考研复习-数据结构-第六章-图
数据结构
future14128 小时前
C#进阶学习日记
数据结构·学习
Alfred king9 小时前
面试150 LRU缓存
链表·缓存·哈希表·lru·双向链表
ChoSeitaku11 小时前
NO.4数据结构数组和矩阵|一维数组|二维数组|对称矩阵|三角矩阵|三对角矩阵|稀疏矩阵
数据结构·人工智能·矩阵
Paper Clouds12 小时前
代码随想录|图论|15并查集理论基础
数据结构·算法·leetcode·深度优先·图论
Paper Clouds12 小时前
代码随想录|图论|14有向图的完全可达性
数据结构·算法·深度优先·图论·宽度优先
遇见尚硅谷12 小时前
C语言:游戏代码分享
c语言·开发语言·算法·游戏
闻缺陷则喜何志丹13 小时前
【并集查找 虚拟节点】P1783 海滩防御|省选-
数据结构·c++·洛谷·并集查找·虚拟节点
GGBondlctrl14 小时前
【leetcode】字符串,链表的进位加法与乘法
算法·leetcode·链表·字符串相加·链表相加·字符串相乘
Jess0714 小时前
归并排序递归法和非递归法的简单简单介绍
c语言·算法·排序算法