有向图十字链表c语言(有向图的十字链表怎么画)

今天给各位分享有向图十字链表c语言的知识,其中也会对有向图的十字链表怎么画进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、面试准备之【数据结构】1——图2、十字链表表示稀疏矩阵,并求矩阵的加法,减法,乘法,运算要求用C语言3、数据结构(C语言)

面试准备之【数据结构】1——图

共有:邻接表,邻接矩阵

有向图独有:十字链表,边集数组  

无向图独有:邻接多重表  

一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

设图G有n个顶点,则邻接矩阵是一个nxn的方阵,定义为:Arc[i][j]=1,若vi,vj∈E或vi,vj∈E,反之等于0。

可以看出,无向图的邻接矩阵是对称矩阵,要想知道某个顶点的度,其实就是这个顶点vi在邻接矩阵中第i行(或第i列)的元素之和。

在有向图的邻接矩阵中,某个顶点的出(入)度是这个顶点vi在邻接矩阵中第i 行(列)的元素之和;

        我们发现,当图中的边数相对于顶点较少时,邻接矩阵是对存储空间的极大浪费。我们可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。回忆树结构的孩子表示法,将结点存入数组,并对结点的孩子进行链式存储,不管有多少孩子,也不会存在空间浪费问题。

邻接表的创建过程如下:

1)  图中顶点用一个一维数组存储,当然也可以用单链表来存储,不过用数组可以较容易的读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2)  图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则称为以vi为弧尾的出边表。

从图中我们知道,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息。

firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。

边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指

向边表中下一个结点的指针,比如v1顶点与v0、v2互为邻接点,则在v1的边表中,adjvex分别为v0的0和v2的2.

如果想知道某个顶点的度,就去查找这个顶点的边表中结点的各数。

若要判断顶点vi和vj是否存在边,只需要测试顶点vi的边表adjvex中是否存在结点vj的下标就行了。

若求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到的adjvex域对应的顶点就是邻接点。

有向图的邻接表中顶点vi的边表是指以vi 为弧尾 的弧来存储的,这样很容易就可以得到每个顶点的出度。

有时为了便于确定顶点的入度或以顶点为弧头的弧,可以建立一个有向图的逆邻接表,即对每个顶点vi都建立

一个链接为vi为弧头的表。如下图所示:

此时我们很容易就可以算出某个顶点的入度或出度是多少,判断两顶点是否存在弧也很容易实现。

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可

对于有向图来说,邻接表是有缺陷的。关心了出度问题,想了解入度就必须要遍历整个图才能知道。反之,逆邻接表解决了入度

却不了解出度的情况。有没有可能把邻接表和逆邻接表结合起来呢?

答案是肯定的,就是把它们整合在一起。这种存储有向图的方法是:十字链表(Orthogonal List).

我们重新定义顶点表结点结构为:   

|    data    |     firstin   |    firstout    |

其中firstin表示入边表头指针,指向该顶点的入边表中第一个结点,firstout表示出边表头指针,指向该顶点的出边表中的第一个结点。

重新定义的 边表 结点结构如下表:

|    tailvex    |    headvex    |    headlink    |    taillink    |

其中tailvex是指弧起点在顶点表的下标,headvex是指弧终点在顶点表中的下标,headlink是指入边表指针域,指向终点(弧头)相同的

下一条边,taillink是指出边表指针域,指向起点(弧尾)相同的下一条边。如果是带权值的网,还可以再增加一个weight域来存储权值。

如下图表示的十字链表:

顶点表依然是存入一个一维数组{v0,v1,v2,v3},以顶点v0来说,firstout指向的是出边表中的第一个结点v3。所以v0边表结点的headvex=3,

而tailvex其实就是当前顶点v0的下标0,由于v0只有一个出边顶点,所以headlink和taillink都是空。

这里虚线箭头的含义,其实就是逆邻接表的表示。对于v0来说,它有两条入边,分别来自顶点v1和v2。因此v0的firstin指向顶点v1的边表

结点中headvex为0的结点,虚线(1),接着由入边结点的headlink指向下一个入边顶点v2,虚线(2)。

对于顶点v1,它有一个入边顶点v2,2个出边顶点v0和v2,所以它的firstin指向顶点v2的边表结点中headvex为1的结点,虚线(3).

十字链表的好处就是因为把邻接表和逆邻接表整合在了一起,这样既容易找到以vi为尾的弧,也容易找到以vi为头的弧,因而容易求得

顶点的出度和入度。除了结构复杂一点外,其实创建图算法的时间复杂度和邻接表是相同的,因此很好的应用在有向图中。

十字链表主要是针对有向图的存储结构进行了优化,那么对于无向图的邻接表,有没有问题呢?如果我们在无向图的应用中,关注的重点是顶点,那么邻接表是不错的选择,但如果我们更关注边的操作,比如对已访问过的边做标记,删除某一条边等操作,那就意味着需要找到这条边的两个边表结点进行操作。如下图,若要删除(v0,v2)这条边,需要对邻接表结构中右边表的两个结点进行删除,显然这是比较繁琐的。

因此,我们也仿照十字链表的方式,对边表结点的结构进行一些改造,重新定义的边表结点结构如下表:

|    ivex    |     ilink    |     jvex    |     jlink    |

其中ivex和jvex是指某条边依附的两个顶点在顶点表中的下标。ilink指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。

这就是邻接多重表结构。如上图有4个顶点和5条边,先将边表结点画出来。由于是无向图,所以ivex,jvex正反过来都可以,为了绘图

方便,都将ivex值设置的与一旁的顶点下标相同。

下面开始连线,首先连线的(1)(2)(3)(4)是将顶点的firstedge指向一条边,顶点下标要与ivex的值相同。接着,由于顶点v0的(v0,v1)边的

邻边有(v0,v3)和(v0,v2)。因此(5)(6)的连线就是满足指向下一条依附于顶点v0的边的目标,注意ilink指向的结点的jvex(ivex)一定要与它本身

的jvex(ivex)的值相同。同理,连线(7)就是指(v1,v0)这条边,它是相当于顶点v1指向(v1,v2)边后的下一条。v2有三条边依附,所以(3)之后就有

了(8)(9)。连线(10)就是顶点v3在连线(4)之后的下一条边。左图一共有5条边,所以右图有10条连线,完全符合预期。

邻接多重表与邻接表的差别, 仅仅是在于同一条边在邻接表中用两个边表结点表示,而在邻接多重表中只有一个结点 。这样对边的操作就方便

多了,若要删除左图的(v0,v2)这条边,只需要将右图的(6)(9)的链接指向改为^即可。

—- 边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。

如上图所示,边集数组关注的是边的集合,在边集数组中要查找一个顶点的度需要扫描整个边数组,效率并不高。因此它更适合对边依次

进行处理的操作,而不适合对顶点相关的操作

路径长度:路径上各活动持续时间的总和(即路径上所有权之和)。

完成工程的最短时间:从工程开始点(源点)到完成点(汇点)的最长路径称为完成工程的最短时间。

关键路径:路径长度最长的路径称为关键路径。

二分图是一类特殊的图,又称为双分图、二部图、偶图。二分图的顶点可以分成两个互斥的独立集 U 和 V 的图,使得所有边都是连结一个 U 中的点和一个 V 中的点。顶点集 U、V 被称为是图的两个部分。等价的,二分图可以被定义成图中所有的环都有偶数个顶点。可以将 U 和 V 当做一个着色:U 中所有顶点为蓝色,V 中所有顶点着绿色,每条边的两个端点的颜色不同,符合图着色问题的要求。相反的,非二分图无法被二着色

完全二分图 是一种特殊的二分图,可以把图中的顶点分成两个集合,使得第一个集合中的所有顶点都与第二个集合中的所有顶点相连。

欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路,相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。欧拉证明了如下定理: 一个非空连通图是欧拉图当且仅当它的每个顶点的度数都是偶数。 由此可得如下结论:一个连通图有欧拉迹当它至多有两个度数是奇数的顶点。

AOE网Activity On Edge Network:在现代化管理中,人们常用有向图来描述和分析一项工程的计划和实施过程,一个工程常被分为多个小的子工程,这些子工程被称为活动(Activity),在带权有向图中若以顶点表示事件,有向边表示活动,边上的权值表示该活动持续的时间,这样的图简称为AOE网。

图的存储结构-邻接助阵和邻接表  

图的存储结构-十字链表和邻接多重表

十字链表表示稀疏矩阵,并求矩阵的加法,减法,乘法,运算要求用C语言

十字链的原理很简单啊。实现也比较简单。i,here, give you the defination of the node.and you can build a cross_linkList by yourself or you can take a look at what the above writing.

定义一个表头结点数据类型,实现的时候定义一个数组即可。

typedef struct node{

int vex;//顶点

struct *node *first;//指向第一个与其有联系的结点

}ListNode;

然后再定义一个结点的类型,

typedef struct node{

int vexNum;//顶点编号

int vexData;//顶点数据

struct *node *next;//指向其它与表头结点有联系的结点

}Node;

矩阵的加法是对应项相加,那么你只需要把用十字链表示的两个矩阵中,对应项相加即可。具体来说,对每个顶点,在表头表中查找,然后再查找与其有联系的结点。指针后移,比较两个十字链表中是否存在两个相同的结点,有,则相加,将结果保存到其中一个十字链表中。否则,不变。依次查找其他的顶点。就可以得到结果。

ListNode head1,head2;

Node *p,*q;

p=head1-frist;

q=head2-first;

while(!p)

{

while(!q)

{

if(p-vexNum==q-vexNum)

{

p-vexData+=q-vexData;//put the result into the first cross_linkList;

break;//

}

q=q-next;

}

p=p-next;

}

the implement of adding is just like what i writing above.

And the others are similar .you can do it by yourself.trust youself.

有向图十字链表c语言(有向图的十字链表怎么画)

数据结构(C语言)

1. B

原因:

A:无向图的邻接矩阵一定是对称的,但是对称的不都是无向图,因为有向图也有可能对称

B:显然。。。。最容易,因为看任意两个点可以从行或者列任意挑一个,然后看相交点是否为1就行了

C:邻接表相当的不好看

D:十字链表也不容易

2. top – base + 1

3.返回值为-1,说明linklist为空,同时把函数的参数x插入linklist

返回值为0,说明linklist中有内容为x的元素

返回值为1,说明linklist不为空,但是没有内容为x的元素,同时把函数的参数x插入linklist

r-data*=x 的意思是 r-data = r-data*x

S1就是做了一个判断linklist是否为空,如果为空把x插入到linklist里面的工作

S2就是遍历linklist的所有内容,查找是否有内容为x的元素,如果有把data里面存放的数乘以x,然后再放回到data里面。

最后的if就是对S2做最后的补充,因为在执行S2的时候,把原来的数据换成原来的数据乘以x了,所以就再添加进去。

我觉得编写这个程序的人,有点绕路了,既然后来填进去,当初何必改呢。。。。。。

4.用冒泡排序的算法,虽然算法的复杂度高(指的是算法效率不高),但是算法简单易懂,基本上所有的新手书上都有。

(1)让初始值为1,步长为2,做一次冒泡排序就行了

(2)让初始值为2,步长为2,做一次冒泡排序就行了

(3)count = 0;

for (i = 0; i lengthof(a); i++) {

for (j = 0; j lengthof(a); j+ {

if (a[i]==a[j]) count++;

};

};

这是一段伪代码,可以作为参考

有向图十字链表c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于有向图的十字链表怎么画、有向图十字链表c语言的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月2日 10:30:08
下一篇 2024年4月2日 10:38:19

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4400
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4400
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7200
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6300
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4800
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3400
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4300

发表回复

登录后才能评论



关注微信