图的邻接表存储方式的建立

图的邻接表存储方式,主要由表节点与头结点组成。

头结点中主要包含两个域:

1)存放顶点信息
2)存放与顶点相连的第一个表节点的指针

表节点中主要包含两个域:

1)存放相连的节点的序号
2)指向下一个节点的指针

#define MAXNUM 100

//表节点
typedef struct ArcNode{
    int adjvex;//邻接顶点编号
    struct ArcNode *next;//下一邻接顶点    
    }ArcNode;

//头结点
typedef struct AdjList{
    char vdata;//头结点数据信息
    ArcNode *firstarc;    //指向邻接表的第一个表节点
    }AdjList;
//
typedef struct Digraph{
    int n,e;//表示图中节点数和边数
    AdjList Head[MAXNUM];//用数组存储头结点    
    }Digraph;
//创建无向图的邻接表标示法
void CreatALJGraph(Digraph *G)
    {
     int i,j,k;
     char a;
     ArcNode *s;
     cout<<"输入节点数和边数: "<<endl;//有向图与无向图的边数不同
     cin>>i>>j;
     G->e=j;
     G->n=i;
     cout<<"输入节点信息:"<<endl;
     //建立头结点
     for(int k=0;k<G->n;k++)
         {
          cin>>a;
          G->Head[k].vdata=a;
          G->Head[k].firstarc=NULL;
         }
     //建立表节点
     for(int t=0;t<G->e;t++)
         {
          cin>>i>>j;//读入边(vi,vj)的顶点对序号
          s=(ArcNode*)malloc(sizeof(ArcNode));
          s->adjvex=j;
          s->next=G->Head[i].firstarc;
          G->Head[i].firstarc=s;
          //无向图需要两个顶点都连接,而有向图则只需连接一次即可。
          //等同于头插法建立链表
          s=(ArcNode*)malloc(sizeof(ArcNode));
          s->adjvex=i;
          s->next=G->Head[j].firstarc;
          G->Head[j].firstarc=s;
         }    
    
    }

 

posted @ 2015-05-18 17:21  amberblue  阅读(1104)  评论(0编辑  收藏  举报