数据结构之邻接表存储有向图或无向图及其相关操作(C++)

#include<iostream>
using namespace std;
#define maxsize 20

//边表
typedef struct ArcNode{
    int adjvex;//结点的数据域,存顶点号
    int info;//结点的数据域,保存边的权值
    ArcNode *nextarc;//结点的指针域,指向下一条边结点
 }ArcNode;

//顶点数组表
typedef struct{
   char data;
  ArcNode *firstarc;
}Vexnode;


class graph{
private: 
     Vexnode adj[maxsize];
     int e,n;
public:
    void  create(int n,int e);//创建n个顶点,e条边的图
    int searchX(char x);//查找值为x的顶点的序号;
    int degree(char x);//计算值为x的结点的度数;
    void addarc(char u,char v,int w);//增加一条边
};


int graph::searchX(char x){//查找值为x的顶点的序号
     for(int i=0;i<n;i++)
        if(adj[i].data==x) return i;
     return -1;
}


void  graph::create(int m,int k){//创建m个顶点,k条边的图
    int h,t,w;    char u,v;
   for(int i=0;i<m;i++) {//输入顶点集
      cin>> adj[i].data;  
      adj[i].firstarc=NULL;
   }
   n=m;e=k;
  for(int j=0;j<k;j++){//输入边集
      cin>>u>>v>>w;//输入一条弧<u,v,w>
      h=searchX(u);
      t=searchX(v);
      ArcNode *p=new ArcNode();
      p->adjvex=t;
      p->info=w;
      p->nextarc=adj[h].firstarc;
      adj[h].firstarc=p;
     }
}


int graph::degree(char x){//计算值为x的结点的度数
     int t=searchX(x);                      
    ArcNode *p=adj[t].firstarc;
    int count=0;
    while(p){
        count++;
        p=p->nextarc;
     }
    return count;
}


void graph::addarc(char u,char v,int w){//增加一条边
    int h=searchX(u),t=searchX(v);
    if(h==-1){adj[n].data=u;
                     adj[n].firstarc=NULL;
                     h=n;  n++;
                     }
     if(t==-1){adj[n].data=v;
                     adj[n].firstarc=NULL;
                     t=n;  n++;
                    }
      ArcNode *p=new ArcNode;
      p->adjvex=t;   p->info=w;
      p->nextarc=adj[h].firstarc;
      adj[h].firstarc=p;
      e++;
}


int main(){
    graph g;
    g.create(5,6);
    cout<<g.degree('b')<<endl;
    g.addarc('b','e',10) ;
    cout<<g.degree('b');
}
 

猜你喜欢

转载自blog.csdn.net/muhehhh/article/details/81408420