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

相关推荐
VekiSon1 分钟前
ARM架构——C 语言+SDK+BSP 实现 LED 点灯与蜂鸣器驱动
c语言·开发语言·arm开发·嵌入式硬件
one____dream13 分钟前
【算法】合并两个有序链表
数据结构·python·算法·链表
好奇龙猫16 分钟前
【大学院-筆記試験練習:线性代数和数据结构(13)】
数据结构·线性代数
橘颂TA20 分钟前
【剑斩OFFER】算法的暴力美学——力扣 433 题:最小基因变化
数据结构·c++·算法·哈希算法
移幻漂流21 分钟前
C/C++内存掌控之道:从内存泄漏到零开销抽象的进阶之路
java·c语言·c++
chao_78925 分钟前
链表题解——相交链表【Leetcode】(最新版,核心思路)
数据结构·python·leetcode·链表
进击的小头35 分钟前
Git在C项目中的分支策略和规范
c语言·开发语言·git
历程里程碑39 分钟前
哈希1:两数之和:哈希表优化指南
java·开发语言·数据结构·c++·算法·哈希算法·散列表
sin_hielo1 小时前
leetcode 3314(位运算,lowbit)
数据结构·算法·leetcode
Remember_9931 小时前
【数据结构】深入理解排序算法:从基础原理到高级应用
java·开发语言·数据结构·算法·spring·leetcode·排序算法