• 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("输入节点数量和边数量
    ");
     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("输入每一条边
    ");
     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("**
    ");
     64         outD++;//printf("%d
    ",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
    ",p1->next->adjvex);
     80         p1=p1->next;
     81     }
     82     //if(p1->next==NULL) printf("*****
    ");
     83     if(p1!=NULL && p1->adjvex==y)
     84     {
     85         //printf("***
    ");
     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("**
    ");
    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("输入要删除的边
    ");
    116     //scanf("%d",&i);
    117     del(g);
    118     outDegree(g,2);// 打印出度
    119     return 0;
    120 }
  • 相关阅读:
    Android 简单案例:可移动的View
    Android 简单案例:onSaveInstanceState 和 onRestoreInstanceState
    Android 简单案例:继承BaseAdapter实现Adapter
    Android ImageResizer:inSampleSize
    Android 动画fillAfter和fillBefore
    Android Runtime.getRuntime().exec
    Android Fingerprint系列之google原生界面
    GIF录制工具
    Android Graphviz 安装
    Google Java编程风格指南
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12009706.html
Copyright © 2020-2023  润新知