1. 程式人生 > >資料結構——鄰接表的建立與列印輸出

資料結構——鄰接表的建立與列印輸出

老樣子,三個檔案

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: