编程语言
首页 > 编程语言> > C++实现邻接表

C++实现邻接表

作者:互联网

对于无向图(V0,V1),(V1,V2),(V2,V3),(V0,V2)对应的邻接表表示就是

 

 在代码中,你要单独对V1、V2、V3创建一种结构体类型。在对后面的节点0,1,2,3创建一种结构体类型

 

代码:

  1 #include <iostream>
  2 #include<stdio.h>
  3 #define VERTEX 4
  4 using namespace std;
  5 // 边表结点
  6 typedef struct edgenode
  7 {
  8     int adjvex;
  9     struct edgenode *next;
 10 } Node;
 11 // 顶点表结点
 12 typedef struct adjlist
 13 {
 14     int vex;
 15     Node *link;
 16 } VertexNode, AdjList[VERTEX];
 17 // 图
 18 typedef struct
 19 {
 20     int n, e;
 21     AdjList adj;
 22 
 23 } AdjGraph;
 24 // 创建图
 25 void createAdjGraph(AdjGraph &g)
 26 {
 27     int cnt;
 28     printf("输入节点数量和边数量\n");
 29     scanf("%d%d",&g.n,&g.e);
 30     for(int i=1;i<=g.n;++i)
 31         g.adj[i].link=NULL;
 32     cnt=g.e;
 33     Node *p1;
 34     printf("输入每一条边\n");
 35     while(cnt--)
 36     {
 37 
 38         int x,y;
 39         scanf("%d%d",&x,&y);
 40 
 41         p1=new Node;
 42         p1->adjvex=y;
 43         p1->next=g.adj[x].link;
 44         g.adj[x].link=p1;
 45 
 46         swap(x,y);
 47 
 48         p1=new Node;
 49         p1->adjvex=y;
 50         p1->next=g.adj[x].link;
 51         g.adj[x].link=p1;
 52     }
 53 }
 54 // 求图中顶点的出度
 55 void outDegree(AdjGraph g,int i)
 56 {
 57     Node *p;
 58     int outD;
 59     outD = 0;
 60     p = g.adj[i].link;
 61     while(NULL != p)
 62     {
 63         //printf("**\n");
 64         outD++;//printf("%d\n",p->adjvex);
 65         p = p->next;
 66 
 67     }
 68     cout << "顶点" << i << "的出度为:" << outD << endl;
 69 }
 70 
 71 void del(AdjGraph g)
 72 {
 73     int x,y;
 74     Node *p1=NULL,*p2=NULL;
 75     scanf("%d%d",&x,&y);
 76     p1=g.adj[x].link;
 77     while(p1!=NULL && p1->adjvex!=y)
 78     {
 79         //printf("%d\n",p1->next->adjvex);
 80         p1=p1->next;
 81     }
 82     //if(p1->next==NULL) printf("*****\n");
 83     if(p1!=NULL && p1->adjvex==y)
 84     {
 85         //printf("***\n");
 86         p2=p1;
 87         p1=p1->next;
 88         if(p1->next!=NULL)
 89         p2->next=p1->next;
 90         else p2->next=NULL;
 91     }
 92 
 93     swap(x,y);
 94 
 95     p1=g.adj[x].link;
 96     while(p1!=NULL && p1->adjvex!=y)
 97     {
 98         p1=p1->next;
 99     }
100     if(p1!=NULL && p1->adjvex==y)
101     {
102         //printf("**\n");
103         p2=p1;
104         p1=p1->next;
105         if(p1->next!=NULL)
106         p2->next=p1->next;
107         else p2->next=NULL;
108     }
109 }
110 int main()
111 {
112     AdjGraph g;
113     createAdjGraph(g);
114     int i;
115     printf("输入要删除的边\n");
116     //scanf("%d",&i);
117     del(g);
118     outDegree(g,2);// 打印出度
119     return 0;
120 }

 

 

 

标签:p1,实现,C++,next,int,adjvex,邻接,printf,NULL
来源: https://www.cnblogs.com/kongbursi-2292702937/p/12009706.html