当前位置:首页 » 服务存储 » 图的矩阵存储转为链式存储
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

图的矩阵存储转为链式存储

发布时间: 2022-08-21 07:47:12

1. 【数据结构】怎么把图的邻接表表示转化为图的邻接矩阵表示

邻接表(Adjacency List):是图的一种链式存储结构。

在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的邻接表由两部分构成:表头结头、表结点组成的单链表。

2. C程序:从文件中读取矩阵数据,并显示出来,利用链式存储结构。

md.row;
p->
return
sm;
}
}
sm->,col,列数,数据这样存储的。
你这个不会是稀疏矩阵吧!
typedef
struct
{
int
row,矩阵每个维度的大小自然先读出来.d
=sm->
for(i=0;md=sm->
p->md;head.md;
typedef
struct
strucSparseMat
{
int
m;head;
p=p->
return
md;
}
读矩阵,如果储存了;count=i;head.md;p,如果数据个数也储存了就最好了。
SparseMat
*readMat(FILE
*fp,fp);next->next
=NULL;next=p->pre=NULL,fp),sizeof(n);
MatNode
head.d;next=(PMatNode)malloc(sizeof(MatNode));
p->head.md){
break;
}
else
{
p->,n;
int
count,fp);
p->md;
fread(&n,1,sizeof(n),fp);
fread(&count.col;
typedef
struct
struMatNode{
matdata
md;//
}SparseMat;i++)
{
if(!readdata(fp,sm->!fp)return
NULL;
if(feof(fp)
&&
;
p=&sm->head;md.col=sm->!md)return
NULL;
fread(md,1,sizeof(md);head.md,*PMatNode;p->.row=sm->head;
if(feof(fp))return
NULL;
if(,
SparseMat
*sm)
{
int
i;
PMatNode
p;
if(!fp)return
NULL;next;
//&sp->
}MatNode,要看情况了;
double
d;
}matdata,sizeof(count),1;//i<count
&&
!feof(fp);next->pre=p;
p->,1、列号、数据还可以这样存储矩阵!
一般都是行数;
p->!sm)return
NULL;
fread(&m;
struMatNode
*pre,*nxt;
matdata
*readdata(FILE
*fp,matdata
*md){
if(啥时候矩阵,开始流行用链表做了!
行号

3. 求把顺序结构存储的二叉树改为链式存储的算法!!!

VC2003平台成功编译运行,#include <stdio.h>
struct BTreeNode
{
char data;
BTreeNode *lchild, *rchild;
};BTreeNode *create(char* str, int pose, int size)
{
char ch;
BTreeNode * t;
char* p=str;
ch = p[pose]; if(ch==' '|| ch=='\n'|| pose>=size)
return NULL; // 表示空结点
else
{
t=(BTreeNode *)malloc(sizeof(BTreeNode)); //非空则构造新结点
t->data=ch; //新结点数据域即为读入字符
t->lchild=create(p, 2*pose+1,size); //建立左子树
t->rchild=create(p, 2*pose+2,size); //建立右子树
}
return(t);
}
void preorder(BTreeNode *root)
{
BTreeNode *t=root;
if(NULL!=t)
{
printf("%c", t->data); //访问根结点
preorder(t->lchild); //先序遍历左子树
preorder(t->rchild); //先序遍历右子树
}
}
//主函数
void main()
{
BTreeNode *root;
char a[20];
printf("给出建立二叉树的字符串:比如abcde\n");
scanf("%s", a);
root=create(a, 0,strlen(a)); printf("\n先序遍历序列: ");
preorder(root); printf("\n");
}

4. 根据用户的输入建立一个以邻接矩阵存储的无向图,然后转换为邻接表存储,最后进行深度优先搜索生成森林。

编写程序建立该图的邻接矩阵存储。
(2)编写程序建立该图的邻接表存储。(3)基于上图所建的存储结构,编写实现深度优先搜索算法和广度优先搜索算法

5. 急向高手求助:给定一个三元组矩阵还原成链式存储稀疏矩阵(C或C++实现)

//程序仅仅适用于你输入8组数字
#include<stdio.h>
void main()
{
int i,j,k,a[6][8],n=0;
for(i=0;i<6;i++)
for(j=0;j<8;j++)
a[i][j]=0;
while(n<8)//这里控制输入的个数
{
scanf("%d%d%d",&i,&j,&k);
a[i][j]=k;
n++;
}
for(i=0;i<6;i++)
{
for(j=0;j<8;j++)printf("%3d",a[i][j]);
printf("\n");
}
}

6. 图的存储结构——所存储的信息有哪些

一、邻接矩阵存储方法

邻接矩阵是表示顶点之间相邻关系的矩阵。

设G=(V,E)是具有n(n>0)个顶点的图,顶点的顺序依次为0~n-1,则G的邻接矩阵A是n阶方阵,其定义如下:

(1)如果G是无向图,则:

A[i][j]=1:若(i,j)∈E(G) 0:其他

(2)如果G是有向图,则:

A[i][j]=1:若<i,j>∈E(G) 0:其他

(3)如果G是带权无向图,则:

A[i][j]= wij :若i≠j且(i,j)∈E(G) 0:i=j ∞:其他

(4)如果G是带权有向图,则:

A[i][j]= wij :若i≠j且<i,j>∈E(G) 0:i=j∞:其他

注意:带权图和不带权图表示的元素类型不同。


带权图(不论有向还是无向图)A[i][j]用double表示,不带权图(不论有向还是无向图)A[i][j]用int表示。

用一维数组G[ ]存储有4个顶点的无向图如:G[ ] = { 0, 1, 0, 1, 1, 0, 0, 0, 1, 0 }

则顶点2和顶点0之间是有边的。

如:

邻接矩阵的特点如下:

(1)图的邻接矩阵表示是唯一的。

(2)无向图的邻接矩阵一定是一个对称矩阵。因此,按照压缩存储的思想,在具体存放邻接矩阵时只需存放上(或下)三角形阵的元素即可。

(3)不带权的有向图的邻接矩阵一般来说是一个稀疏矩阵。因此,当图的顶点较多时,可以采用三元组表的方法存储邻接矩阵。

(4)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。

(5)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。

(6)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。

邻接矩阵的数据类型定义如下:

#define MAXV <最大顶点个数>

typedef struct

{ int no; //顶点编号

InfoType info; //顶点其他信息

} VertexType; //顶点类型

typedef struct //图的定义

{ int edges[MAXV][MAXV]; //邻接矩阵

int n,e; //顶点数,弧数

VertexType vexs[MAXV]; //存放顶点信息

} MGraph; //图的邻接矩阵表示类型


二、 邻接表存储方法

图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法。

在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点i的边(对有向图是以顶点i为尾的边)。每个单链表上附设一个表头节点。

其中,表节点由三个域组成,adjvex指示与顶点i邻接的点在图中的位置,nextarc指示下一条边或弧的节点,info存储与边或弧相关的信息,如权值等。

表头节点由两个域组成,data存储顶点i的名称或其他信息,firstarc指向链表中第一个节点。

typedef struct ANode

{ int adjvex; //该边的终点编号

struct ANode *nextarc; //指向下一条边的指针

InfoType info; //该边的相关信息

} ArcNode; //边表节点类型


typedef struct Vnode

{ Vertex data; //顶点信息

ArcNode *firstarc; //指向第一条边

} VNode; //邻接表头节点类型

typedef VNode AdjList[MAXV]; //AdjList是邻接表类型

typedef struct

{ AdjList adjlist; //邻接表

int n,e; //图中顶点数n和边数e

} ALGraph; //完整的图邻接表类型


邻接表的特点如下:

(1)邻接表表示不唯一。这是因为在每个顶点对应的单链表中,各边节点的链接次序可以是任意的,取决于建立邻接表的算法以及边的输入次序。

(2)对于有n个顶点和e条边的无向图,其邻接表有n个顶点节点和2e个边节点。显然,在总的边数小于n(n-1)/2的情况下,邻接表比邻接矩阵要节省空间。

(3)对于无向图,邻接表的顶点i对应的第i个链表的边节点数目正好是顶点i的度。

(4)对于有向图,邻接表的顶点i对应的第i个链表的边节点数目仅仅是顶点i的出度。其入度为邻接表中所有adjvex域值为i的边节点数目。

例, 给定一个具有n个节点的无向图的邻接矩阵和邻接表。

(1)设计一个将邻接矩阵转换为邻接表的算法;

(2)设计一个将邻接表转换为邻接矩阵的算法;

(3)分析上述两个算法的时间复杂度。

解:

(1)在邻接矩阵上查找值不为0的元素,找到这样的元素后创建一个表节点并在邻接表对应的单链表中采用前插法插入该节点。

void MatToList(MGraph g,ALGraph *&G)

//将邻接矩阵g转换成邻接表G

{ int i,j,n=g.n; ArcNode *p; //n为顶点数

G=(ALGraph *)malloc(sizeof(ALGraph));

for (i=0;i<n;i++) //给所有头节点的指针域置初值

G->adjlist[i].firstarc=NULL;

for (i=0;i<n;i++) //检查邻接矩阵中每个元素

for (j=n-1;j>=0;j--)

if (g.edges[i][j]!=0)

{ p=(ArcNode *)malloc(sizeof(ArcNode));

//创建节点*p

p->adjvex=j;

p->nextarc=G->adjlist[i].firstarc;

//将*p链到链表头

G->adjlist[i].firstarc=p;

}

G->n=n;G->e=g.e;


}


(2)在邻接表上查找相邻节点,找到后修改相应邻接矩阵元素的值。

void ListToMat(ALGraph *G,MGraph &g)

{ int i,j,n=G->n;ArcNode *p;

for (i=0;i<n;i++)

{ p=G->adjlist[i].firstarc;

while (p!=NULL)

{ g.edges[i][p->adjvex]=1;

p=p->nextarc;

}

}

g.n=n;g.e=G->e;

}


(3)算法1的时间复杂度均为O(n2)。算法2的时间复杂度为O(n+e),其中e为图的边数。

7. 图论中图有哪些存储方式(前提:时间复杂度<n^2)

图的话,我也就知道:邻接矩阵,稀疏矩阵,和链式前加星。

8. matlab中图像转为矩阵存储后,矩阵的行、列数和矩阵中每个元素值分别代表什么,矩阵大小和图像大小有关吗

1 图像转为矩阵后,图像大小和矩阵大小是一样的。
2 图像的最小分辨单元是像素,每个图像有m*n个像素,m代表图像的长,n代表图像的宽;那么与图像对应的矩阵就有m行,n列,总共也有m*n个像素单元,(m,n)就代表该像素在图像中的位置,相当于把图像放到坐标系下,m代表横坐标,n代表纵坐标,(m,n)确定一个像素的位置;而(m,n)处的值代表图像中该点的灰度值,灰度值范围0-255。

9. 图的存储方式可以是顺序存储也可以是链式存储吗

是的。
线性表,树,图,都可以有顺序和链式两种存储方法。

10. 采用顺序存储方法和链式存储方法分别画出图6.1所示二叉树的存储结构。【在线等】

线性是线性,顺序是顺序,线性是逻辑结构,顺序是储存结构,两者不是一个概念。线性是指一个节点只有一个子节点,而树,或二叉树一个节点后有多个子节点,且子节点不能相互联系。

顺序存储可能会浪费空间(在非完全二叉树的时候),但是读取某个指定的节点的时候效率比较高。

链式存储相对二叉树比较大的时候浪费空间较少,但是读取某个指定节点的时候效率偏低。

二叉树的顺序存储,寻找后代节点和祖先节点都非常方便,但对于普通的二叉树,顺序存储浪费大量的存储空间,同样也不利于节点的插入和删除。因此顺序存储一般用于存储完全二叉树。

链式存储相对顺序存储节省存储空间,插入删除节点时只需修改指针,但回寻找指定节点时很不方便。不过普通答的二叉树一般是用链式存储结构。

(10)图的矩阵存储转为链式存储扩展阅读:

(1)完全二叉树——若设二叉树的高度为h,除第h层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

二叉树是树的一种特殊情形,是一种更简单而且应用更加广泛的树。