答:
(1)邻接表的数据结构定义如下:
#define MaxVertexNum 100//图中顶点最大值
typedef struct ArcNode{//边表结点
char ivex;//边依附的另一顶点编号
struct ArcNode *next;//指向下一条边
}ArcNode;
typedef struct VNode{//顶点表结点
char data;//顶点信息
ArcNode *first;//指向顶点第一条边结点的指针
}VNode,AdjList[MaxVertexNum];
typedef struct{//顶点表结点
AdjList vertices[MaxVertexNum];//邻接表
int vexnum, arcnum;//图的顶点数和边数
}ALGraph;//ALGraph是以邻接表存储的图类型
(2)给出算法的基本设计思想如下:
无向图基于邻接表存储,一条边对应两个边结点,删除边(i, j),要分别在顶点i和j的边表中删除边结点。所以分别扫描一遍i和j的边表删除对应边即可。
(3)算法的代码描述如下:
void edge_delete(ALGraph &G, char i, char j){
ArcNode *edge, *pre;//edge遍历边表,pre记录其前驱,防断链
for(int k=0;k<G.vexnum;k++){
if(G.vertices[k].data==i){//邻接表中找到编号为i的结点
edge=G.vertices[k].first;
if(egde->ivex==j){ //删除的是第一个边结点
G.vertices[k].first =edge->next;
free(edge);
}
pre=edge,edge=edge->next;
while(!edge){//删除的不是第一个边结点
if(edge->ivex==j){//找到了边(i,j)
pre->next=edge->next;
free(edge) ;
break;
}
pre=edge,edge=edge->next;
}
}
}
if(G.vertices[k].data==j){//邻接表中找到编号为j的结点
edge=G.vertices[k].first;
if(egde->ivex==i){
G.vertices[k].first=edge->next;
free(edge);
}
pre=edge,edge=edge->next;
while(!edge){//删除的不是第一个边结点
if(edge->ivex==i){//找到了边( i,j)
pre->next=edge->next;
free(edge);
break;
}
pre=edge, edge=edge->next;
}
}
(4)因为i和j的边表中边的个数最多为n,所以时间复杂度为O(n)。