図構造の簡単なテスト(無方向、非重み付け図のデータ要素を文字と仮定し、隣接表記憶構造を採用する.図の作成、記憶構造出力などの大部分の操作の実現コード操作がすでに与えられているので、操作挿入エッジ、削除エッジの実現関数コードをそれぞれ補充して書き出してください.)

40600 ワード

学校のデータ構造の授業を終えて、すり抜けた問題を復習して、練習して、問題は以下のように説明します:無方向、非重み付け図のデータ要素を文字と仮定して、隣接表の記憶構造を採用します.図の作成、記憶構造出力などのほとんどの操作の実装コード操作が与えられています.操作挿入エッジ、削除エッジの実装関数コードをそれぞれ補足してください.
説明:
  (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: