當前位置:首頁 » 服務存儲 » 圖的矩陣存儲轉為鏈式存儲
擴展閱讀
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,並且左右兩個子樹都是一棵平衡二叉樹。

二叉樹是樹的一種特殊情形,是一種更簡單而且應用更加廣泛的樹。