C语言图的邻接表存储

1.邻接表法

邻接表有两个部分:顶点节点、边节点

(1)顶点节点

建立一个顺序表,用来存储图中所有顶点。每个顶点为表中一个元素,每个元素包含:数据域和指针域(firstedge)

数据域:存储节点信息,如节点名称

指针域:指向顶点的第一个邻接点

存储结构如下:

#define MAX_VERTEX_NUM 100 // 图中最大节点数
typedef struct vnode       // 顶点结构
{
    VertexType vex;      // 存储顶点名
    EdgeNode *firstedge; // 边表头指针,指向顶点第一个邻接点
} VertexNode, AdjList[MAX_VERTEX_NUM];

(2)边节点

为顺序表中每个顶点建立一个单链表,单链表中每个节点都是顶点的临界点。每个边节点包含:数据域和指针域(next)

数据域:存储节点信息,如节点名称

指针域:指向顶点的下一个邻接点

有时还会增加一个域,用来存储边上的信息,如权值(此项不需要时可以不加)

存储结构如下:

typedef char VertexType;
typedef struct node // 边表节点
{
    VertexType adjvex; // 与顶点相连的邻接点下标(adjoin:邻接)
    struct node *next; // 指向顶点的下一个邻接点
} EdgeNode;

(3)图示

#include <stdio.h>
#include <stdlib.h>

#define MAX_VERTEX_NUM 100 // 图中最大节点数
typedef char VertexType;
typedef struct node // 边表节点
{
    VertexType adjvex; // 与顶点相连的邻接点下标(adjoin:邻接)
    struct node *next; // 指向顶点的下一个邻接点
} EdgeNode;

typedef struct vnode // 顶点结构
{
    VertexType vex;      // 存储顶点名
    EdgeNode *firstedge; // 边表头指针,指向顶点第一个邻接点
} VertexNode, AdjList[MAX_VERTEX_NUM];

typedef struct {
    AdjList adjlist; // 描述图结构的邻接表
    int vexnum;      // 节点的数目
    int edgenum;     // 边的数目
} ALGraph;           // adjacency list:邻接表

void LocateVex(ALGraph ALG,
               VertexType vertex); // 若图ALG中存在节点vertex,则返回该节点下标
void CreateALG(ALGraph *ALG);  // 邻接表法创建图
void TraverseALG(ALGraph ALG); // 遍历图ALG

int main(void)
{
    ALGraph g;

    CreateALG(&g);
    printf("------------------------------\n");
    printf("vexnum = %d ; edgenum = %d\n", g.vexnum, g.edgenum);
    printf("------------------------------\n");
    LocateVex(g, '0');
    printf("------------------------------\n");
    TraverseALG(g);

    return 0;
}
void CreateALG(ALGraph *ALG)
{
    VertexType ch;
    int i = 0, count = 0;
    EdgeNode *temp;

    printf("请输入图的顶点:");
    // 建立顶点表
    while ((ch = getchar()) != '\n') {
        ALG->adjlist[i].vex = ch;
        ALG->adjlist[i].firstedge = NULL;
        i++;
    }
    ALG->vexnum = i; // 顶点数

    // 头插法建立顶点的邻接边表
    for (i = 0; i < ALG->vexnum; i++) {
        printf("请输入顶点 %c 的邻接顶点:", ALG->adjlist[i].vex);
        // 按下回车结束邻接点的创建
        while ((ch = getchar()) != '\n') {
            temp = (EdgeNode *)malloc(sizeof(EdgeNode));
            temp->adjvex = ch;
            temp->next = ALG->adjlist[i].firstedge;
            ALG->adjlist[i].firstedge = temp;
            count++;
        }
    }
    ALG->edgenum = count / 2;
    // 无向图中每条边连接两个顶点,故:节点总度数 = 边数 * 2
}
void TraverseALG(ALGraph ALG)
{
    int i;
    EdgeNode *temp;

    if (ALG.vexnum == 0) {
        printf("图为空\n");
        return;
    }

    // 遍历图
    for (i = 0; i < ALG.vexnum; i++) {
        printf("顶点 %c :", ALG.adjlist[i].vex);
        temp = ALG.adjlist[i].firstedge;
        // 输出图的信息
        while (temp) {
            printf("[ %c ] -> ", temp->adjvex);
            temp = temp->next;
        }
        printf("NULL\n");

        // 以另一种方式输出图的信息
        /*
         * while (temp) {
         *     printf("(%c, %c) ", ALG.adjlist[i].vex, temp->adjvex);
         *     temp = temp->next;
         * }
         * printf("\n");
         */
    }
}

void LocateVex(ALGraph ALG, VertexType vertex)
{
    int i;

    for (i = 0; i < ALG.vexnum; i++) {
        if (ALG.adjlist[i].vex == vertex) {
            printf("节点下标:%d\n", i);
            return;
        }
    }
    printf("该节点不存在!\n");
}

  • 19
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
邻接表是一种存储结构,可以用来表示稀疏。下面是一个用C语言实现邻接表存储的示例代码: ```c #include <stdio.h> #include <stdlib.h> struct AdjListNode { int dest; struct AdjListNode* next; }; struct AdjList { struct AdjListNode* head; }; struct Graph { int V; struct AdjList* array; }; struct AdjListNode* newAdjListNode(int dest) { struct AdjListNode* newNode = (struct AdjListNode*)malloc(sizeof(struct AdjListNode)); newNode->dest = dest; newNode->next = NULL; return newNode; } struct Graph* createGraph(int V) { struct Graph* graph = (struct Graph*)malloc(sizeof(struct Graph)); graph->V = V; graph->array = (struct AdjList*)malloc(V * sizeof(struct AdjList)); int i; for (i = 0; i < V; ++i) { graph->array[i].head = NULL; } return graph; } void addEdge(struct Graph* graph, int src, int dest) { struct AdjListNode* newNode = newAdjListNode(dest); newNode->next = graph->array[src].head; graph->array[src].head = newNode; newNode = newAdjListNode(src); newNode->next = graph->array[dest].head; graph->array[dest].head = newNode; } void printGraph(struct Graph* graph) { int v; for (v = 0; v < graph->V; ++v) { struct AdjListNode* pCrawl = graph->array[v].head; printf("\n Adjacency list of vertex %d\n head ", v); while (pCrawl) { printf("-> %d", pCrawl->dest); pCrawl = pCrawl->next; } printf("\n"); } } int main() { int V = 5; struct Graph* graph = createGraph(V); addEdge(graph, 0, 1); addEdge(graph, 0, 4); addEdge(graph, 1, 2); addEdge(graph, 1, 3); addEdge(graph, 1, 4); addEdge(graph, 2, 3); addEdge(graph, 3, 4); printGraph(graph); return 0; } ``` 这个示例代码创建了一个包含5个顶点的无向,然后使用邻接表存储这个,并最终输出它的邻接表。在这个示例代码中,我们首先定义了三种结构体:`AdjListNode`、`AdjList`和`Graph`。其中,`AdjListNode`表示邻接表中的一个节,包括目标节的编号和指向下一个节指针;`AdjList`表示一个节邻接表,包括指向第一个指针;`Graph`表示整个,包括顶点数和一个指向邻接表数组的指针。 接下来,我们定义了一些函数来操作这些结构体,包括`newAdjListNode`用于创建一个新的邻接表,`createGraph`用于创建一个新的,`addEdge`用于向中添加一条边,`printGraph`用于输出邻接表。 在`main`函数中,我们首先创建了一个包含5个顶点,然后添加了7条边,最后输出了这个邻接表。 以上就是一个简单的使用C语言实现邻接表存储的示例代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值