数据结构—图之邻接表
尾插法建立邻接表,效率没有前插法高,但是可以去重
#include<iostream> using namespace std; #include<string.h> #define MVNum 100 typedef struct ArcNode { int adjvex;//该边所指向的顶点的位置 ArcNode *nextarc;//指向下一条边的指针 int info;//和边相关的信息 }ArcNode;//边结点 typedef struct VNode//顶点信息 { int data;//顶点信息 ArcNode *fistarc;//指向第一条依附该顶点的边的指针 }VNode,AdjList[MVNum]; typedef struct { AdjList vertices;//VNode[],顶点的集合 int vexnum,arcnum;//图的当前定点数和边数 }ALGraph; bool CreateUDG(ALGraph &G) { int i; for(i=0;i<MVNum;i++) G.vertices[i].data=0; for(i=1;i<=G.vexnum;i++) { G.vertices[i].data=i; G.vertices[i].fistarc=NULL; } for(i=0;i<G.arcnum;i++) { int h,k; cin>>h>>k; ArcNode *p1; p1=new ArcNode; p1->adjvex=k;//该边指向k //p1->nextarc=G.vertices[h].fistarc; p1->nextarc=NULL; if(G.vertices[h].fistarc==NULL) G.vertices[h].fistarc=p1; else { ArcNode *temp; temp=new ArcNode; temp=G.vertices[h].fistarc; while(temp->nextarc!=NULL) { temp=temp->nextarc; } temp->nextarc=p1; } ArcNode *p2; p2=new ArcNode; p2->adjvex=h; //p2->nextarc=G.vertices[k].fistarc; p2->nextarc=NULL; if(G.vertices[k].fistarc==NULL) G.vertices[k].fistarc=p2; else { ArcNode *temp2; temp2=new ArcNode; temp2=G.vertices[k].fistarc; while(temp2->nextarc!=NULL) { temp2=temp2->nextarc; } temp2->nextarc=p2; } //G.vertices[k].fistarc=p2; } } void Insert(ALGraph &G,int f) { G.vertices[f].data=f; G.vertices[f].fistarc=NULL; } void Out(ALGraph G) { int i; for(i=1;i<MVNum;i++) { if(G.vertices[i].data!=0) { ArcNode *p; p=G.vertices[i].fistarc; if(p!=NULL) cout<<i<<" "; else { cout<<i<<endl; continue; } while(p!=NULL) { if(p->nextarc!=NULL) cout<<p->adjvex<<" "; else cout<<p->adjvex<<endl; p=p->nextarc; } } } } int main() { int n,m;//n个顶点,m条边 while(cin>>n>>m&&n+m) { ALGraph G; G.vexnum=n; G.arcnum=m; CreateUDG(G); int f; cin>>f; Insert(G,f); Out(G); } return 0; }