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

相关推荐
ll7788111 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
Akiiiira1 小时前
【数据结构】栈
数据结构
c6lala2 小时前
数据结构day1
数据结构
多多*2 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
逐光沧海2 小时前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
吃个早饭5 小时前
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
c语言·c++·蓝桥杯
kedvellek5 小时前
Linux 内核链表宏的详细解释
linux·运维·链表
qwertyuiop_i6 小时前
pe文件二进制解析(用c/c++解析一个二进制pe文件)
c语言·c++·pe文件
lybugproducer6 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
我叫珂蛋儿吖8 小时前
[redis进阶六]详解redis作为缓存&&分布式锁
运维·c语言·数据库·c++·redis·分布式·缓存