用c语言实现基本数据结构(图)

C语言的数据结构 本文系统地介绍了C语言中的基本数据结构,包括数组、链表、栈、队列、树和图等。不同的数据结构各有优缺点,适用于不同的应用场景。选择合适的数据结构不仅可以提高程序的效率,还能使得程序更加易于维护。在实际开发中,数据结构的选择常常决定了算法的效率。因此,掌握不同数据结构的特性及其实现方式,是每一个程序员必须具备的基本技能。希望本文能够为学习C语言及其数据结构的读者提供有价值的参考与帮助。 阅读详情

c语言实现基本数据结构(图)

图是基本的数据结构中比较复杂的了,相对于链表一类来说。因为忘了不少,于是参考了一下书上的代码。
(ps:感觉第一个难点是不知道怎么命名变量名…… ╮(╯▽╰)╭ )
图的表示方法有四种, 分别是

  1. 邻接矩阵表示法
  2. 邻接表表示法
  3. 十字链表表示法
  4. 临界多重表表示法

我只写了邻接表表示法和十字链表表示法。第一个很简单,最后一个不经常用。
下面是邻接表表示法的结构体

    /*
*邻接表表示法的结构体
*/
struct ArcNode{//边节点
	int adjvex;//该条边的头节点在数组中的位置
	struct ArcNode* nextarc;//与该条边的头节点的下一条边相连
};

struct VertexNode{//头节点
	char* nodeinfo;//节点信息|名字
	struct ArcNode* nextarc;//与该头节点相连的第一个边结点
};

typedef struct {//邻接表表示法的图结构
	struct VertexNode vertex[MAX];
	int vernum, arcnum;//节点数量和弧的数量
	GraphKind kind;//图的种类
}AdjList;

十字链表表示法的结构体

/*
*十字链表表示法的结构体
*/
typedef struct OrthArcNode{//弧节点
	int headvex;//该弧出发的节点
	int tailvex;//该弧结束的节点
	struct OrthArcNode* hlink;//该弧出发的节点的下一条节点
	struct OrthArcNode* tlink;//该弧结束的节点的下一条节点
}OrthArcNode;

typedef struct OrthVertexNode{//头节点
	char* nodeinfo;//节点的信息|名字
	struct OrthArcNode* firstin, *firstout;/*以该节点为出发点的第一条弧和以该节点为结束点的第一条弧*/
}OrthVertexNode;

typedef struct{//十字链表表示法的结构体
	OrthVertexNode vertex[MAX];
	int vernum, arcnum;//节点数量和弧的数量
	GraphKind kind;//图的种类
} OrthList;

方法有创建图和深度遍历图,深度遍历只有十字链表的,因为感觉相似就只写了一个:)

完整代码如下

#include<stdio.h>
#include<stdlib.h>

#define MAX 100
#define True 1
#define False 0
#define Error -1
#define OK 1

int visited[MAX];

typedef enum{DG, DN, UDG, UDN} GraphKind;

/*
*邻接表表示法的结构体
*/
struct ArcNode{//边节点
	int adjvex;//该条边的头节点在数组中的位置
	struct ArcNode* nextarc;//与该条边的头节点的下一条边相连
};

struct VertexNode{//头节点
	char* nodeinfo;//节点信息|名字
	struct ArcNode* nextarc;//与该头节点相连的第一个边结点
};

typedef struct {//邻接表表示法的图结构
	struct VertexNode vertex[MAX];
	int vernum, arcnum;//节点数量和弧的数量
	GraphKind kind;//图的种类
}AdjList;


/*
*十字链表表示法的结构体
*/
typedef struct OrthArcNode{//弧节点
	int headvex;//该弧出发的节点
	int tailvex;//该弧结束的节点
	struct OrthArcNode* hlink;//该弧出发的节点的下一条节点
	struct OrthArcNode* tlink;//该弧结束的节点的下一条节点
}OrthArcNode;

typedef struct OrthVertexNode{//头节点
	char* nodeinfo;//节点的信息|名字
	struct OrthArcNode* firstin, *firstout;/*以该节点为出发点的第一条弧和以该节点为结束点的第一条弧*/
}OrthVertexNode;

typedef struct{//十字链表表示法的结构体
	OrthVertexNode vertex[MAX];
	int vernum, arcnum;//节点数量和弧的数量
	GraphKind kind;//图的种类
} OrthList;

//创建一个邻接表表示法的图
void CreateAdjGraph(AdjList * g, int len){
	char* var;
	int temp, i = 0, j = 0;
	g->vernum = 0;
	g->arcnum = 0;
	for(int i = 0; i < len; i++){
		 var = (char*)malloc(10);
		scanf("%s", var);
		struct VertexNode node = {var, NULL};
		g->vertex[i] = node;
		g->vernum++;
	}
	while(i != -1){
		printf("please input arc-head\n");
		scanf("%d", &i);
		printf("please input arc-tail\n");
		scanf("%d", &temp);
		if(i > len || temp > len){
			printf("crossed!please re-enter\n ");
			continue;
		}
		struct ArcNode * arcnode = {temp, g->vertex[i].nextarc};
		g->vertex[i].nextarc = arcnode;
		g->arcnum++;
	}
}

//创建一个十字链表表示法的图
void CreateOrthGraph(OrthList *g, int len){
	char* var;
	int temp, i, j;
	g->vernum = 0;
	g->arcnum = 0;
	for(int i = 0; i < len; i++){
		var = (char*)malloc(10);
		scanf("%s", var);
		OrthVertexNode node = {var, NULL, NULL};
		g->vertex[i] = node;
		g->vernum++;
	}
	while(i != -1){
		printf("please input arc-head\n");
		scanf("%d", &i);
		printf("please input arc-tail\n");
		scanf("%d", &j);
		if(i >= len || j >= len){
			printf("crossed!please re-enter\n ");
			continue;
		}
		if( i == -1){
			break;
		}
		OrthArcNode * arcnode = (OrthArcNode *)malloc(sizeof(OrthArcNode));
		arcnode->tailvex = j;
		arcnode->headvex = i;
		arcnode->tlink = g->vertex[j].firstout;
		g->vertex[j].firstout = arcnode;
		arcnode->hlink = g->vertex[i].firstin;
		g->vertex[i].firstin = arcnode;
		g->arcnum++;
	}
}

//输出十字链表表示法的节点的信息|名称
void PrintVer(OrthVertexNode vertex){
	printf("%s ", vertex.nodeinfo);
};

void DepthFirstSearchOrth(OrthList *g,  int index,void (*visit)(OrthVertexNode vertex)){
	visit(g->vertex[index]);
	visited[index] = True;
	OrthArcNode *p = g->vertex[index].firstin;
	while(p != NULL){
		if(!visited[p->tailvex]) DepthFirstSearchOrth(g, p->tailvex, visit);
		p = p->hlink;
	}
}

//深度遍历十字链表表示法的图
void TraverseOrthGraph(OrthList *g, int len,void (*visit)(OrthVertexNode vertex)){
	for(int i = 0; i< len; i++){
		visited[i] = False;
	}
	for(int i = 0; i< len; i++){
		if(!visited[i]) DepthFirstSearchOrth(g, i, visit);
	}
}


未完待续

数据结构C语言实现全集(清华严蔚敏版) 本文还有配套的精品资源,点击获取 简介:《数据结构》是计算机科学的核心课程,关注数据在计算机内的组织和处理。严蔚敏教授的教材广受欢迎,并且本压缩包内含其教材所有C语言实现的代码示例,涵盖各种基础和高级数据结构,包括链表、栈、队列、树、图、排序和查找算法、哈希表等。这些代码不仅是学习理论知识的辅助材料,而且能够有效提升编程技巧,有助于深入理解数据结构,并将其应用于解决实际问题... 阅读详情

相关推荐

关于卷积过程中通道数如何变化问题

对卷积操作前后通道数问题进行解释,输出通道数=卷积核的个数。

你好,明天,,的博客 4315

数据结构之图

文章目录图图数据结构 C语言实现图基本方法声明和实现 C语言图遍历方法声明和实现 C语言参照 图 图是一种元素关系多对多的数据结构; 图分为有向图和无向图; 图的遍历方法分为深度遍历(DFS)和广度遍历(BFS); 无向图的最小生成树; 有向图的拓扑排序和关键路径; 有权图的单源最短路径和所有顶点的最短路径; 图数据结构 C语言实现 #define true 1 #define false 0...

jianming21的博客 369

基于Dify构建银行智能客服:从意图识别到多RAG架构的实战解析

本文深入解析了如何利用Dify平台构建银行智能客服系统。从传统客服痛点出发,详细阐述了基于意图识别精准分类用户需求,并通过多RAG架构解决知识混淆问题,实现高效、准确的业务响应。文章重点介绍了结合工具调用实现业务流程自动化,并强调了数据本地化部署、内容安全过滤等银行级安全合规实践,为金融行业AI应用提供了实战指南。

yog99的博客 926

c语言数组结构,结构数组及其定义和使用,C语言结构数组的详细说明

结构变量可以为一个学生存储一组信息,但是如果有10个学生该怎么办?是否要定义10个结构变量?上面的程序是否必须复制并粘贴10次?显然不可能结构体,然后使用数组. 结构中也有数组,称为结构数组. 它与上面提到的数字数组几乎相同,但应注意,结构数组的每个元素都是结构类型变量,其中包含结构中的所有成员项.定义结构数组的方法非常简单. 除了将变量更改为数组外,它与定义结构变量相同. 或者前面介绍的通用数组...

weixin_36450592的博客 1325

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

Starlink vs Kuiper vs OneWeb:三大低轨卫星网络架构对比与实战应用场景解析

本文对比分析了Starlink、Kuiper和OneWeb三大低轨卫星网络架构的技术差异与商业应用场景。从轨道设计、通信性能到商业落地,详细解析了各系统在近地卫星网络领域的独特优势与挑战,为未来全球宽带服务格局提供专业见解。

weixin_29255731的博客 807

C语言之常用结构图

结构体时一种数据类型 可以简单理解为int 只是需要自己定义 struct person { int age; int high; char name[20]; }; 简单的结构体定义如上所示 在使用结构体之前 需声明 struct person person1,*p,*p1=(struct person *)malloc(sizeof(struct person)); 这是...

weixin_42150905的博客 1599

Intel SGX Explained

计算机中最主要的资源是CPU和内存,由操作系统和虚拟管理系统等系统软件来管理这些资源。

hanqdi_的博客 3453

最短路径:迪杰斯特拉算法+弗洛伊德算法

最短路径:迪杰斯特拉算法+弗洛伊德算法

qq_63806300的博客 892

74、刀具磨损监测与寿命预测分析

本文综述了刀具磨损监测与寿命预测的研究现状,分析了力信号、功率信号、振动信号和声发射信号在刀具状态监测中的应用及其优缺点。介绍了当前常用的刀具寿命模型及故障诊断流程,并总结了基于不同信号的监测方法。文章指出,尽管已有多种方法在理论上取得进展,但在实际应用中仍面临挑战。未来研究方向包括采用更先进的神经网络、深入探索多信号融合技术以及有效利用工业大数据,以提升刀具状态识别的准确性与可靠性。

lstm7chronicler的博客 275

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 634

c语言数据结构--图

什么是图? 图是地图的图吗?我拿着地图想去哪就去哪吗?是滴,图是多对多的情况,对于去一个地方有不同的路径到达,两个地方往返都有不同的路径。图是由顶点和边或弧两部分组成的,可以分两个结构来分别存储。另外图上的任何顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系。图分为无向图、有向图、网图。 1、邻接矩阵 原理:顶点用一维数组来存储,边或弧用二维数组存储。 typedef struct { VertexType vexs[MAXVEX]; /* 顶点表 */ EdgeType a

weixin_56915787的博客 1781

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

图的基本数据结构及算法实现-c语言

1.导入库文件 #include <stdio.h> #include <stdlib.h> #include <math.h> 2.创建图的基本数据类型(元素) 主要有顶点数组、邻接矩阵、顶点数、弧数 #define Node 10 typedef struct { int vex[Node]; //顶点数组 int arcs[Node][Node]; //邻接矩阵 int vexNum, arcNum; //顶点数,弧数 }

qq_42867453的博客 1103

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

用c语言实现数据结构——图的基本操作(超详细)

功能:创建图,邻接矩阵的建立,图的深度优先搜索和广度优先搜素,克鲁斯卡尔算法和普里姆算法生成最小生成树等 #include<stdio.h> #include<stdlib.h> #include <string.h> #define ...

4051

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C语言数据结构 图 基本操作的实现

【代码】C语言数据结构 图 基本操作的实现。

2301_77527830的博客 660

[数据结构]c语言二叉树基本实现[附有递归展开图]

数据结构二叉树的基本实现与知识点

小羊study_sheep的博客 1661

[数据结构][C语言]图的基本介绍和操作实现之基本概念

图是一种较线性表和树更文复杂的数据结构。在线性表中,数据元素之间只有线性关系,每个元素只有一个直接前驱和直接后继;在树形结构中,数据元素之间有着明显的层次关系;而在图形结构中,节点间的关系是任意的,图中任意两个元素可能相关。

香菇的博客 3599

c语言实现判断有向图g中顶点i到顶点j是否有路径_数据结构-图(图的基本实现C++)...

一、图的概念图是一种比较复杂的非线性数据结构图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。图区分有向图和无向图1、无向图(Undirected graphs)如果图中任意两个顶点之间的边都是无向边,则称该图为无向图。无向图相关概念:顶点、边2、有向图(Directed graphs)如果图中任意...

weixin_32022555的博客 900

数据结构——图的C语言实现

1.什么是图? 2.图的抽象数据结构 3.如何在程序中表示一个图? 3.1 邻接矩阵 3.2 邻接表 4.图的遍历 4.1 深度优先搜索 4.2 广度优先搜索

zxr916的博客 4065

C语言完成算法与数据结构课程设计任务书,实现数据删除问题、图的基本操作与实现、表达式转换问题

数据删除问题。编写删除具有N个数据项的数组A中所有重复项的程序,返回A中仍有的数据项。要求运行时间在O(NlogN)。 图的基本操作与实现。 (1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;(2)求每个顶点的度,输出结果;(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:使用一个栈实现DFS);(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:使用一个队列实现BFS);(5)输入顶点x,查找图G:若存在含x的顶点,则删除该结点及与之

程序员象漂亮的博客 654

C语言数据结构-图-邻接表1-试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc

邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下: typedef int VertexType; typedef enum{ DG, UDG }GraphType; typedef struct ArcNode { int adjvex; InfoPtr *info; struct ArcNode *nextarc; }ArcNode; typedef struct VNode { Ve

aiqq136的博客 2733

数据结构(C语言)图的基本操作及应用

数据结构(C语言)图的基本操作及应用 图的基本操作及应用 用邻接表法创建无向图 以邻接表形式打印无向图 深度遍历无向图并打印 利用队列知识实现广度遍历无向图并打印 取各顶点在表中序号 头文件及数据 头文件定义及所需数据 #include <iostream> using namespace std; #define MAX 100 //最大顶点数 图存储结构 边...

qq_46043634的博客 1万+

数据结构课程设计(C语言版)

数据结构课程设计作业 分为顺序表、链表、顺序栈、循环队列、二叉树、图六个部分 包括基本操作和一些简单应用 所有代码上传至github,大家可以直接下载,记得点点star 链接:DataStructure-Algorithm-Project C语言 数据结构 线性表中的顺序表的基本操作集 C语言 数据结构 线性表的链式表示和实现 C语言 数据结构 栈的顺序表示和实现 C语言 数据结构 循环队列的表示和实现 C语言 数据结构 二叉树的基本操作 C语言 数据结构 图的邻接矩阵存储及基本操作

C语言/数据结构/数学建模/深度学习/生物信息 4761

数据结构(c语言)

c语言中掌握数据结构的重要性在C语言中,数据结构不仅是一种存储数据的方式,也是一种处理数据的方法,数据结构在其编程中起着至关重要的作用。综合以上内容,数据结构是程序设计的基础,这些数据结构在C语言中有着广泛的应用,它们可以根据具体问题的需求进行选择和组合,以实现高效、灵活的算法和程序。

2401_87647313的博客 4162

c语言实现图的基本操作--邻接矩阵存储,c语言实现图的基本操作--邻接矩阵存储...

利用邻接矩阵容易判定任意两个顶点之间是否有边(或弧)相连,并容易求得各个顶点的度。c语言代码实现如下:#include#include#define MAX_VER_NUM 50typedef char VertexType;typedef enum{DG,UDG}GraphType;typedef struct{VertexType vexs[MAX_VER_NUM]; //顶点向...

weixin_33209661的博客 1362
上一篇: c语言之重复声明变量
下一篇: JAVA常用api操作汇总
learnanddeath
博客等级 码龄9年 16粉丝 15原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值