本文主要包括以下內(nèi)容
鄰接矩陣實現(xiàn)無向圖 鄰接表實現(xiàn)無向圖 鄰接矩陣實現(xiàn)有向圖鄰接表實現(xiàn)有向圖
圖的理論基礎,請參考:圖的理論基礎 - 如果天空不死 - 博客園
鄰接矩陣實現(xiàn)無向圖
MatrixUDG是鄰接矩陣對應的結構體。
mVexs用于保存頂點,mVexNum是頂點數(shù),mEdgNum是邊數(shù);mMatrix則是用于保存矩陣信息的二維數(shù)組。例如,mMatrix[i][j]=1,則表示”頂點i(即mVexs[i])”和”頂點j(即mVexs[j])”是鄰接點;mMatrix[i][j]=0,則表示它們不是鄰接點。
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
class MatrixUDG {
private:
char mVexs[MAX];
int mVexNum;
int mEdgNum;
int mMatrix[MAX][MAX];
public:MatrixUDG();MatrixUDG(
char vexs[],
int vlen,
char edges[][
2],
int elen);~MatrixUDG();
void print();
private:
char readChar();
int getPosition(
char ch);
};
MatrixUDG::MatrixUDG()
{
char c1, c2;
int i, p1, p2;
cout <<
"input vertex number: ";
cin >> mVexNum;
cout <<
"input edge number: ";
cin >> mEdgNum;
if ( mVexNum <
1 || mEdgNum <
1 || (mEdgNum > (mVexNum * (mVexNum-
1)))){
cout <<
"input error: invalid parameters!" << endl;
return ;}
for (i =
0; i < mVexNum; i++){
cout <<
"vertex(" << i <<
"): ";mVexs[i] = readChar();}
for (i =
0; i < mEdgNum; i++){
cout <<
"edge(" << i <<
"): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);
if (p1==-
1 || p2==-
1){
cout <<
"input error: invalid edge!" << endl;
return ;}mMatrix[p1][p2] =
1;mMatrix[p2][p1] =
1;}
}
MatrixUDG::MatrixUDG(
char vexs[],
int vlen,
char edges[][
2],
int elen)
{
int i, p1, p2;mVexNum = vlen;mEdgNum = elen;
for (i =
0; i < mVexNum; i++)mVexs[i] = vexs[i];
for (i =
0; i < mEdgNum; i++){p1 = getPosition(edges[i][
0]);p2 = getPosition(edges[i][
1]);mMatrix[p1][p2] =
1;mMatrix[p2][p1] =
1;}
}
MatrixUDG::~MatrixUDG()
{
}
int MatrixUDG::getPosition(
char ch)
{
int i;
for(i=
0; i<mVexNum; i++)
if(mVexs[i]==ch)
return i;
return -
1;
}
char MatrixUDG::readChar()
{
char ch;
do {
cin >> ch;}
while(!((ch>=
'a'&&ch<=
'z') || (ch>=
'A'&&ch<=
'Z')));
return ch;
}
void MatrixUDG::print()
{
int i,j;
cout <<
"Martix Graph:" << endl;
for (i =
0; i < mVexNum; i++){
for (j =
0; j < mVexNum; j++)
cout << mMatrix[i][j] <<
" ";
cout << endl;}
}
int main()
{
char vexs[] = {
'A',
'B',
'C',
'D',
'E',
'F',
'G'};
char edges[][
2] = {{
'A',
'C'}, {
'A',
'D'}, {
'A',
'F'}, {
'B',
'C'}, {
'C',
'D'}, {
'E',
'G'}, {
'F',
'G'}};
int vlen =
sizeof(vexs)/
sizeof(vexs[
0]);
int elen =
sizeof(edges)/
sizeof(edges[
0]);MatrixUDG* pG;pG =
new MatrixUDG(vexs, vlen, edges, elen);pG->print();
return 0;
}
鄰接表實現(xiàn)無向圖
(01) ListUDG是鄰接表對應的結構體。
mVexNum是頂點數(shù),mEdgNum是邊數(shù);mVexs則是保存頂點信息的一維數(shù)組。
(02) VNode是鄰接表頂點對應的結構體。
data是頂點所包含的數(shù)據(jù),而firstEdge是該頂點所包含鏈表的表頭指針。
(03) ENode是鄰接表頂點所包含的鏈表的節(jié)點對應的結構體。
ivex是該節(jié)點所對應的頂點在vexs中的索引,而nextEdge是指向下一個節(jié)點的
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
class ListUDG
{
private:
class ENode{
public:
int ivex; ENode *nextEdge; };
class VNode{
public:
char data; ENode *firstEdge; };
private:
int mVexNum;
int mEdgNum; VNode mVexs[MAX];
public:ListUDG();ListUDG(
char vexs[],
int vlen,
char edges[][
2],
int elen);~ListUDG();
void print();
private:
char readChar();
int getPosition(
char ch);
void linkLast(ENode *
list, ENode *node);
};
ListUDG::ListUDG()
{
char c1, c2;
int v, e;
int i, p1, p2;ENode *node1, *node2;
cout <<
"input vertex number: ";
cin >> mVexNum;
cout <<
"input edge number: ";
cin >> mEdgNum;
if ( mVexNum <
1 || mEdgNum <
1 || (mEdgNum > (mVexNum * (mVexNum-
1)))){
cout <<
"input error: invalid parameters!" << endl;
return ;}
for(i=
0; i<mVexNum; i++){
cout <<
"vertex(" << i <<
"): ";mVexs[i].data = readChar();mVexs[i].firstEdge = NULL;}
for(i=
0; i<mEdgNum; i++){
cout <<
"edge(" << i <<
"): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);node1 =
new ENode();node1->ivex = p2;
if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;
elselinkLast(mVexs[p1].firstEdge, node1);node2 =
new ENode();node2->ivex = p1;
if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;
elselinkLast(mVexs[p2].firstEdge, node2);}
}
ListUDG::ListUDG(
char vexs[],
int vlen,
char edges[][
2],
int elen)
{
char c1, c2;
int i, p1, p2;ENode *node1, *node2;mVexNum = vlen;mEdgNum = elen;
for(i=
0; i<mVexNum; i++){mVexs[i].data = vexs[i];mVexs[i].firstEdge = NULL;}
for(i=
0; i<mEdgNum; i++){c1 = edges[i][
0];c2 = edges[i][
1];p1 = getPosition(c1);p2 = getPosition(c2);node1 =
new ENode();node1->ivex = p2;
if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;
elselinkLast(mVexs[p1].firstEdge, node1);node2 =
new ENode();node2->ivex = p1;
if(mVexs[p2].firstEdge == NULL)mVexs[p2].firstEdge = node2;
elselinkLast(mVexs[p2].firstEdge, node2);}
}
ListUDG::~ListUDG()
{
}
void ListUDG::linkLast(ENode *
list, ENode *node)
{ENode *p =
list;
while(p->nextEdge)p = p->nextEdge;p->nextEdge = node;
}
int ListUDG::getPosition(
char ch)
{
int i;
for(i=
0; i<mVexNum; i++)
if(mVexs[i].data==ch)
return i;
return -
1;
}
char ListUDG::readChar()
{
char ch;
do {
cin >> ch;}
while(!((ch>=
'a'&&ch<=
'z') || (ch>=
'A'&&ch<=
'Z')));
return ch;
}
void ListUDG::print()
{
int i,j;ENode *node;
cout <<
"List Graph:" << endl;
for (i =
0; i < mVexNum; i++){
cout << i <<
"(" << mVexs[i].data <<
"): ";node = mVexs[i].firstEdge;
while (node != NULL){
cout << node->ivex <<
"(" << mVexs[node->ivex].data <<
") ";node = node->nextEdge;}
cout << endl;}
}
int main()
{
char vexs[] = {
'A',
'B',
'C',
'D',
'E',
'F',
'G'};
char edges[][
2] = {{
'A',
'C'}, {
'A',
'D'}, {
'A',
'F'}, {
'B',
'C'}, {
'C',
'D'}, {
'E',
'G'}, {
'F',
'G'}};
int vlen =
sizeof(vexs)/
sizeof(vexs[
0]);
int elen =
sizeof(edges)/
sizeof(edges[
0]);ListUDG* pG;pG =
new ListUDG(vexs, vlen, edges, elen);pG->print();
return 0;
}
鄰接矩陣實現(xiàn)有向圖
MatrixDG是鄰接矩陣有向圖對應的結構體。
mVexs用于保存頂點,mVexNum是頂點數(shù),mEdgNum是邊數(shù);mMatrix則是用于保存矩陣信息的二維數(shù)組。例如,mMatrix[i][j]=1,則表示”頂點i(即mVexs[i])”和”頂點j(即mVexs[j])”是鄰接點,且頂點i是起點,頂點j是終點。
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
class MatrixDG {
private:
char mVexs[MAX];
int mVexNum;
int mEdgNum;
int mMatrix[MAX][MAX];
public:MatrixDG();MatrixDG(
char vexs[],
int vlen,
char edges[][
2],
int elen);~MatrixDG();
void print();
private:
char readChar();
int getPosition(
char ch);
};
MatrixDG::MatrixDG()
{
char c1, c2;
int i, p1, p2;
cout <<
"input vertex number: ";
cin >> mVexNum;
cout <<
"input edge number: ";
cin >> mEdgNum;
if ( mVexNum <
1 || mEdgNum <
1 || (mEdgNum > (mVexNum * (mVexNum-
1)))){
cout <<
"input error: invalid parameters!" << endl;
return ;}
for (i =
0; i < mVexNum; i++){
cout <<
"vertex(" << i <<
"): ";mVexs[i] = readChar();}
for (i =
0; i < mEdgNum; i++){
cout <<
"edge(" << i <<
"): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);
if (p1==-
1 || p2==-
1){
cout <<
"input error: invalid edge!" << endl;
return ;}mMatrix[p1][p2] =
1;}
}
MatrixDG::MatrixDG(
char vexs[],
int vlen,
char edges[][
2],
int elen)
{
int i, p1, p2;mVexNum = vlen;mEdgNum = elen;
for (i =
0; i < mVexNum; i++)mVexs[i] = vexs[i];
for (i =
0; i < mEdgNum; i++){p1 = getPosition(edges[i][
0]);p2 = getPosition(edges[i][
1]);mMatrix[p1][p2] =
1;}
}
MatrixDG::~MatrixDG()
{
}
int MatrixDG::getPosition(
char ch)
{
int i;
for(i=
0; i<mVexNum; i++)
if(mVexs[i]==ch)
return i;
return -
1;
}
char MatrixDG::readChar()
{
char ch;
do {
cin >> ch;}
while(!((ch>=
'a'&&ch<=
'z') || (ch>=
'A'&&ch<=
'Z')));
return ch;
}
void MatrixDG::print()
{
int i,j;
cout <<
"Martix Graph:" << endl;
for (i =
0; i < mVexNum; i++){
for (j =
0; j < mVexNum; j++)
cout << mMatrix[i][j] <<
" ";
cout << endl;}
}
int main()
{
char vexs[] = {
'A',
'B',
'C',
'D',
'E',
'F',
'G'};
char edges[][
2] = {{
'A',
'B'}, {
'B',
'C'}, {
'B',
'E'}, {
'B',
'F'}, {
'C',
'E'}, {
'D',
'C'}, {
'E',
'B'}, {
'E',
'D'}, {
'F',
'G'}};
int vlen =
sizeof(vexs)/
sizeof(vexs[
0]);
int elen =
sizeof(edges)/
sizeof(edges[
0]);MatrixDG* pG;pG =
new MatrixDG(vexs, vlen, edges, elen);pG->print();
return 0;
}
鄰接表實現(xiàn)有向圖
(01) ListDG是鄰接表對應的結構體。 mVexNum是頂點數(shù),mEdgNum是邊數(shù);mVexs則是保存頂點信息的一維數(shù)組。
(02) VNode是鄰接表頂點對應的結構體。 data是頂點所包含的數(shù)據(jù),而firstEdge是該頂點所包含鏈表的表頭指針。
(03) ENode是鄰接表頂點所包含的鏈表的節(jié)點對應的結構體。 ivex是該節(jié)點所對應的頂點在vexs中的索引,而nextEdge是指向下一個節(jié)點的。
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;
#define MAX 100
class ListDG
{
private:
class ENode{
public:
int ivex; ENode *nextEdge; };
class VNode{
public:
char data; ENode *firstEdge; };
private:
int mVexNum;
int mEdgNum; VNode mVexs[MAX];
public:ListDG();ListDG(
char vexs[],
int vlen,
char edges[][
2],
int elen);~ListDG();
void print();
private:
char readChar();
int getPosition(
char ch);
void linkLast(ENode *
list, ENode *node);
};
ListDG::ListDG()
{
char c1, c2;
int v, e;
int i, p1, p2;ENode *node1, *node2;
cout <<
"input vertex number: ";
cin >> mVexNum;
cout <<
"input edge number: ";
cin >> mEdgNum;
if ( mVexNum <
1 || mEdgNum <
1 || (mEdgNum > (mVexNum * (mVexNum-
1)))){
cout <<
"input error: invalid parameters!" << endl;
return ;}
for(i=
0; i<mVexNum; i++){
cout <<
"vertex(" << i <<
"): ";mVexs[i].data = readChar();mVexs[i].firstEdge = NULL;}
for(i=
0; i<mEdgNum; i++){
cout <<
"edge(" << i <<
"): ";c1 = readChar();c2 = readChar();p1 = getPosition(c1);p2 = getPosition(c2);node1 =
new ENode();node1->ivex = p2;
if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;
elselinkLast(mVexs[p1].firstEdge, node1);}
}
ListDG::ListDG(
char vexs[],
int vlen,
char edges[][
2],
int elen)
{
char c1, c2;
int i, p1, p2;ENode *node1, *node2;mVexNum = vlen;mEdgNum = elen;
for(i=
0; i<mVexNum; i++){mVexs[i].data = vexs[i];mVexs[i].firstEdge = NULL;}
for(i=
0; i<mEdgNum; i++){c1 = edges[i][
0];c2 = edges[i][
1];p1 = getPosition(c1);p2 = getPosition(c2);node1 =
new ENode();node1->ivex = p2;
if(mVexs[p1].firstEdge == NULL)mVexs[p1].firstEdge = node1;
elselinkLast(mVexs[p1].firstEdge, node1);}
}
ListDG::~ListDG()
{
}
void ListDG::linkLast(ENode *
list, ENode *node)
{ENode *p =
list;
while(p->nextEdge)p = p->nextEdge;p->nextEdge = node;
}
int ListDG::getPosition(
char ch)
{
int i;
for(i=
0; i<mVexNum; i++)
if(mVexs[i].data==ch)
return i;
return -
1;
}
char ListDG::readChar()
{
char ch;
do {
cin >> ch;}
while(!((ch>=
'a'&&ch<=
'z') || (ch>=
'A'&&ch<=
'Z')));
return ch;
}
void ListDG::print()
{
int i,j;ENode *node;
cout <<
"List Graph:" << endl;
for (i =
0; i < mVexNum; i++){
cout << i <<
"(" << mVexs[i].data <<
"): ";node = mVexs[i].firstEdge;
while (node != NULL){
cout << node->ivex <<
"(" << mVexs[node->ivex].data <<
") ";node = node->nextEdge;}
cout << endl;}
}
int main()
{
char vexs[] = {
'A',
'B',
'C',
'D',
'E',
'F',
'G'};
char edges[][
2] = {{
'A',
'B'}, {
'B',
'C'}, {
'B',
'E'}, {
'B',
'F'}, {
'C',
'E'}, {
'D',
'C'}, {
'E',
'B'}, {
'E',
'D'}, {
'F',
'G'}};
int vlen =
sizeof(vexs)/
sizeof(vexs[
0]);
int elen =
sizeof(edges)/
sizeof(edges[
0]);ListDG* pG;pG =
new ListDG(vexs, vlen, edges, elen);pG->print();
return 0;
}
總結
以上是生活随笔為你收集整理的数据结构之图的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。