Day10:图的邻接表C语言实现

1. 结构体定义

typedef struct ArcNode {    // 弧结点
    int adjVex;             // 连向顶点
    struct ArcNode *next;   // 下一弧结点
    //int v;                // 可选:权值
};

typedef struct {            // 顶点结点
    char name;              // 顶点名
    struct ArcNode *first;  // 首个弧结点
}VexNode, *VexList;

typedef struct {            // 邻接表
    VexList vexs;           // 顶点表
    int vexNum, arcNum;
}AdjListGraph;

2. 初始化

void AdjListGraphInit(AdjListGraph *ag, int vexNum, char *vexs)
{
    ag->vexNum = vexNum;
    ag->arcNum = 0;
    ag->vexs = malloc(sizeof(VexNode) * vexNum);
    for(int i = 0;i < vexNum;i++){
        ag->vexs[i].name = vexs[i];
        ag->vexs[i].first = NULL;
    }
}

3. 定位结点的位置

int AdjListGraphLocateVex(AdjListGraph *ag, char vex)
{
    for(int i = 0;i < ag->vexNum;i++)
        if(ag->vexs[i].name == vex)
            return i;
    return -1;
}

4. 查找第一个邻接点

char AdjListGraphFirstAdjVex(AdjListGraph *ag, char vex)
{
    int vexNo = AdjListGraphLocateVex(ag, vex);
    if(vexNo < 0)
        return '\0';
    ArcNode *first = ag->vexs[vexNo].first;
    if(first == NULL)
        return '\0';
    return ag->vexs[first->adjVex].name;
}

5. 查找下一个邻接点

char AdjListGraphNextAdjVex(AdjListGraph *ag, char vex, char pre)
{
    int vexNo = AdjListGraphLocateVex(ag, vex);
    int start = AdjListGraphLocateVex(ag, pre);
    if(vexNo < 0 || start < 0)
        return '\0';
    ArcNode *arc = ag->vexs[vexNo].first;
    while(arc != NULL){
        if(arc->adjVex == start)
            break;
        arc = arc->next;
    }
    if(arc == NULL)
        return '\0';
    arc = arc->next;
    return arc == NULL ? '\0' : ag->vexs[arc->adjVex].name;
}

6. 插入弧

void AdjListGraphInserArc(AdjListGraph *ag, char vex1, char vex2)
{
    int vexNo1 = AdjListGraphLocateVex(ag, vex1);
    int vexNo2 = AdjListGraphLocateVex(ag, vex2);
    if(vexNo1 < 0 || vexNo2 < 0)
        return;
    // 对于有向图,只需构建arc1插入vex1中
    ArcNode *arc1 = malloc(sizeof(ArcNode));
    ArcNode *arc2 = malloc(sizeof(ArcNode));
    arc1->adjVex = vexNo2;
    arc2->adjVex = vexNo1;
    // 对vex1插入,此处采取头插
    arc1->next = ag->vexs[vexNo1].first;
    ag->vexs[vexNo1].first = arc1;
    // 对vex2
    arc2->next = ag->vexs[vexNo2].first;
    ag->vexs[vexNo2].first = arc2;
    ag->arcNum++;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值