邻接表2
试在邻接表存储结构上实现图的基本操作 del_vertex,相关定义如下:
typedef int VertexType;typedef enum{DG, UDG
}GraphType;typedef struct ArcNode{int adjvex;InfoPtr *info;struct ArcNode *nextarc;
}ArcNode;typedef struct VNode{VertexType data;ArcNode *firstarc;
}VNode;
typedef struct{VNode vertex[MAX_VERTEX_NUM];int vexnum, arcnum;GraphType type;
}ListGraph;int locate_vertex(ListGraph *G, VertexType v); //返回顶点 v 在vertex数组中的下标,如果v不存在,返回-1
bool del_vertex(ListGraph *G, VertexType v); //删除顶点 v
Attention: 判断条件如下:
当成功删除顶点或边时,函数返回true,否则(如顶点或边不存在、删除边时顶点v或w不存在)返回false。
参考代码如下:
//注意的一点是free函数包含在头文件<stdlib.h>中
#include <stdio.h>
#include <stdlib.h>
#include "graph.h" //请勿删除,否则检查不通过
bool del_vertex(ListGraph* G, VertexType v)
{int i, j;ArcNode* p, *q;j = locate_vertex(G, v);if (j == -1) return false; q = G->vertex[j].firstarc;if(q){//q存在出度 for(p = q->nextarc; p != NULL; p = q->nextarc){q->nextarc = p->nextarc;free(p);G->arcnum--;}//删除结点直接链接出去的边结点, 表头结点最后循环完单独删除free(q);//删除表头结点 G->vertex[j].firstarc = NULL;G->arcnum--;}G->vexnum--;//再删除到该节点的边for (i = 0; i < G->vexnum; i++) {p = G->vertex[i].firstarc;pNode = NULL;while (p) {if (p->adjvex == j) { //P的下个结点是Vif (!pNode) { //P是表头结点q = G->vertex[i].firstarc;//方便最后统一free G->vertex[i].firstarc = p->nextarc;}else {pNode->nextarc = p->nextarc;q = p;}free(q);G->arcnum--;break;//这个链表后面不可能还有边 (对于顶点v的入度)} else {pNode = p;p = p->nextarc;}}}return true;
}
//另外, 对于后半部分的free掉对于顶点v的入度, 我感觉icoding有问题, 另解如下, 欢迎大佬指正!!
#include <stdio.h>
#include <stdlib.h>
#include "graph.h" //请勿删除,否则检查不通过
bool del_vertex(ListGraph* G, VertexType v)
{int i, j;ArcNode* p, *q;j = locate_vertex(G, v);if (j == -1) return false; q = G->vertex[j].firstarc;if(q){//q存在出度 for(p = q->nextarc; p != NULL; p = q->nextarc){q->nextarc = p->nextarc;free(p);G->arcnum--;}//删除结点直接链接出去的边结点, 表头结点最后循环完单独删除free(q);//删除表头结点 G->vertex[j].firstarc = NULL;G->arcnum--;}G->vexnum--;for (i = j; i < G->vexnum; i++) { //表头结点中,后面的向前移动G->vertex[i] = G->vertex[i + 1];}for(i = 0; i < G->vexnum; i++){q = G->vertex[i].firstarc;if(q){if(q->adjvex == v){//q为表头 G->vertex[i].firstarc = q->nextarc;free(q);G->arcnum--;continue;}for(p = q->nextarc; p!=NULL;q = p, p = p->nextarc){if(p->adjvex == v){q->nextarc = p->nextarc;free(p);G->arcnum--;break;}}}}return true;
}
欢迎讨论区交流哦!