邻接表|链式前向星|C++代码

 邻接表 :由顺序存储的顶点表和链接存储的边链表构成的图存储结构。


#include<iostream> 
using  namespace std; 

#define MAXVEX  100  /* 最大顶点数  */ 
typedef  char VertexType;  /* 顶点类型  */ 
typedef  int EdgeType;  /* 边上的权值类型  */ 

typedef  struct EdgeNode /* 边链表  */ 
{ 
     int adjvex; /* 邻接点域,存储该顶点对应的下标 */ 
    EdgeType weight; /* 用于存储权值,对于非网图可以不需要 */ 
     struct EdgeNode *next;  /* 链域,指向下一个邻接点 */ 
} EdgeNode; 

typedef  struct VextexNode /* 顶点表  */ 
{ 
    VertexType data; /* 顶点域,存储顶点信息 */ 
    EdgeNode *firstedge; /* 边表头指针 */ 
} VextexNode, AdjList[MAXVEX]; 

typedef  struct 
{ 
    AdjList adjList; 
     int numNodes, numEdges;  /* 图中当前顶点数和边数 */ 
} GraphAdjList; 


void CreateALGraph(GraphAdjList *Gp) 
{ 
     int i, j, k; 
    EdgeNode *pe; 
    cout <<  "输入顶点数和边数(空格分隔):" << endl; 
    cin >> Gp->numNodes >> Gp->numEdges; 

     for (i =  0 ; i < Gp->numNodes; i++) 
    { 
        cout <<  "输入顶点信息:" << endl; 
        cin >> Gp->adjList[i].data; 
        Gp->adjList[i].firstedge =  NULL; /* 将边表置为空表 */ 
    } 

     for (k =  0; k <  Gp->numEdges; k++) /* 建立边表 */ 
    { 
        cout <<  "输入边(vi,vj)的顶点序号i,j(空格分隔):" << endl; 
        cin >> i >> j; 
        pe = (EdgeNode *)malloc( sizeof(EdgeNode)); 
        pe->adjvex = j; /* 邻接序号为j */ 
         /* 将pe的指针指向当前顶点上指向的结点 */ 
        pe->next = Gp->adjList[i].firstedge; 
        Gp->adjList[i].firstedge = pe; /* 将当前顶点的指针指向pe */ 

        pe = (EdgeNode *)malloc( sizeof(EdgeNode)); 
        pe->adjvex = i; 
        pe->next = Gp->adjList[j].firstedge; 
        Gp->adjList[j].firstedge = pe; 

    } 
} 
void Print(GraphAdjList *Gp){
    for(int i=0;i<Gp->numNodes;i++){
        cout<<Gp->adjList[i].data;
        for(EdgeNode *p=Gp->adjList[i].firstedge;p!=NULL;p=p->next)
            printf("->%d",p->adjvex);
            cout<<endl;
    }
}
int main( void) 
{ 
    GraphAdjList GL; 
    CreateALGraph(&GL); 
    Print(&GL);
     return  0; 
} 

链式前向星 

静态数组实现邻接表

 head[x]:指向以x为头结点的最后一条边的编号

to[x]:第x条边对应的尾结点

next[x]:指向以x为头结点的上一条边的编号

    int head[10005], nex[10005], to[10005], tot = 0;

    void add(int x, int y)
    {
        to[++tot] = y;
        nex[tot] = head[x];
        head[x] = tot;
    }

 

#include <iostream>

//邻接表的数组实现;
//输出为倒序
int main() {
     int m,n,i;
    int u[6],v[6],w[6];
    int first[5] ;//下标为头结点;数组值为编号
    int next[5];//下标为编号,数组值为下一条相同头结点的编号
    scanf("%d %d",&n,&m);// n个点,m条边
    for(int i=0;i<n;i++) first[i]=-1;//初始化
    //建立邻接表
    for(int i=0;i<m;i++){//i是边的编号
        scanf("%d %d %d",&u[i],&v[i],&w[i]);
        //第i条边的下一条边是 前i-1条边中的最后一条以u[i]为首的结点
        next[i]=first[u[i]];
        //让第i条边成为以u[i]为头结点的第一条边;
        first[u[i]]=i;
    }
    //遍历以1为头结点的所有边
    int k=first[1];//k为编号
    while(k!=-1){
        printf("%d %d %d\n",u[k],v[k],w[k]);
        k=next[k];//下一个以1为头结点的边的编号
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值