数据结构十字链表(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

相关推荐
楼台的春风1 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
夏末秋也凉1 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
王老师青少年编程2 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛
liuyuzhongcc5 小时前
List 接口中的 sort 和 forEach 方法
java·数据结构·python·list
计算机小白一个6 小时前
蓝桥杯 Java B 组之背包问题、最长递增子序列(LIS)
java·数据结构·蓝桥杯
卑微的小鬼6 小时前
数据库使用B+树的原因
数据结构·b树
cookies_s_s6 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
醉城夜风~8 小时前
[数据结构]双链表详解
数据结构
gyeolhada9 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~9 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先