n个顶点的用邻接表存储的图G,删除数据信息为item的点
三步:
(1)在顶点数组中删除,并移动后面的几位,将数组大小变为n-1
(2)删除以这个点为顶点的链表
(3)遍历每个链表,将它的存在抹去,同时修改本来在它之后的顶点在链表中的下标(因为之前已经把这些点在数组中的下标改了,链表中的坐标也要发生相应的变化)
void DELVER(VLink G[], int n, vertype item){
int i, k = -1;
ELink *p,*q, *r;
for(i = 0;i < n;i++)
if(G[i].vertex==item){
k = i;
break;
}
if(k!=-1){
p=G[k].link;
for(i = k + 1;i < n;i++){
G[i-1].vertex=G[i].vertex;
G[i-1].link=G[i].link;
}
n--; //完成第一步
while(p!=NULL){
r = p;
p = p->next;
free(r); //第二步
}
for(i = 0;i<n;i++){
p = G[i].link;
while(p!=NULL){
if(p->adjvex==k){
if(G[i].link==p)
G[i].link=p->next;
else
q->next=p->next;
r=p;
p=p->next;
free(r);
}
else{
if(p->adjvex > k )
p->adjvex--;
q=p;
p=p->next;
}
}
}
}
}