1. 程式人生 > >資料結構(圖的程式碼填寫)

資料結構(圖的程式碼填寫)

資料結構圖的程式碼填寫

void TransforMtoAL(MGraph G1,ALGraph &G2)
麻煩幫忙改改這個函式,編譯沒有問題,但是執行結果出錯
請用c語言的

執行結果在這裡插入圖片描述

整段程式碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int ERROR=0,OK=1,TRUE=1,FALSE=0;
#define INFINITY 10000 /* 用整型最大值代替∞ */
#define MAX_VERTEX_NUM
20 /* 最大頂點個數 */ #define MAX_NAME 5 /* 頂點字串的最大長度+1 */ #define MAX_INFO 20 /* 相關資訊字串的最大長度+1 */ typedef int VRType; typedef int Status; typedef char InfoType; typedef char VertexType[MAX_NAME]; typedef enum{DG,DN,AG,AN}GraphKind; /* {有向圖,有向網,無向圖,無向網} */ /* 定義鄰接矩陣型別 */ typedef struct { VRType adj; /* 頂點關係型別。對無權圖,用1(是)或0(否)表示相鄰否; */
/* 對帶權圖,c則為權值型別 */ InfoType *info; /* 該弧相關資訊的指標(可無) */ }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; /* 頂點向量 */ AdjMatrix arcs; /* 鄰接矩陣 */ int vexnum,arcnum; /* 圖的當前頂點數和弧數 */ GraphKind kind; /* 圖的種類標誌 */ }MGraph; /* 定義鄰接表型別 */ typedef struct ArcNode {
int adjvex; /* 該弧所指向的頂點的位置 */ struct ArcNode *nextarc; /* 指向下一條弧的指標 */ VRType adj; InfoType *info; /* 網的權值指標) */ }ArcNode; /* 表結點 */ typedef struct { VertexType data; /* 頂點資訊 */ ArcNode *firstarc; /* 第一個表結點的地址,指向第一條依附該頂點的弧的指標 */ }VNode,AdjList[MAX_VERTEX_NUM]; /* 頭結點 */ typedef struct { AdjList vertices; int vexnum,arcnum; /* 圖的當前頂點數和弧數 */ int kind; /* 圖的種類標誌 */ }ALGraph; typedef struct { /* 記錄從頂點集U到V-U的代價最小的邊的輔助陣列定義 */ VertexType adjvex; VRType lowcost; }minside[MAX_VERTEX_NUM]; void DFS(MGraph G,int v); int minimum(minside SZ,MGraph G) { /* 求closedge.lowcost的最小正值 */ int i=0,j,k,min; while(!SZ[i].lowcost) i++; min=SZ[i].lowcost; /* 第一個不為0的值 */ k=i; for(j=i+1;j<G.vexnum;j++) if(SZ[j].lowcost>0) if(min>SZ[j].lowcost) { min=SZ[j].lowcost; k=j; } return k; } int LocateVex(MGraph G,VertexType u) { /* 初始條件:圖G存在,u和G中頂點有相同特徵 */ /* 操作結果:若G中存在頂點u,則返回該頂點在圖中位置;否則返回-1 */ int i; for(i=0;i<G.vexnum;++i) if(strcmp(u,G.vexs[i])==0) return i; return -1; } /* 建立圖的鄰接矩陣 */ Status CreateAN(MGraph &G) { /* 採用陣列(鄰接矩陣)表示法,構造無向網G。*/ int i,j,k,w,IncInfo; char s[MAX_INFO],*info; VertexType va,vb; printf("請輸入無向網G的頂點數,邊數,邊是否含其它資訊(是:1,否:0): "); scanf("%d,%d,%d",&G.vexnum,&G.arcnum,&IncInfo); printf("請輸入%d個頂點的值(%d個字元):\n",G.vexnum,MAX_NAME); for(i=0;i<G.vexnum;++i) /* 構造頂點向量 */ scanf("%s",G.vexs[i]); for(i=0;i<G.vexnum;++i) /* 初始化鄰接矩陣 */ for(j=0;j<G.vexnum;++j) { G.arcs[i][j].adj=INFINITY; /* 網 */ G.arcs[i][j].info=NULL; } printf("請輸入%d條邊的頂點1 頂點2 權值(以空格作為間隔): \n",G.arcnum); for(k=0;k<G.arcnum;++k) { scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回車符 */ i=LocateVex(G,va); j=LocateVex(G,vb); G.arcs[i][j].adj=G.arcs[j][i].adj=w; /* 無向 */ if(IncInfo) { printf("請輸入該邊的相關資訊(<%d個字元): ",MAX_INFO); gets(s); w=strlen(s); if(w) { info=(char*)malloc((w+1)*sizeof(char)); strcpy(info,s); G.arcs[i][j].info=G.arcs[j][i].info=info; /* 無向 */ } } } G.kind=AN; return OK; } void Display_MGraph(MGraph G) { /* 輸出鄰接矩陣G */ int i,j; char s[7],s1[3]; switch(G.kind) { case DG: strcpy(s,"有向圖\0"); strcpy(s1,"弧\0"); break; case DN: strcpy(s,"有向網\0"); strcpy(s1,"弧\0"); break; case AG: strcpy(s,"無向圖\0"); strcpy(s1,"邊\0"); break; case AN: strcpy(s,"無向網\0"); strcpy(s1,"邊\0"); } printf("%d個頂點%d條%s的%s\n",G.vexnum,G.arcnum,s1,s); for(i=0;i<G.vexnum;++i) /* 輸出G.vexs */ printf("G.vexs[%d]=%s\n",i,G.vexs[i]); printf("G.arcs.adj:\n"); /* 輸出G.arcs.adj */ for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) printf("%6d",G.arcs[i][j].adj); printf("\n"); } printf("G.arcs.info:\n"); /* 輸出G.arcs.info */ printf("頂點1(弧尾) 頂點2(弧頭) 該%s資訊:\n",s1); if(G.kind<2) /* 有向 */ for(i=0;i<G.vexnum;i++) for(j=0;j<G.vexnum;j++) { if(G.arcs[i][j].info) printf("%5s %11s %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info); } else /* 無向 */ { for(i=0;i<G.vexnum;i++) for(j=i+1;j<G.vexnum;j++) if(G.arcs[i][j].info) printf("%5s %11s %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info); } } void Display_ALGraph(ALGraph G) { /* 輸出圖的鄰接矩陣G */ int i; ArcNode *p; switch(G.kind) { case DG: printf("有向圖\n"); break; case DN: printf("有向網\n"); break; case AG: printf("無向圖\n"); break; case AN: printf("無向網\n"); } printf("%d個頂點:\n",G.vexnum); for(i=0;i<G.vexnum;++i) printf("%s ",G.vertices[i].data); printf("\n%d條弧(邊):\n",G.arcnum); for(i=0;i<G.vexnum;i++) { p=G.vertices[i].firstarc; while(p) { if(G.kind<=1) /* 有向 */ { printf("%s→%s ",G.vertices[i].data,G.vertices[p->adjvex].data); if(G.kind==DN) /* 網 */ printf(":%d ",*(p->info)); } else /* 無向(避免輸出兩次) */ { if(i<p->adjvex) { printf("%s-%s ",G.vertices[i].data,G.vertices[p->adjvex].data); if(G.kind==AN) /* 網 */ printf(":%d ",(p->adj)); } } p=p->nextarc; } printf("\n"); } } Status(*VisitFunc)(VertexType); Status visited[MAX_VERTEX_NUM]; void DFSTraverse(MGraph G,Status(*Visit)(VertexType)) { /* 初始條件: 圖G存在,Visit是頂點的應用函式。演算法7.4 */ /* 操作結果: 從第1個頂點起,深度優先遍歷圖G,並對每個頂點呼叫函式Visit */ /* 一次且僅一次。一旦Visit()失敗,則操作失敗 */ int v; VisitFunc=Visit; /* 使用全域性變數VisitFunc,使DFS不必設函式指標引數 */ for(v=0;v<G.vexnum;v++) visited[v]=FALSE; /* 訪問標誌陣列初始化(未被訪問) */ for(v=0;v<G.vexnum;v++) if(!visited[v]) DFS(G,v); /* 對尚未訪問的頂點呼叫DFS */ printf("\n"); } void DFS(MGraph G,int v) { int w; visited[v]=TRUE; VisitFunc(G.vexs[v]); for(w=0;w<G.vexnum;w++) { if(G.arcs[v][w].adj!=INFINITY) if(!visited[w]) DFS(G,w); } } Status visit(VertexType i) { printf("%s ",i); return OK; } void TransforMtoAL(MGraph G1,ALGraph &G2) { /*建立一個以鄰接矩陣儲存的圖的鄰接表儲存結構*/ int i=0,j,x; ArcNode *p; ArcNode *q; G2.vexnum=G1.vexnum; G2.arcnum=G1.arcnum; for(i=0;i<G1.vexnum;i++) strcpy(G2.vertices[i].data,G1.vexs[i]); G2.vertices[i].firstarc=NULL; for(j=0;j<G2.vexnum;j++) { x=G1.arcs[i][j].adj; if(x!=INFINITY) { p=(ArcNode *)malloc(sizeof(ArcNode)); p->adj=x; p->nextarc=NULL; p->adjvex=j; if(!G2.vertices[i].firstarc) q=G2.vertices[i].firstarc=p; else q->nextarc=p; q=p; } } } void MiniSpanTree_PRIM(MGraph G,VertexType u) { /* 用普里姆演算法從第u個頂點出發構造網G的最小生成樹T,輸出T的各條邊 演算法7.9 */ minside closedge; int i, j, k; k = LocateVex(G, u); for(j=0; j<=G.vexnum; j++) //輔助陣列初始化 { if(j!=k) { strcpy(closedge[j].adjvex,u); closedge[j].lowcost = G.arcs[k][j].adj; } } closedge[k].lowcost = 0; for(i=1; i<=G.vexnum-1; i++) //總共需要G.vexnum-1次尋找最小邊 { k = minimum(closedge, G); printf("%s--%s \n", closedge[k].adjvex, G.vexs[k]); closedge[k].lowcost = 0; for(j=1; j<=G.vexnum; j++) if(G.arcs[k][j].adj < closedge[j].lowcost) { strcpy(closedge[j].adjvex,G.vexs[k]); closedge[j].lowcost = G.arcs

相關推薦

資料結構程式碼填寫

資料結構圖的程式碼填寫 void TransforMtoAL(MGraph G1,ALGraph &G2) 麻煩幫忙改改這個函式,編譯沒有問題,但是執行結果出錯 請用c語言的 執行結果 整段程式碼 #include <stdio.h> #in

關於嚴蔚敏老師《資料結構C語言版》書中程式碼的誤解

清華大學嚴蔚敏老師的《資料結構(C語言版)》以其嚴謹被奉為經典,我是從其Pascal版一路追著買到C語言版,一直覺得這本書理論功力深厚,是不可多得的資料結構教材。但其編寫過程中為避免太過拘泥於具體語言細節,使用了ADT描述,具體演算法中使用了偽碼描述,對於新手直接把程式碼原樣照抄是沒法直接在電腦

資料結構C語言版第三版 基礎實驗二

1、編寫函式slnklist delx(linklist head, datatype x),刪除不帶頭結點單鏈表head中第一個值為x 的結點。 並構造測試用例進行測試。 2、假設線性表(a1,a2,a3,…an)採用不帶頭結點的單鏈表儲存, 請設計演算法函式linklist reverse1

資料結構C語言版第三版基礎實驗一

1、基於sequlist.h中定義的順序表,編寫演算法函式reverse(sequence_list *L),實現順序表的就地倒置。 2、編寫一個演算法函式void sprit( sequence_list *L1,sequence_list *L2,sequence_list *L3), 將順

資料結構C語言版讀書筆記1(基本概念和術語)

資料: 所有輸入到計算機中,並被計算機程式處理的符號的總稱。 資料元素: 資料的基本單位,在計算機程式中經常被當做一個整體進行考慮和處理 資料物件: 性質相同的資料元素的集合,是資料的一個子集。 資料結構: 相互之間存在一種或多種特定關係的資料元素的集合。這種資料元素之間

資料結構連結串列系列:連結串列建立,連結串列刪除特定節點,連結串列氣泡排序,連結串列快速排序

一、連結串列的理解: 1,各個節點間地址存放可以不連續,雖說是表,但是指標存在是為了找到其他的節點,如果連續了,都沒必要用連結串列了。 2,各節點依賴上一節點,要找到某一個節點必須找到他的上一個節點,所以要訪問連結串列,必須要知道頭指標,然後從頭指標訪問開始。 3,各節點間原來是獨立的,本

資料結構c語言版中線性表的單鏈表儲存結構

本文轉自:https://blog.csdn.net/prlhnxx/article/details/79174782 /* run this program using the console pauser or add your own getch, system("pause") or i

ES6 Set和Map資料結構可轉為陣列

一:Set 基本用法 ES6 提供了新的資料結構 Set。它類似於陣列,但是成員的值都是唯一的,沒有重複的值。(不包括空物件) Set 本身是一個建構函式,用來生成 Set 資料結構。 const s = new Set(); [2, 3, 5, 4, 5, 2, 2].forE

資料結構棧與佇列 java實現

棧的相關定義 package StackDef; import java.util.Arrays; import java.util.EmptyStackException; /** * 通過陣列模擬棧 * @author tian * */ public cla

用C語言實現線性表歸併_含原始碼和執行結果_資料結構C語言版

採用動態分配順序儲存結構實現 採用單鏈表結構實現 1.採用動態分配實現 #include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREM

資料結構C語言實現:判斷兩棵二叉樹是否相等,bug求解

判斷兩棵二叉樹是否相等。 遇到了bug,求大神幫忙!!! C語言原始碼: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define OK 1 #define

資料結構java語言描述

資料結構(java語言描述)   概念性描述與《資料結構例項教程》大同小異,具體參考:http://www.cnblogs.com/bookwed/p/6763300.html。 概述 基本概念及術語 資料 資訊的載體,是對客觀事物的符號表示,凡能輸入到計算機中並被計算機程式處理的符號都

資料結構C++語言版附習題解析》電子書下載 -百度網盤 高清版PDF格式

       作者:鄧俊輝 出版日期:2013年9月1日 出版社:清華出版社 頁數:514 ISBN:7-302-33064-6 檔案格式:PDF 檔案大小:24.00 MB   &n

資料結構C語言版》電子書下載 -百度網盤 高清版PDF格式

作者:嚴蔚敏,吳偉民 出版日期:2007-3-1 出版社:清華出版社 頁數:334 ISBN:9787302147510 檔案格式:PDF 檔案大小:28.95 MB 站長推薦 本書的第1章綜述資料、資料結構和抽象資料型別等基本概念;第2章至第7章從抽象資料

XTU資料結構C語言版

表示式中的小括號可能出現不匹配的情況,使用者以字串的方式輸入一個表示式,請用棧這種結構對錶達式中小括號的匹配情況進行檢測,輸出檢測結果(匹配還是不匹配)。 #include<stdio.h> #include<stdlib.h> #include<mallo

20150908資料結構C語言版演算法時間複雜度問題

1, 演算法複雜度是在《資料結構》這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學複習起來無從下手,下面我們就這個問題給各位考生進行分析。 首先了解一下幾個概念。一個是時間複雜度,一個是漸

`輕鬆搞定資料結構線性表篇

資料結構(線性表) 相關的C/C++基礎知識 typedef 語句的使用 //①宣告一個結構體,或者為 一個型別修改名字方便理解。 typedef struct xxx{ int xxxx; }newN

資料結構C語言版

基本概念及術語 資料結構基本概念 1.資料 所有能輸入到計算機中並被程式處理的符號集合。 2.資料元素 資料的基本單位,在計算機程式中通常被作為一個整體考慮和處理。 3.資料項 資料不可分割的最小單位,相當於記錄的”域”或者欄位。 4.資料物件

浙大版《資料結構第2版》題目集 簡單計算器

模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算子的優先順序相同,按從左到右的順序計算。 輸入格式: 輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個運算元。遇等號”=”說明輸入結束。 輸出格式: 在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算子

資料結構C語言版-遞迴學習筆記

遞迴,介紹瞭解決某一類問題的思維方式。在一個函式定義中出現了對自己本身的呼叫,稱為直接遞迴。一個函式p的定義中包含了對函式q的呼叫,而q的實現過程中又呼叫了p,即函式呼叫形成了一個環狀呼叫鏈,這種方式稱之為間接遞迴。 一個最簡單遞迴程式設計的例項。 例子1 編寫一個遞迴函式