図構造の簡単なテスト(無方向、非重み付け図のデータ要素を文字と仮定し、隣接表記憶構造を採用する.図の作成、記憶構造出力などの大部分の操作の実現コード操作がすでに与えられているので、操作挿入エッジ、削除エッジの実現関数コードをそれぞれ補充して書き出してください.)
学校のデータ構造の授業を終えて、すり抜けた問題を復習して、練習して、問題は以下のように説明します:無方向、非重み付け図のデータ要素を文字と仮定して、隣接表の記憶構造を採用します.図の作成、記憶構造出力などのほとんどの操作の実装コード操作が与えられています.操作挿入エッジ、削除エッジの実装関数コードをそれぞれ補足してください.
説明:
注:統一のため、隣接点がチェーンテーブルにチェーンインする場合、チェーンインは前面(ヘッダー位置)になります
(3)主関数での操作の制御:1-図2の作成-図の記憶構造3-エッジ挿入4-エッジ削除0-終了
図を作成するには、頂点の個数、各頂点要素、各エッジを入力する必要があります.具体的には、サンプルを参照してください.
ストレージ構造を出力する場合、出力フォーマットはサンプルを参照してください.
エッジを挿入または削除するには、エッジの2つの頂点要素を入力する必要があります.
例:
1//作成図操作5//図頂点の個数abcde//頂点要素**//入力辺、**は入力終了2//出力図構造操作3//挿入辺操作ab//辺頂点3 bc 4//削除辺操作de 2 0出力は以下の通り:Adjacency List is:a:b:c:d:e:Edge insertion succeeded!Edge insertion succeeded! Error:Edge does not exist! Adjacency List is: a:–>b b:–>c–>a c:–>b d: e:
与えられたコードは以下の通りです:(補足を要求する関数の注釈の説明に注意してください)
説明:
(1) , int Insert_Edge(g,vi,vj)
: g, vi,vj;
: ( 、 : 、 : ), :
Error:Vertex does not exist!
Error:Edge repetition!
Edge insertion succeeded!
注:統一のため、隣接点がチェーンテーブルにチェーンインする場合、チェーンインは前面(ヘッダー位置)になります
(2) , int Delete_Edge(g,vi,vj)
: g, vi,vj;
: ( 、 : 、 : ), :
Error:Vertex does not exist!
Error:Edge does not exist!
Edge deletion succeeded!
(3)主関数での操作の制御:1-図2の作成-図の記憶構造3-エッジ挿入4-エッジ削除0-終了
図を作成するには、頂点の個数、各頂点要素、各エッジを入力する必要があります.具体的には、サンプルを参照してください.
ストレージ構造を出力する場合、出力フォーマットはサンプルを参照してください.
エッジを挿入または削除するには、エッジの2つの頂点要素を入力する必要があります.
例:
1//作成図操作5//図頂点の個数abcde//頂点要素**//入力辺、**は入力終了2//出力図構造操作3//挿入辺操作ab//辺頂点3 bc 4//削除辺操作de 2 0出力は以下の通り:Adjacency List is:a:b:c:d:e:Edge insertion succeeded!Edge insertion succeeded! Error:Edge does not exist! Adjacency List is: a:–>b b:–>c–>a c:–>b d: e:
与えられたコードは以下の通りです:(補足を要求する関数の注釈の説明に注意してください)
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
using namespace std;
#define Max_VertexNum 50 //
typedef char VertexType; // ( ) char
//********************************************************************************
//
struct EdgeNode //
{
int adjvex; //
EdgeNode *next; //
};
struct VertexNode //
{
VertexType vertex; //
struct EdgeNode *link; //
};
typedef struct Graph //
{
int VexNum; //
VertexNode Nodetable[Max_VertexNum]; // -
} Graphlnk; //
//**********************************************************************************
// 、
//**
void create_graph(Graphlnk &g)
{
VertexType v1, v2;
int i, j;
struct EdgeNode *p, *q;
cin >> g.VexNum; //
while (g.VexNum < 0)
cin >> g.VexNum;
for (i = 0; i < g.VexNum; i++)
{
cin >> g.Nodetable[i].vertex; //
g.Nodetable[i].link = NULL; //
}
cin >> v1 >> v2; //
while (v1 != '*'&&v2 != '*')
{
for (i = 0; i < g.VexNum; i++)
if (g.Nodetable[i].vertex == v1) break;
for (j = 0; j < g.VexNum; j++)
if (g.Nodetable[j].vertex == v2) break;
if (i >= g.VexNum || j >= g.VexNum) cin >> v1 >> v2; // ,
else //
{
p = (struct EdgeNode *)malloc(sizeof(struct EdgeNode));
p->adjvex = j;
p->next = g.Nodetable[i].link;
g.Nodetable[i].link = p;
q = (struct EdgeNode *)malloc(sizeof(struct EdgeNode));
q->adjvex = i;
q->next = g.Nodetable[j].link;
g.Nodetable[j].link = q;
cin >> v1 >> v2;
}
}
}
void print_graph(Graphlnk g)
{
int i;
struct EdgeNode *p;
cout << "Adjacency List is:" << endl;
for (i = 0; i < g.VexNum; i++)
{
cout << g.Nodetable[i].vertex << ":";
p = g.Nodetable[i].link;
while (p != NULL)
{
cout << "-->" << g.Nodetable[p->adjvex].vertex;
p = p->next;
}
cout << endl;
}
}
//**********************************************************************
/* */
//**********************************************************************
int main()
{
Graphlnk g;
int ic;
VertexType vi, vj;
int k;
while (1)
{
// :";
cin >> ic;
while (ic < 0 || ic>4)
cin >> ic;
if (ic == 1) create_graph(g); //
if (ic == 2) print_graph(g); //
if (ic == 3) //
{
cin >> vi >> vj;
k = Insert_Edge(g, vi, vj);
if (k == -1) cout << "Error:Vertex does not exist!" << endl;
if(k==0) cout << "Error:Edge repetition!" << endl;
if(k==1) cout << "Edge insertion succeeded!" << endl;
}
if (ic == 4) //
{
cin >> vi >> vj;
k = Delete_Edge(g, vi, vj);
if (k == -1) cout << "Error:Vertex does not exist!." << endl;
if (k == 0) cout << "Error:Edge does not exist!" << endl;
if (k == 1) cout << "Edge deletion succeeded!" << endl;
}
if (ic == 0) break;
}
return 0;
}
:
int getNum(Graphlnk g, VertexType vi) {
// , vi
for (int i = 0; i < g.VexNum; i++)
if (g.Nodetable[i].vertex == vi) return i;
return -1;
}
int Insert_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
int v1 = getNum(g,vi);
int v2 = getNum(g,vj);
if(v1<0 || v2 < 0) return -1;
EdgeNode *p = g.Nodetable[v1].link;
while(p) {
if (p->adjvex == v2) return 0;
p = p->next;
}
p = new EdgeNode;
p->adjvex = v2;
p->next = g.Nodetable[v1].link;
g.Nodetable[v1].link = p;
// cout<adjvex;
if(v1 == v2) return 1;// aa
p = new EdgeNode;
p->adjvex = v1;
p->next = g.Nodetable[v2].link;
g.Nodetable[v2].link = p;
// cout<adjvex;
return 1;
}
int Delete_Edge(Graphlnk &g, VertexType vi, VertexType vj) {
int v1 = getNum(g,vi);
int v2 = getNum(g,vj);
if(v1<0 || v2 < 0) return -1;
EdgeNode *p = g.Nodetable[v1].link;
if(p && p->adjvex == v2) {
g.Nodetable[v1].link = p->next;
if(v1 == v2) return 1;
}
while(p) {
EdgeNode *pnext = p->next;
if(pnext && pnext->adjvex == v2 ) {
p->next = pnext->next;
delete pnext;
if(v1 == v2) return 1;
break;
}
p = p->next;
}
p = g.Nodetable[v2].link;
if(p && p->adjvex == v1) {
g.Nodetable[v2].link = p->next;
return 1;
}
while(p) {
EdgeNode *pnext = p->next;
if(pnext && pnext->adjvex == v1 ) {
p->next = pnext->next;
delete pnext;
return 1;
}
p = p->next;
}
return 0;
}
:
1
5
abcde
**
2
3
ab
3
bc
4
de
3
aa
2
4
aa
2
4
bb
3
bc
4
ka
3
pa
3
bc
3
ac
2
4
ba
4
ca
2
0
Adjacency List is:
a:
b:
c:
d:
e:
Edge insertion succeeded!
Edge insertion succeeded!
Error:Edge does not exist!
Edge insertion succeeded!
Adjacency List is:
a:-->a-->b
b:-->c-->a
c:-->b
d:
e:
Edge deletion succeeded!
Adjacency List is:
a:-->b
b:-->c-->a
c:-->b
d:
e:
Error:Edge does not exist!
Error:Edge repetition!
Error:Vertex does not exist!.
Error:Vertex does not exist!
Error:Edge repetition!
Edge insertion succeeded!
Adjacency List is:
a:-->c-->b
b:-->c-->a
c:-->a-->b
d:
e:
Edge deletion succeeded!
Edge deletion succeeded!
Adjacency List is:
a:
b:-->c
c:-->b
d:
e: