資料結構(圖的程式碼填寫)
資料結構圖的程式碼填寫
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 編寫一個遞迴函式