數據結構C語言版(作業)之 圖的創建及有關圖的操作

1 鄰接矩陣存圖

#include<iostream>
#define MAXINT 32767
#define MVNUM 100
using namespace std;
typedef char elementype;
typedef struct{
    elementype vexs[MVNUM];//頂點 
	int arcs[MVNUM][MVNUM];//矩陣 
	int vexnum,arcnum;//頂點數和邊數 
}amgraph;

int locate1(amgraph G,int x){//定位
     int i;
	for( i=0;i<G.vexnum;i++){
	   if(x==G.vexs[i])
		   return i;
	}
}
void creatudn(amgraph &G){ //採用鄰接矩陣創建無向圖
   int i,j;
  cout<<"輸入頂點數和邊數: ";
  cin>>G.vexnum>>G.arcnum;  //輸入頂點數和邊數

  cout<<endl<<"輸入頂點值,如:a"<<endl;
  for( i=0;i<G.vexnum;i++){
	cout<<"輸入頂點值: ";
    cin>>G.vexs[i];          //輸入頂點值
  }

  for( i=0;i<G.vexnum;i++){
	  for( j=0;j<G.vexnum;j++){
	    G.arcs[i][j]=MAXINT;  //初始矩陣爲最大值
	  }
  }
 
  elementype v1,v2;
  int w,k1,k2;
  cout<<endl<<"輸入一條邊的兩個頂點及依附的權值,如 a b 2 "<<endl;
  for( i=0;i<G.arcnum;i++){
	  cout<<"輸入一條邊的兩個頂點及依附的權值: ";
      cin>>v1>>v2>>w;       //輸入一條邊的兩個頂點及依附的權值
	  k1=locate1(G,v1);
	  k2=locate1(G,v2);
      G.arcs[k1][k2]=G.arcs[k2][k1]=w;//無向網 
      //G.arcs[k1][k2]=w;//有向圖 
  }
}

void printudn(amgraph G){//輸出鄰接矩陣
	int i,j;
    cout<<endl<<"********鄰接矩陣爲********"<<endl;
    cout<<"\t";
	for( i=0;i<G.vexnum;i++)
		cout<<G.vexs[i]<<"\t";
	cout<<endl;
    for( i=0;i<G.vexnum;i++){
		cout<<G.vexs[i]<<"\t";
		for( j=0;j<G.vexnum;j++){
		   if(i==j)
				cout<<"0"<<"\t";
		   else if(G.arcs[i][j]==MAXINT)
			    cout<<"∞"<<"\t";
		   else  cout<<G.arcs[i][j]<<"\t";	   
		}
		cout<<endl;
	}
}

int main(){
    
	cout<<"*********6.1採用鄰接矩陣創建無向網********"<<endl<<endl;
    amgraph G;
	creatudn(G);//創建 
	printudn(G);//打印 	
    return 0;

}

2 鄰接表存圖

#include<iostream>
#include<cstring> 
#define MVNUM 100
using namespace std;
typedef char elementype ;
typedef struct arcnode{//邊結點 
   int adjvex;//改邊所指向的頂點的位置從0開始 
   struct arcnode *nextarc;//指向下一條邊的指針 
   int info;
}arcnode;
typedef struct vnode{//頂點信息 
   elementype data;//頂點 
   arcnode * firstarc;//指向第一條依附該結點的指針 
}vnode,adglist[MVNUM];
typedef struct{//鄰接表 
 adglist vertices;
 int vexnum,arcnum;//圖當前的頂點數和邊數 
}algraph;
int locate(algraph G,char x){//定位
	for(int i=0;i<G.vexnum;i++){
	    if(x==G.vertices[i].data)
			return i;
	}
}
void createudn(algraph &G){//採用鄰接表創建無向圖
	int i;
	cout<<"輸入頂點數和邊數: ";
    cin>>G.vexnum>>G.arcnum;      //輸入頂點數和邊數
    cout<<endl<<"輸入頂點值,如:a"<<endl;
	for( i=0;i<G.vexnum;i++){
	  cout<<"輸入頂點值: ";
	  cin>>G.vertices[i].data;      //輸入各點
	  G.vertices[i].firstarc=NULL; //邊結點初始爲空
	}
	cout<<endl<<"輸入一條邊的兩個頂點,如a b "<<endl;
	for( i=0;i<G.arcnum;i++){
	  elementype v1,v2;
	  cout<<"輸入一條邊的兩個頂點: ";
	  cin>>v1>>v2;           //輸入一條邊依附的兩個頂點
      int i=locate(G,v1);    //確定頂點在G.vertices的位置
	  int j=locate(G,v2);
	  arcnode *p1; 
	  p1=new arcnode;       //生成新結點 
	  p1->adjvex=j;
      p1->nextarc=G.vertices[i].firstarc; //連接
	  G.vertices[i].firstarc=p1;
	  
//	  arcnode *p2; //無向網時再加一個結點 
//	  p2=new arcnode;
//	  p2->adjvex=i;
//	  p2->nextarc=G.vertices[j].firstarc;
//	  G.vertices[j].firstarc=p2;
	}
}
void printudn(algraph G){//輸出鄰接表
	int i,j;
    cout<<endl<<"********鄰接表爲********"<<endl;
    for(i=0;i<G.vexnum;i++){
    	vnode temp = G.vertices[i];
    	arcnode *p = temp.firstarc;
    	if(p == NULL){
    		cout << G.vertices[i].data;
		}
		else{
			cout<<temp.data;
			while(p){
				cout << "->";
				cout << p->adjvex;
				p = p->nextarc;
			}
		}
    	cout<<endl;
		}
	
}


int main(){
	cout<<"*********6.2採用鄰接表創建有向圖********"<<endl<<endl;
    algraph G;
	createudn(G);//創建 
	printudn(G);//打印
	return 0;
}

3 鄰接矩陣實現四個基本操作(增加結點,刪除結點,增加一條邊,刪除一條邊)

#include<iostream>
#define MAXINT 0
#define MVNUM 100
using namespace std;
typedef char elementype;
typedef struct{
    elementype vexs[MVNUM];//頂點 
	int arcs[MVNUM][MVNUM];//矩陣 
	int vexnum,arcnum;//頂點數和邊數 
}amgraph;

int locate1(amgraph G,int x){//定位
     int i;
	for( i=0;i<G.vexnum;i++){
	   if(x==G.vexs[i])
		   return i;
	}
}
void creatudn(amgraph &G){ //採用鄰接矩陣創建無向圖
   int i,j;
  cout<<"輸入頂點數和邊數: ";
  cin>>G.vexnum>>G.arcnum;  //輸入頂點數和邊數

  cout<<endl<<"輸入頂點值,如:a"<<endl;
  for( i=0;i<G.vexnum;i++){
	cout<<"輸入頂點值: ";
    cin>>G.vexs[i];          //輸入頂點值
  }

  for( i=0;i<G.vexnum;i++){
	  for( j=0;j<G.vexnum;j++){
		if(i==j) G.arcs[i][j]=1;
		else 
	       G.arcs[i][j]=MAXINT;  //初始矩陣爲0
	  }
  }
 
  elementype v1,v2;
  int k1,k2;
  cout<<endl<<"輸入一條邊的兩個頂點,如 a b "<<endl;
  for( i=0;i<G.arcnum;i++){
	 cout<<"輸入一條邊的兩個頂點:";  
      cin>>v1>>v2;       //輸入一條邊的兩個頂點
	  k1=locate1(G,v1);
	  k2=locate1(G,v2);
	  //無向網 
      G.arcs[k1][k2]=G.arcs[k2][k1]=1;//置1 
      //有向圖
      //G.arcs[k1][k2]=1; 
  }
}

void printudn(amgraph G){//輸出鄰接矩陣
	int i,j;
    cout<<endl<<"********鄰接矩陣爲********"<<endl;
    cout<<"\t"; 
	for( i=0;i<G.vexnum;i++)
		cout<<G.vexs[i]<<"\t";
	cout<<endl;
    for( i=0;i<G.vexnum;i++){
    	cout<<G.vexs[i]<<"\t";
		for( j=0;j<G.vexnum;j++){
		     cout<<G.arcs[i][j]<<"\t";	   
		}
		cout<<endl;
	}
}

void Insertvex(amgraph &G,elementype v){//增加一個頂點 
	
	G.vexnum=G.vexnum+1;//頂點數加一 
	int i;
	for( i=0;i<G.vexnum-1;i++) G.arcs[i][G.vexnum-1]=0;
	for( i=0;i<G.vexnum;i++) G.arcs[G.vexnum-1][i]=0;
    G.arcs[G.vexnum-1][G.vexnum-1]=1;
	G.vexs[G.vexnum-1]=v;
}

void Delectvex(amgraph &G,elementype v){//刪除一個頂點 
    int k=locate1(G,v);
    int i;
    for(i=0;i<G.vexnum;i++){
    	G.arcs[i][k]=G.arcs[i][G.vexnum-1];
	}
	for( i=0;i<G.vexnum;i++){
		G.arcs[k][i]=G.arcs[G.vexnum-1][i];
	}
    G.vexs[k]=G.vexs[G.vexnum-1];
    G.vexnum--;
}
void Insertarc(amgraph &G,elementype v,elementype w){//增加一條邊 
	int i,j;
	i=locate1(G,v);//找到對應頂點的位置
	j=locate1(G,w); 

	G.arcs[i][j]=G.arcs[j][i]=1;//置1 
}
void Delectarc(amgraph &G,elementype v,elementype w){//刪除一條邊 
	int i,j;
	i=locate1(G,v);//找到對應頂點的位置
	j=locate1(G,w);

	G.arcs[i][j]=G.arcs[j][i]=MAXINT;//重置爲0
	
}
int main(){
    
	cout<<"*********6.1採用鄰接矩陣創建無向網********"<<endl<<endl;
    amgraph G;
	 	
	while(1){
	    cout<<endl<<endl<<"1,創建無向網;"<<endl;
		cout<<"2,增加新結點;"<<endl;
		cout<<"3,刪除頂點;"<<endl;
		cout<<"4,增加一條邊;"<<endl;
		cout<<"5,刪除一條邊;"<<endl;
		cout<<"6,打印鄰接矩陣;"<<endl;
		cout<<"0,退出。"<<endl;
		int n;
		cout<<endl<<"輸入選擇的操作:"; 
		cin>>n; 
		switch(n){
		    case 1:{
                  creatudn(G);//創建
				  break;
                
			  }
			case 2:{
				char v;
				cout<<"輸入增加的頂點:";
				cin>>v; 
				Insertvex(G,v);
			
				break;
			}
			case 3:{
				char v;
				cout<<"輸入刪除的頂點:";
				cin>>v;
				Delectvex(G,v);
			
				break;
			}
			case 4:{
				char v,w;
				cout<<"輸入增加的邊(如 a b):";
				cin>>v>>w;
				Insertarc(G,v,w);
				
				break;
			}
			case 5:{
				char v,w;
				cout<<"輸入刪除的邊(如 a b):";
				cin>>v>>w;
				Delectarc(G,v,w);
			 
				break;
			}
			case 6:	printudn(G); break;//打印
			case 0: return 0;break;
		}
	} 
    return 0;

}

4 鄰接表實現四個基本操作(增加結點,刪除結點,增加一條邊,刪除一條邊)

#include<iostream>
#include<cstring> 
#define MVNUM 100
using namespace std;
typedef char elementype;
typedef struct arcnode{//邊結點 
   int adjvex;//改邊所指向的頂點的位置從0開始 
   struct arcnode *nextarc;//指向下一條邊的指針 
   int info;
}arcnode;
typedef struct vnode{//頂點信息 
   elementype data;//頂點 
   arcnode * firstarc;//指向第一條依附該結點的指針 
}vnode,adglist[MVNUM];
typedef struct{//鄰接表 
 adglist vertices;
 int vexnum,arcnum;//圖當前的頂點數和邊數 
}algraph;


int locate(algraph G,elementype x){//定位
	int i;
	for(i=0;i<G.vexnum;i++){
	    if(x==G.vertices[i].data)
			return i;
	}
}

void createudn(algraph &G){//採用鄰接表創建無向圖
	int i;
	cout<<"輸入頂點數和邊數: ";
    cin>>G.vexnum>>G.arcnum;      //輸入頂點數和邊數
    cout<<endl<<"輸入頂點值,如:a"<<endl;
	for( i=0;i<G.vexnum;i++){
	  cout<<"輸入頂點值: ";
	  cin>>G.vertices[i].data;      //輸入各點
	  G.vertices[i].firstarc=NULL; //邊結點初始爲空
	}
	cout<<endl<<"輸入一條邊的兩個頂點,如a b "<<endl;
	for( i=0;i<G.arcnum;i++){
	  elementype v1,v2;
	  cout<<"輸入一條邊的兩個頂點: ";
	  cin>>v1>>v2;           //輸入一條邊依附的兩個頂點
      int i=locate(G,v1);    //確定頂點在G.vertices的位置
	  int j=locate(G,v2);
	  arcnode *p1; 
	  p1=new arcnode;       //生成新結點 
	  p1->adjvex=j;
      p1->nextarc=G.vertices[i].firstarc; //連接
	  G.vertices[i].firstarc=p1;
	  
	  arcnode *p2; //無向圖時再加一個結點 
	  p2=new arcnode;
	  p2->adjvex=i;
	  p2->nextarc=G.vertices[j].firstarc;
	  G.vertices[j].firstarc=p2;
	}
}
void printudn(algraph G){//輸出鄰接表
	int i;
    cout<<endl<<"********鄰接表爲********"<<endl;
    for(i=0;i<G.vexnum;i++){
    	vnode temp = G.vertices[i];
    	arcnode *p = temp.firstarc;
    	if(p == NULL){
    		cout << G.vertices[i].data;
		}
		else{
			cout<<temp.data;
			while(p){
				cout << "->";
				cout << p->adjvex;
				p = p->nextarc;
			}
		}
    	cout<<endl;
		}
	
}

void Insertvex(algraph &G,elementype v){//增加一個頂點 
   G.vexnum+=1;
   G.vertices[G.vexnum-1].data=v;
   G.vertices[G.vexnum-1].firstarc=NULL;
}

void Delectvex(algraph &G,elementype v){//刪除一個頂點  
   int k=locate(G,v);//待刪除頂點的下標
    
   //遍歷整個表,將下標爲k的跳過,下標爲G.vexnum-1的置爲k; 
   int i;
    for(i=0;i<G.vexnum;i++){
    	if(i==k) continue;
    	arcnode *p = G.vertices[i].firstarc;
	    if(p&&p->adjvex==k){
		    G.vertices[i].firstarc=p->nextarc;
		}
		else if(p&&p->adjvex==G.vexnum-1){
			p->adjvex=k;
		}	
		while(p&&p->nextarc){
				if(p->nextarc->adjvex==k)
					p->nextarc = p->nextarc->nextarc;
				else if(p->nextarc->adjvex==G.vexnum-1){
				   p->nextarc->adjvex=k;
				}
				p=p->nextarc;   
			}
			
		
	} 
	//將最後一個表覆蓋下標爲k的表	 
	G.vertices[k]=G.vertices[G.vexnum-1];
	G.vexnum-=1;
}
void Insertarc(algraph &G,elementype v,elementype w){//增加一條邊 
    G.arcnum+=1;
	int i=locate(G,v);
	int j=locate(G,w);
	
	//在i鏈增加 
	arcnode *p1; 
      p1=new arcnode;       //生成新結點 
	  p1->adjvex=j;
      p1->nextarc=G.vertices[i].firstarc; //連接
	  G.vertices[i].firstarc=p1;
	  
	//在j鏈增加 
	arcnode *p2;
	  p2=new arcnode;
	  p2->adjvex=i;
	  p2->nextarc=G.vertices[j].firstarc;
	  G.vertices[j].firstarc=p2; 
}
void Delectarc(algraph &G,elementype v,elementype w){//刪除一條邊 
    G.arcnum-=1;
	int i=locate(G,v);
	int j=locate(G,w);
	//在i鏈刪除 
	arcnode *p = G.vertices[i].firstarc;
	if(p->adjvex==j) {
		G.vertices[i].firstarc=p->nextarc;
	}  
	else{
		while(p&&p->nextarc){
		 if(p->nextarc->adjvex==j){
		 	p->nextarc=p->nextarc->nextarc;break;
		 }	 
		 p=p->nextarc;       
	  }
	} 
	
	//在j鏈刪除 
	arcnode *q = G.vertices[j].firstarc;
	if(q->adjvex==i) {
		G.vertices[j].firstarc=q->nextarc;
	}	  
	else{
		while(q&&q->nextarc){
		 if(q->nextarc->adjvex==i){
		 	q->nextarc=q->nextarc->nextarc;break;
		 }	 
		 q=q->nextarc;       
    	}
	}
		
}

int main(){
	cout<<"*********6.2採用鄰接表創建無向網********"<<endl<<endl;
    algraph G;
    while(1){
	    cout<<endl<<"1,創建無向網;"<<endl;
		cout<<"2,增加新結點;"<<endl;
		cout<<"3,刪除結點;"<<endl;
		cout<<"4,增加一條邊;"<<endl;
		cout<<"5,刪除一條邊;"<<endl;
		cout<<"6,打印鄰接表;"<<endl;
		cout<<"0,退出。"<<endl;
		int n;
		cout<<endl<<"輸入選擇的操作:"; 
		cin>>n; 
		switch(n){
		    case 1:{
                 createudn(G);//創建
				  break;
			  }
			case 2:{
				char v;
				cout<<"輸入增加的頂點:";
				cin>>v; 
				Insertvex(G,v);
				break;
			}
			case 3:{
				char v;
				cout<<"輸入刪除的頂點:";
				cin>>v;
				Delectvex(G,v);
				break;
			}
			case 4:{
				char v,w;
				cout<<"輸入增加的邊(如 a b):";
				cin>>v>>w;
				Insertarc(G,v,w);
				break;
			}
			case 5:{
				char v,w;
				cout<<"輸入刪除的邊(如 a b):";
				cin>>v>>w;
				Delectarc(G,v,w);
				break;
			}
			case 6:	printudn(G); break;//打印
			case 0: return 0;break;
		}
	} 
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章