用C语言结构体定义邻接矩阵和邻接表表示图的结构体
时间: 2023-09-13 11:05:25 浏览: 140
图的邻接矩阵和邻接表表示
### 回答1:
好的,让我来帮你解答这个问题。
在C语言中,我们可以使用结构体来定义邻接矩阵和邻接表表示图的结构体。邻接矩阵是一种常见的图表示方法,它使用二维数组来存储图中各个顶点之间的关系。而邻接表则是另一种常见的图表示方法,它使用链表来存储图中各个顶点之间的关系。
以下是分别用结构体定义邻接矩阵和邻接表表示图的示例代码:
1. 邻接矩阵
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接矩阵结构体
typedef struct {
int vertexNum; // 顶点数
int edgeNum; // 边数
int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
} AdjMatrix;
// 初始化邻接矩阵
void initAdjMatrix(AdjMatrix *matrix, int vertexNum) {
int i, j;
matrix->vertexNum = vertexNum;
matrix->edgeNum = 0;
for (i = 0; i < vertexNum; i++) {
for (j = 0; j < vertexNum; j++) {
matrix->matrix[i][j] = 0;
}
}
}
// 添加边
void addEdge(AdjMatrix *matrix, int v1, int v2) {
matrix->matrix[v1][v2] = 1;
matrix->matrix[v2][v1] = 1;
matrix->edgeNum++;
}
// 删除边
void removeEdge(AdjMatrix *matrix, int v1, int v2) {
matrix->matrix[v1][v2] = 0;
matrix->matrix[v2][v1] = 0;
matrix->edgeNum--;
}
// 判断两个顶点是否相邻
int isAdjacent(AdjMatrix *matrix, int v1, int v2) {
return matrix->matrix[v1][v2];
}
```
2. 邻接表
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表结构体
typedef struct _AdjListNode {
int vertex; // 顶点编号
struct _AdjListNode *next; // 指向下一个邻接点的指针
} AdjListNode;
typedef struct {
int vertexNum; // 顶点数
int edgeNum; // 边数
AdjListNode *adjList[MAX_VERTEX_NUM]; // 邻接表
} AdjList;
// 初始化邻接表
void initAdjList(AdjList *list, int vertexNum) {
int i;
list->vertexNum = vertexNum;
list->edgeNum = 0;
for (i = 0; i < vertexNum; i++) {
list->adjList[i] = NULL;
}
}
// 添加边
void addEdge(AdjList *list, int v1, int v2) {
AdjListNode *node1 = (AdjListNode *)malloc(sizeof(AdjListNode));
node1->vertex = v2;
node1->next = list->adjList[v1];
list->adjList[v1] = node1;
AdjListNode *node2 = (AdjListNode *)malloc(sizeof(AdjListNode));
node2->vertex = v1;
node2->next = list->adjList[v2];
list->adjList[v2] = node2;
list->edgeNum++;
}
// 删除边
void removeEdge(AdjList *list, int v1, int v2) {
AdjListNode *p1 = list->adjList[v1];
AdjListNode *p2 = list->adjList[v2];
AdjListNode *prev1 = NULL;
AdjListNode *prev2 = NULL;
while (p1 != NULL && p1->vertex != v2) {
prev1 = p1;
p1 = p1->next;
}
while (p2 != NULL && p2->vertex != v1) {
prev2 = p2;
p2 = p2->next;
}
if (p1 != NULL) {
if (prev1 == NULL) {
list->adjList[v1] = p1->next;
} else {
prev1->next = p1->next;
}
free(p1);
}
if (p2 != NULL) {
if (prev2 == NULL) {
list->adjList[v2] = p2->next;
} else {
prev2->next = p2->next;
}
free(p2);
}
list->edgeNum--;
}
// 判断两个顶点是否相邻
int isAdjacent(AdjList *list, int v1, int v2) {
AdjListNode *p = list->adjList[v1];
while (p != NULL) {
if (p->vertex == v2) {
return 1;
}
p = p->next;
}
return 0;
}
```
以上就是用C语言结构体定义邻接矩阵和邻接表表示图的示例代码。它们可以帮助我们更方便地操作图的数据结构。
### 回答2:
对于用C语言来定义邻接矩阵和邻接表表示图的结构体,可以使用如下方式。
1. 邻接矩阵:
邻接矩阵是一个二维数组,大小为n*n,其中n表示图中顶点的个数。矩阵的元素A[i][j]代表从顶点i到顶点j的边的权重或者存在与否的信息。若存在边,则可以使用一个非零值来表示边的权重;若不存在边,则可以用零或者其他特殊值来表示。
具体的邻接矩阵结构体可以如下所示:
```c
#define MAX_VERTICES 100 // 图中最大顶点个数
typedef struct {
int adjacencyMatrix[MAX_VERTICES][MAX_VERTICES];
int numVertices; // 图中顶点的个数
} AdjacencyMatrixGraph;
```
2. 邻接表:
邻接表是一种链表的形式,其中每个顶点都对应一个链表,链表中存储与该顶点有边相连的顶点的信息。邻接表是一种空间效率较高的表示图的方法,尤其适用于稀疏图。
具体的邻接表结构体可以如下所示:
```c
typedef struct AdjacencyListNode {
int vertex;
struct AdjacencyListNode* next;
} AdjacencyListNode;
typedef struct {
AdjacencyListNode* adjacencyList[MAX_VERTICES]; // 指向顶点链表的指针数组
int numVertices; // 图中顶点的个数
} AdjacencyListGraph;
```
以上是用C语言结构体定义邻接矩阵和邻接表表示图的方式,其中`MAX_VERTICES`是一个预定义的常量,表示图中顶点的最大个数。可以根据实际情况进行调整,以满足不同的需求。
### 回答3:
使用C语言结构体定义邻接矩阵和邻接表表示图的结构体可以如下:
1. 邻接矩阵的结构体定义:
```
#define MAX_SIZE 100 // 图的最大顶点数
typedef struct {
int vertices[MAX_SIZE][MAX_SIZE]; // 邻接矩阵数组
int numVertices; // 顶点数
int numEdges; // 边数
} AdjacencyMatrix;
```
该结构体中包括一个二维数组`vertices`来表示顶点之间的连接关系,二维数组的行列数都等于顶点数`numVertices`。如果vertices[i][j]的值为1,表示顶点i与顶点j之间存在一条边;如果值为0,表示没有边。
2. 邻接表的结构体定义:
```
#define MAX_SIZE 100 // 图的最大顶点数
typedef struct Node {
int vertex; // 顶点的值
struct Node* next; // 指向下一个节点的指针
} Node;
typedef struct {
Node* adjacencyList[MAX_SIZE]; // 邻接表数组
int numVertices; // 顶点数
int numEdges; // 边数
} AdjacencyList;
```
邻接表的主要部分是一个动态链表,每个链表节点表示一个顶点,节点包含一个值`vertex`表示顶点的值,以及一个指向下一个节点的指针`next`。数组`adjacencyList`用于存储每个顶点的链表头指针。
以上就是使用C语言结构体定义邻接矩阵和邻接表表示图的结构体的方法。
阅读全文