基于邻接表的顶点的删除
#include <iostream>
using namespace std;
#define maxsize 100
typedef struct ArcNode{
int val;//指向的顶点名称
ArcNode* next;
ArcNode():val(0),next(nullptr){}
ArcNode(int x):val(x),next(nullptr){}
}ArcNode;
typedef struct VexNode{
int data;//顶点信息
ArcNode* first; //指向的第一条边
VexNode():data(0),first(nullptr){}
}VexNode;
typedef struct {
VexNode vexs[100];
int VexNum;
int ArcNum;
}AlGraph;
void InitGraph(AlGraph &G,int n,int m){
G.VexNum = n;
}
//构建无向图
void CreateGraph(AlGraph &G,int n,int m){
InitGraph(G,n,m);
for(int i = 1;i<=n;i++){//创造顶点
G.vexs[i].data = i; //赋值名称
}
for(int i = 1;i<=m;i++){ //创建边
int n1,n2;
cin>>n1>>n2;
ArcNode* arc = new ArcNode(n2);
arc->next = G.vexs[n1].first;
G.vexs[n1].first = arc;
ArcNode * arc1 = new ArcNode (n1);
arc1->next = G.vexs[n2].first;
G.vexs[n2].first = arc1;
}
}
void print(AlGraph G){
for(int i = 1;i<=G.VexNum;i++){
if(G.vexs[i].data !=0 ){
cout<<G.vexs[i].data;
ArcNode * p = G.vexs[i].first;
while(p){
cout<<" "<<p->val;
p = p->next;
}
cout<<endl;
}
}
}
void del_node(AlGraph &G,int n){
//删除边
for(int i = 1;i<=G.VexNum;i++){
ArcNode * p = G.vexs[i].first;
ArcNode* pre = p;
while(p){
if(p == G.vexs[i].first && p->val == n){//删除第一个结点
G.vexs[i].first = p->next;
delete p;
break;
}
if(p->val == n){ //删除其他结点
pre->next = p->next;
delete p;
break;
}
pre = p;
p = p->next;
}
}
//删除顶点
int index = 0;
for(int i = 1;i<=G.VexNum;i++){ //找到data为n的顶点
if(G.vexs[i].data == n){
index = i;
break;
}
}
//
// print(G);
for(int i = index;i<=G.VexNum-1;i++){
G.vexs[i].data = G.vexs[i+1].data;
G.vexs[i].first = G.vexs[i+1].first;
}
G.VexNum--;
}
int main(){
int n,m;
while(cin>>n>>m && (n!=0 && m!=0)){
AlGraph G;
CreateGraph(G,n,m);
int del_n;
cin>>del_n;
del_node(G,del_n);
print(G);
}
return 0;
}