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;
}