日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 十字链表图转java版

發(fā)布時間:2025/6/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 十字链表图转java版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C++ 圖


#include <iostream> #include <string> #include <queue> #include <stack> using namespace std; bool visited[100]; //頂點是否已被訪問的標志數(shù)組 //十字鏈表存儲圖 //弧結(jié)點 struct ArcBox { //弧結(jié)點頭尾結(jié)點位置 int tailvex; int headvex; //弧頭和弧尾相同的弧的鏈域 ArcBox *hlink; ArcBox *tlink; }; //頂點節(jié)點 struct VexNode { string data; //頂點名稱 ArcBox *firstin; //指向第一條入弧 ArcBox *firstout; //指向第一條出弧 }; class OLGraph { private: VexNode *xlist; //指向頂點數(shù)組的指針 int vexnum; //頂點數(shù) int arcnum; //弧數(shù) int maxnum; //頂點數(shù)的最大值 public: OLGraph(int num=20) { xlist=new VexNode[num]; maxnum=num; } int Locate_Vex(string v) { for(int i=0;i<vexnum;i++) { if(xlist[i].data==v) return i; } return -1; } void CreateDG_OLG() { //構(gòu)造有向圖 string v1,v2; int i,j,k; cout<<"輸入頂點數(shù)和邊的數(shù)目:"; cin>>vexnum>>arcnum; while(vexnum>maxnum) { cout<<"頂點數(shù)目大于最大限制,請重新輸入:"; cin>>vexnum; } cout<<"輸入各個頂點的名稱:"; for(i=0;i<vexnum;i++) { cin>>xlist[i].data; xlist[i].firstin=NULL; xlist[i].firstout=NULL; } for(k=0;k<arcnum;k++) { cout<<"輸入第"<<k+1<<"條邊的兩個頂點(尾—>頭的順序):"; cin>>v1>>v2; i=Locate_Vex(v1); j=Locate_Vex(v2); while(i == -1 || j == -1) { cout<<"結(jié)點位置輸入錯誤,重新輸入: "; cin>>v1>>v2; i=Locate_Vex(v1); j=Locate_Vex(v2); } ArcBox *p=new ArcBox; p->tailvex=i; p->headvex=j; p->hlink=xlist[j].firstin; p->tlink=xlist[i].firstout; xlist[i].firstout=xlist[j].firstin=p; } cout<<"有向圖構(gòu)造完成"<<endl; } //統(tǒng)計頂點入度 int In_degree(string v) { int pos=Locate_Vex(v); if(pos == -1) { cout<<"結(jié)點不在圖中"<<endl; return -1; } ArcBox *p=xlist[pos].firstin; int ins=0; while(p) { ins++; p=p->hlink; } return ins; } //統(tǒng)計頂點出度 int Out_degree(string v) { int pos=Locate_Vex(v); if(pos == -1) { cout<<"結(jié)點不在圖中"<<endl; return -1; } ArcBox *p=xlist[pos].firstout; int out=0; while(p) { out++; p=p->tlink; } return out; } //深度優(yōu)先遍歷 void DFS(int v) { visited[v]=true; cout<<xlist[v].data<<" "; ArcBox *p=xlist[v].firstout; while(p) { if(!visited[p->headvex]) DFS(p->headvex); p=p->tlink; } } void DFS_Traverse() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) DFS(i); } //廣度優(yōu)先遍歷 void BFS(int v) { visited[v]=true; cout<<xlist[v].data<<" "; queue<int> qu; int vex; ArcBox *p; qu.push(v); while(!qu.empty()) { vex=qu.front(); qu.pop(); p=xlist[vex].firstout; while(p) { if(!visited[p->headvex]) { visited[p->headvex]=true; cout<<xlist[p->headvex].data<<" "; qu.push(p->headvex); } p=p->tlink; } } } void BFS_Traverse() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) BFS(i); } void DFS_2(int v) { visited[v]=true; cout<<xlist[v].data<<" "; stack<int> s; ArcBox *p; int pos; s.push(v); while(!s.empty()) { pos=s.top(); p=xlist[pos].firstout; while(p && visited[p->headvex]) p=p->tlink; if(!p) s.pop(); else { visited[p->headvex]=true; cout<<xlist[p->headvex].data<<" "; s.push(p->headvex); } } } void DFS_Traverse_2() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) DFS_2(i); } //求連通分支數(shù) int Connect_Cpnt() { for(int i=0;i<vexnum;i++) visited[i]=false; cout<<"下面的每一行顯示一個連通分支:"<<endl; int num=1; DFS(0); cout<<endl; for(int i=0;i<vexnum;i++) { if(!visited[i]) { num++; DFS(i); cout<<endl; } } return num; } };
#include "Graphis.h" #include <iostream> #include <string> using namespace std; int main() { OLGraph G; string v; int ins,out,a; G.CreateDG_OLG(); cout<<"輸入要統(tǒng)計哪個結(jié)點的入度:"; cin>>v; ins=G.In_degree(v); if(ins != -1) cout<<"頂點"<<v<<"的入度為:"<<ins<<endl; cout<<"輸入要統(tǒng)計哪個結(jié)點的出度:"; cin>>v; out=G.Out_degree(v); if(out != -1) cout<<"頂點"<<v<<"的出度為:"<<out<<endl; cout<<"深度優(yōu)先遍歷:"; G.DFS_Traverse(); cout<<endl; cout<<"廣度優(yōu)先遍歷:"; G.BFS_Traverse(); cout<<endl; cout<<"計算圖的連通分支"<<endl; int num=G.Connect_Cpnt(); cout<<"圖的連通分支數(shù)目為:"<<num<<endl; cout<<"深度優(yōu)先遍歷非遞歸:"; G.DFS_Traverse_2(); cout<<endl; return 0; }
java版


package graphis;public class ArcBox {//弧結(jié)點頭尾結(jié)點位置 int tailvex; int headvex; //弧頭和弧尾相同的弧的鏈域 ArcBox hlink; ArcBox tlink; }
package graphis;public class VexNode {String data; //頂點名稱 ArcBox firstin; //指向第一條入弧 ArcBox firstout; //指向第一條出弧 }
package graphis; import java.util.*;public class OLGraph {boolean visited[]=new boolean[100];public VexNode[] xlist=new VexNode[20]; //指向頂點數(shù)組的指針 private int vexnum; //頂點數(shù) private int arcnum; //弧數(shù) private int maxnum; //頂點數(shù)的最大值 public OLGraph(int num) { this.xlist=new VexNode[num];for(int i=0;i<20;i++){xlist[i]=new VexNode();}maxnum=num; } int Locate_Vex(String v) { for(int i=0;i<vexnum;i++) { if(xlist[i].data.equals(v); return i; } return -1; } void CreateDG_OLG() { //構(gòu)造有向圖 String v1,v2; int i,j,k; System.out.println("輸入頂點數(shù)和邊的數(shù)目:"); Scanner input = new Scanner(System.in);vexnum = input.nextInt();arcnum = input.nextInt(); while(vexnum>maxnum) { System.out.println("頂點數(shù)目大于最大限制,請重新輸入:"); vexnum=input.nextInt(); ; } System.out.println("輸入各個頂點的名稱:"); for(i=0;i<vexnum;i++) { xlist[i].data=input.next();xlist[i].firstin=null; xlist[i].firstout=null; } for(k=0;k<arcnum;k++) { System.out.println("輸入第"+k+1+"條邊的兩個頂點(尾—>頭的順序):");v1=input.next();v2=input.next(); i=Locate_Vex(v1); j=Locate_Vex(v2); while(i == -1 || j == -1) { System.out.println("結(jié)點位置輸入錯誤,重新輸入: "); v1=input.next();v2=input.next(); i=Locate_Vex(v1); j=Locate_Vex(v2); } ArcBox p=new ArcBox(); p.tailvex=i; p.headvex=j; p.hlink=xlist[j].firstin; p.tlink=xlist[i].firstout; xlist[i].firstout=xlist[j].firstin=p; } System.out.println("有向圖構(gòu)造完成\n"); input.close();} //統(tǒng)計頂點入度 int In_degree(String v) { int pos=Locate_Vex(v); if(pos == -1) { System.out.println("結(jié)點不在圖中\(zhòng)n"); return -1; } ArcBox p=xlist[pos].firstin; int ins=0; while(p!=null) { ins++; p=p.hlink; } return ins; } //統(tǒng)計頂點出度 int Out_degree(String v) { int pos=Locate_Vex(v); if(pos == -1) { System.out.println("結(jié)點不在圖中\(zhòng)n"); return -1; } ArcBox p=xlist[pos].firstout; int out=0; while(p!=null) { out++; p=p.tlink; } return out; } //深度優(yōu)先遍歷 void DFS(int v) { visited[v]=true; System.out.println(xlist[v].data+" "); ArcBox p=xlist[v].firstout; while(p!=null) { if(!visited[p.headvex]) DFS(p.headvex); p=p.tlink; } } void DFS_Traverse() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) DFS(i); } //廣度優(yōu)先遍歷 void BFS(int v) { visited[v]=true; System.out.println(xlist[v].data+" "); Queue<Integer> qu= new LinkedList<Integer>(); int vex; ArcBox p; qu.offer(v); while(qu.peek()!=null) { vex=qu.peek(); qu.poll(); p=xlist[vex].firstout; while(p!=null) { if(!visited[p.headvex]) { visited[p.headvex]=true; System.out.println(xlist[p.headvex].data+" "); qu.offer(p.headvex); } p=p.tlink; } } } void BFS_Traverse() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) BFS(i); } void DFS_2(int v) { visited[v]=true; System.out.println(xlist[v].data+" "); Stack<Integer> s = new Stack<Integer>(); ArcBox p; int pos; s.push(v); while(!s.empty()) { pos=s.peek(); p=xlist[pos].firstout; while(p!=null && visited[p.headvex]) p=p.tlink; if(p==null) s.pop(); else { visited[p.headvex]=true; System.out.println(xlist[p.headvex].data+" "); s.push(p.headvex); } } } void DFS_Traverse_2() { for(int i=0;i<vexnum;i++) visited[i]=false; for(int i=0;i<vexnum;i++) if(!visited[i]) DFS_2(i); } //求連通分支數(shù) int Connect_Cpnt() { for(int i=0;i<vexnum;i++) visited[i]=false; System.out.println("下面的每一行顯示一個連通分支:\n"); int num=1; DFS(0); System.out.println("\n"); for(int i=0;i<vexnum;i++) { if(!visited[i]) { num++; DFS(i); System.out.println("\n"); } } return num; } }
package graphis;import java.util.Scanner;public class Test {public static void main(String args[]){OLGraph G=new OLGraph(20); String v; int ins,out; G.CreateDG_OLG(); System.out.println("輸入要統(tǒng)計哪個結(jié)點的入度:"); Scanner input = new Scanner(System.in);v=input.next(); ins=G.In_degree(v); if(ins != -1) System.out.println("頂點"+v+"的入度為:"+ins+'\n'); System.out.println("輸入要統(tǒng)計哪個結(jié)點的出度:"); v=input.next(); out=G.Out_degree(v); if(out != -1) System.out.println("頂點"+v+"的出度為:"+out+'\n'); System.out.println("深度優(yōu)先遍歷:"); G.DFS_Traverse(); System.out.println('\n'); System.out.println("廣度優(yōu)先遍歷:"); G.BFS_Traverse(); System.out.println('\n'); System.out.println("計算圖的連通分支"+'\n'); int num=G.Connect_Cpnt(); System.out.println("圖的連通分支數(shù)目為:"+num+'\n'); System.out.println("深度優(yōu)先遍歷非遞歸:"); G.DFS_Traverse_2(); System.out.println('\n'); input.close();}}

總結(jié)

以上是生活随笔為你收集整理的C++ 十字链表图转java版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。