資料結構——鄰接表的建立與列印輸出
阿新 • • 發佈:2019-01-12
老樣子,三個檔案
head.h
#pragma once
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
adj.h
#pragma once #include"head.h" typedef struct edge { int adjvex;//編號,用於檢索data int weight;//用於存放權值 struct edge *next;//鄰接表指標 }edgeNode; typedef struct { char data;//節點的名字 edgeNode *first;//用於檢索節點鄰接表資訊,如編號,權值,指向下個孩子的指標 }adj; class adjListGraph { adj adjList[100];//鄰接表表頭,最多100個表頭 int v, w;//v為頂點數,w為邊數 public: void createGraph(void);//錄入圖資訊,存於鄰接表 int locatex(char a);//檢索節點名稱,返回編號 void print(void);//列印所有鄰接表 }; int adjListGraph::locatex(char a) { for (int i = 0; i < v; i++) if (a == adjList[i].data)return i; return -1; } void adjListGraph::createGraph(void) { int m, n; edgeNode *e = NULL; edgeNode *q = NULL; cout << "依次輸入頂點數與邊數:" << endl; cin >> n >> m; v = n; w = m; cout << "錄入鄰接表資訊:" << endl; cout << "錄入所有頂點的英文編號:" << endl; for(int i = 0; i < n; i++) { cin >> adjList[i].data; adjList[i].first = NULL; } cout << "錄入鄰接表資訊,以‘起始頂點 被指向頂點 邊權值’為格式:" << endl; char a, b; int cost; for (int j = 0; j < w; j++) { cin >> a >> b >> cost; int vertexA = locatex(a);//起始節點的編號 int vertexB = locatex(b);//被指向節點的編號 e = new edgeNode; e->adjvex = vertexB; e->next = NULL; //頭插法連結串列 if (adjList[vertexA].first == NULL) q = adjList[vertexA].first = e; /* 單鏈表標誌性的連等寫法。根據右結合,等同於 adjList[vertexA].first=e; q=adjList[vertexA].frist; */ else q = q->next = e; } } void adjListGraph::print(void) { edgeNode *p; p = new edgeNode; for (int k = 0; k < v; k++) { cout << adjList[k].data << ":"; for (p = adjList[k].first; p; p=p->next) cout << " " << adjList[p->adjvex].data ; if (p == NULL) cout << endl; } }
main.cpp
#include"adj.h"
int main(void)
{
adjListGraph A;
A.createGraph();
A.print();
system("pause");
return 0;
}
第一組I/O:
輸入的拓撲圖之這樣的:
第二組I/O: