题目
试在邻接表存储结构上实现图的基本操作 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
当成功删除顶点或边时,函数返回true,否则(如顶点或边不存在、删除边时顶点v或w不存在)返回false。
答案
bool del_vertex(ListGraph* G, VertexType v)
{
bool flg = false;//要删除的结点是否存在的标志
int loc = locate_vertex(G, v);
for (int i = 0; i < G->vexnum; i++) {
//删除边链表中的结点
ArcNode *cur = G->vertex[i].firstarc, *pre = NULL, *cur_del = NULL;
if (G->vertex[i].data == v) {
flg = true;
while (cur != NULL) {
//删除结点cur
cur_del = cur;
cur = cur->nextarc;
free(cur_del);
--G->arcnum;
}
for (int j = i; j < G->vexnum; j++) {
//将后续结点的数据以及指针域依次“覆盖”到前面
G->vertex[j].data = G->vertex[j + 1].data;
G->vertex[j].firstarc = G->vertex[j + 1].firstarc;
}
--G->vexnum;//结点数减1
G->vertex[G->vexnum].data = 0;//清空原表头结点表的最后一个结点以及相应边链表
G->vertex[G->vexnum].firstarc = NULL;
--i;
} el