提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
邻接表C实现简简单单
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、无向邻接表结构?
邻接表(Adjency List):数组和链表相结合的存储方式即为邻接表,就像下右图的结构。
二、C语言实现
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
//邻接表的结构定义
typedef struct EdgeNode{ //边表结点
int adjvex;
struct EdgeNode * next;
}EdgeNode;
typedef struct VertexNode{//顶点表结点
char data;
EdgeNode * firstedge;
}VertexNode, AdjList[MAXVEX];
typedef struct { //邻接表
AdjList adjlist;
int numVertexs;
int numEdges;
}GraphAdjList;
//邻接表的创建
void CreateGraphAdj(GraphAdjList *G){//用头插法来创建
EdgeNode * e;
int i, j, k;
printf("请输入邻接表的顶点数和边数:\n");
scanf("%d %d",&G->numVertexs, &G->numEdges);
//建立顶点表
for (i=0; i<G->numVertexs; i++){
getchar(); //获取缓冲区的回车符来避免下面的scanf函数读取到上一个scanf
//留下的回车符
printf("请输入第%d个顶点:\n", i+1);
scanf("%c",&G->adjlist[i].data); //输入顶点信息
G->adjlist[i].firstedge = NULL; //将边表置为空表
}
//建立边表
for (k=0; k<G->numEdges; k++){
printf("输入(Vi,Vj)的边序号:\n"); //输入边上(Vi,Vj)的顶点序号
scanf("%d %d", &i, &j);
//对于i顶点
e = (EdgeNode *)malloc(sizeof(EdgeNode)); //向内存申请空间,生成边表结点
e->adjvex = j; //序号j
e->next = G->adjlist[i].firstedge; //把e的next指针指向i顶点指向的结点
G->adjlist[i].firstedge = e; //把当前顶点的指针指向e
//对于j顶点
e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->adjvex = i;
e->next = G->adjlist[j].firstedge;
G->adjlist[j].firstedge = e;
}
}
//打印邻接表方法
void DisPlayGraph(GraphAdjList *G){
int i;
EdgeNode *e;
for (i=0; i<G->numVertexs; i++){
// printf("%c ", G->adjlist[i].data);
e = G->adjlist[i].firstedge;
while (e != NULL){
printf("%c-%c ", G->adjlist[i].data,G->adjlist[e->adjvex].data);
e = e->next;
}
printf("\n");
}
}
int main(void){
GraphAdjList * G = (GraphAdjList *)malloc(sizeof(GraphAdjList));
CreateGraphAdj(G);
DisPlayGraph(G);
return 0;
}