1. 程式人生 > >用鄰接表表示圖

用鄰接表表示圖

鄰接表圖的常用儲存結構之一,由表頭結點和表結點兩部分組成,其中表頭結點儲存圖的各頂點,表結點用單向連結串列儲存表頭結點所對應頂點的相鄰頂點(也就是表示了圖的邊)。在有向圖裡表示表頭結點指向其它結點(a->b),無向圖則表示與表頭結點相鄰的所有結點(a—b)

以一個無向圖為例


結構定義:

//表頭結點(表示圖的頂點)
struct vnode{
       char data;             //頂點資料,這裡用字元表示
       struct arcnode * firstarc;   //指標指向第一條邊 
};
//表結點(表示圖的邊)
struct arcnode{
       int wt;           //權重
       int adjvex;     //頂點下標
       struct arcnode *nextarc;   //指標指向下一條邊
};
typedef struct arcnode * Arc;
//圖
struct mgraph{
       struct vnode vexs[100];
       int vexsnum,arcnum;     //頂點數,邊數
} *g;
typedef struct mgraph* Graph;

建圖並輸出圖

int findadj(char vexs,Graph g){
	int i;
	for(i=1;i<=g->vexsnum;i++){
		if(vexs==g->vexs[i].data)
			break;
	}
	return i;  
}

//建圖
Graph creategraph(){
	      Graph g1;
          char vex;
          g1=(Graph)malloc(sizeof(struct mgraph));
          g1->arcnum=0;
          g1->vexsnum=0;
		  printf("輸入頂點,輸入-代表結束\n");
		  scanf("%c",&vex);    //輸入頂點
		  while(vex!='-'){         //輸入-後迴圈結束
			  g1->vexsnum++;
			  g1->vexs[g1->vexsnum].data=vex;      //這裡的結構陣列vexs[]下標從1開始
			  g1->vexs[g1->vexsnum].firstarc=NULL;
			  printf("輸入下一個頂點,輸入-代表結束\n");
		      scanf(" %c",&vex);         //%c前面加空格防止讀取回車
		  }
		  int i;
		  int w;           //邊的權重
		  int adjvex;    //頂點的下標
		  char avex;    //邊的另一個頂點
		  Arc p,b;
		  for(i=1;i<=g1->vexsnum;i++){
			  printf("輸入%c的相鄰頂點,輸入-代表結束",g1->vexs[i].data);
			  scanf(" %c",&avex);
			  while(avex!='-'){    //輸入-後迴圈結束
			      adjvex=findadj(avex,g1);
				  printf("輸入邊%c%c的權重\n",g1->vexs[i].data,avex);
				  scanf("%d",&w);
				  b=(Arc)malloc(sizeof(struct arcnode));
				  b->adjvex=adjvex;
				  b->wt=w;
				  b->nextarc=NULL;
				  //連結串列追加結點
				  p=g1->vexs[i].firstarc;
				  if(p!=NULL){
					  while(p->nextarc!=NULL)
						  p=p->nextarc;
					  p->nextarc=b;
				  }else
					  g1->vexs[i].firstarc=b;
				  g1->arcnum++;        
				  printf("輸入%c的相鄰頂點,輸入-代表結束",g1->vexs[i].data);
				  scanf(" %c",&avex);
			   }
		  }
	  return g1;
}

//圖的輸出
void printgraph(Graph g){
	int i,k;
	Arc p;
	printf("———鄰接表————\n");
	for(i=1;i<=g->vexsnum;i++){
		printf("%c  ->",g->vexs[i].data);
		p=g->vexs[i].firstarc;
		while(p!=NULL){
			printf("%4c",g->vexs[i].data);
			k=p->adjvex;
			printf("%2c",g->vexs[k].data);
			printf("%2d",p->wt);
			if(p->nextarc!=NULL)
			printf("  ->");
			p=p->nextarc;
		}
		printf("\n");
	}
	printf("\n");
    printf("—————————\n");
	printf("頂點總數為%4d\n",g->vexsnum);
	printf("邊的總數為%4d\n",g->arcnum);
}

void main(){
	 g=creategraph();
	 printgraph(g);
}


控制檯輸出


相關推薦

鄰接表示

鄰接表:圖的常用儲存結構之一,由表頭結點和表結點兩部分組成,其中表頭結點儲存圖的各頂點,表結點用單向連結串列儲存表頭結點所對應頂點的相鄰頂點(也就是表示了圖的邊)。在有向圖裡表示表頭結點指向其它結點(a->b),無向圖則表示與表頭結點相鄰的所有結點(a—b) 以一個無

鄰接表示

還要 day size tro OS 信息 def sizeof 指針 對於鄰接表,G[N]為指針數組,對應矩陣每行一個鏈表,只存非0元素 指針數組裏的每一個指針都是一個單鏈表的頭指針,單鏈表裏每個節點裏存儲的是圖中每條邊的信息。 鄰接表包括一個頂點表和一個邊表。頂點表包

鄰接表示(有向、無向)及廣度、深度遍歷)

鄰接表表示圖 #include <iostream> #include <malloc.h> #include <queue> using namespace std; #define VertexType char #define MaxVerte

鄰接矩陣,鄰接表示,深度優先遍歷

#include <stdio.h> #include <stdlib.h> bool visited[vernum]; int main() {     printf("Hello world!\n");     return 0; } void

12.boost有向無向鄰接表示

blog 所有結點 ace 都是 col vector fin std pan 1 #include <iostream> 2 #include <boost/config.hpp> 3 //圖(矩陣實現) 4 #include <b

鄰接實現無向的建立與輸出

1 #include<stdio.h> 2 #include <iostream> 3 #include<algorithm> 4 using namespace std; 5 #define MVNum 100 6 typedef struct ArcN

第十二週專案2 - 操作鄰接儲存的

/*Copyright (c) 2015, 煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:H1.cpp * 作者:辛志勐 * 完成日期:2015年11月20日 * 版本號:VC6.0 * 問題描述:操作用鄰接表儲存的圖 * 輸入描述:無 * 程式輸出:(1)

鄰接矩陣與鄰接表示法)

圖的鄰接矩陣表示法  #define MaxVertexNum 100 /* 最大頂點數設為100 */ #define INFINITY 65535 /* ∞設為雙位元組無符號整數的最大值65535*/ typedef int Vertex;

第十一週 【專案2-操作鄰接儲存的

/*   *Copyright  (c)2017,煙臺大學計算機與控制工程學院       *All rights reservrd.       *作者:趙楷文  *完成時間:2017年11月09日       *版本號:v1.0       *問題描述:假

鄰接表示法的單源最短路徑 Dijkstra演算法

           要求帶權有向圖中某一頂點到其他各頂點的最短路徑,常用Dijkstra演算法,該演算法基本思想是,先將圖的頂點分為兩個集合,一個為已求出最短路徑的終點集合(開始為原點v1),另一個為還未求出最短路徑的頂點集合(開始為除v1外的全部結點),然後按最短路徑長

資料結構 鄰接表示轉換成鄰接矩陣表示的演算法

圖的鄰接表表示轉換成鄰接矩陣表示的演算法。 下面這個是有向圖鄰接表表示轉換成鄰接矩陣 #include <stdio.h> #include <string.h> #include <stdlib.h> int a[100][100];

看資料結構寫程式碼(36) 鄰接表示與實現

圖的鄰接表表示法,是為每一個頂點建立一個連結串列,連結串列裡存放著相同弧尾的 弧的資訊,這些連結串列順序存放在陣列中。下面是無向圖g2的鄰接表  鄰接表 比 鄰接矩陣 節省空間,同時 也帶來一些操作上的 不便,例如 看 兩個頂點是否 相鄰,需要 遍歷 連結串列,在 求 無

鄰接表示及遍歷

圖也可以用鄰接表表示。各個結點中存放了結點的資訊,並且由一個指標變數,指向第一條邊,第一條變又指向第二條邊,以此類推。圖的鄰接表的程式碼如下: /********************************/ /******圖的鄰接表的建立及遍歷****/ #inclu

Java鄰接表示加權有向,附dijkstra最短路徑演算法

圖這種adt(abstract data type)及相關的演算法,之前一直是我未曾涉足過的領域。 主要是作為一個小測試,在平常的工作中也用不著,就算面試,至今也未曾碰到過相關考題。 但是前幾天,原公司的小美女談到面試過程中就碰到一題: 從A到B,有多條路線,要找出最短路

的常用演算法的 python 實現—鄰接表示

#圖的鄰接連結串列表示法 graph = {'A': ['B', 'C'], 'B': ['C', 'D'], 'C': ['D'], 'D': ['C','G','H'],

鄰接儲存有向實現的dfs和bfs

#include<iostream> #include<stdlib.h> #define MAX 20 using namespace std; class ArcNode { public: int adjvex; //儲存弧的終止位置 Ar

鄰接表示法(C語言)

鄰接表 鄰接表資料結構型別如下: #define MaxVertices 100 typedef struct node{ //邊表 int adjvex; node*

鄰接表示

描述 圖的表示除了鄰接矩陣表示,還可以使用連結串列陣列。對每個頂點(表頭節點)建立一個單鏈表,第i個單鏈表中節點表示依附於頂點vi 的邊(對有向圖而言,是以頂點vi為尾的弧)。所以在鄰接表中,除了節點外,還有表頭節點。 兩種方法比較 假設圖有V個頂點,E條

——鄰接表示(實現深度優先遍歷、廣度優先遍歷)

程式碼有部分解析:#include<iostream> #include<stdio.h> #include<stdlib.h> #include<iomanip> using namespace std; #define T

深度優先搜尋DFS——鄰接表示

作為圖的一個基本演算法,DFS應用很廣,可以推廣出很多實用的演算法。下面貼出一個比較常用的用鄰接表表示的圖DFS。 /* 圖鄰接表表示DFS input: 1 7 A 1 5 B 2 4 3 C 2 4 2 D 3 6 5 2 E 3 7 4 1 F 1 4 G 1 5