int DeleteVex(const AlGraph *g,VerType adata) { int qq=0; ArcNode *p,*del,*pre; int pdata=LocateVertex(g,adata);//定位结点位置 if(pdata<0)//结点不存在,返回错误信息 return ERROR; p=g->vexs[pdata].firstarc; while(p) { p=p->nextarc; } int i; for(i=pdata;i<g->vexnum-1;i++)//数组内容移位 { g->vexs[i].vexinfo=g->vexs[i+1].vexinfo; g->vexs[i].firstarc=g->vexs[i+1].firstarc;//顶点信息和第一条弧的指针都移位 } g->vexs[g->vexnum-1].vexinfo=-1; g->vexs[g->vexnum-1].firstarc=NULL; for(i=0;i<g->vexnum;i++) { p=g->vexs[i].firstarc; while(p) { if(p->adjvex==pdata) { if(p==g->vexs[i].firstarc) { del=p; p=p->nextarc; g->vexs[i].firstarc=p; pre=NULL; free(del); break; } else { del=p; p=p->nextarc; pre->nextarc=p; free(del); break; } } else if(p->adjvex>pdata) { p->adjvex--; } pre=p; p=p->nextarc; } } return OK; } 优化一下这段代码,并指出问题
时间: 2024-03-13 15:47:43 浏览: 85
这段代码的问题是比较明显的,即删除顶点的过程中没有释放该顶点对应的边信息,导致内存泄漏。同时,删除顶点时采用了数组移位的方式,效率较低,可以使用指针交换的方式来优化。
下面是代码的优化版:
```
int DeleteVex(AlGraph *g, VerType adata) {
int pdata = LocateVertex(g, adata);
if (pdata < 0) return ERROR; //结点不存在,返回错误信息
//释放该顶点对应的边信息
ArcNode *p = g->vexs[pdata].firstarc, *del;
while (p) {
del = p;
p = p->nextarc;
free(del);
}
g->vexs[pdata].firstarc = NULL;
//将最后一个顶点信息和第一条弧的指针移到删除的位置
int last = g->vexnum - 1;
g->vexs[pdata].vexinfo = g->vexs[last].vexinfo;
g->vexs[pdata].firstarc = g->vexs[last].firstarc;
//更新其他边信息中的顶点位置
for (p = g->vexs[pdata].firstarc; p; p = p->nextarc) {
int adjvex = p->adjvex;
if (adjvex > pdata) {
p->adjvex--;
}
else if (adjvex == pdata) {
p->adjvex = last;
}
}
//清空最后一个顶点信息
g->vexs[last].vexinfo = -1;
g->vexs[last].firstarc = NULL;
g->vexnum--;
return OK;
}
```
优化后的代码采用了指针交换的方式,可以避免数组移位操作,提高了效率。同时,在删除顶点时释放了对应的边信息,避免了内存泄漏。
阅读全文