//有向图的邻接表实现 #include<iostream> using namespace std; struct ENode//定义弧的结构体 { int adjvex;//某弧所指向顶点的下标 ENode* next;//指向下一条弧 int weight; //弧上的权重 }; struct VNode{//顶点的结构体类型 char data;//顶点信息 ENode* first ;//指向第一条依附该顶点的弧 }; struct ALGraph{//图的邻接表 VNode *V;//顶点数组 int vexnum;//顶点数 void InitG(int num);//初始化 void InsertArc(int from,int to,int weight);//插入弧 void DeleteArc(int from,int to);//删除弧 void Traverse();//逐个顶点输出各边 }; int main(){ ALGraph g; int n,m,w; char a,b; cin>>n>>m;//顶点数n,边数m g.InitG(n);//简历一个n个顶点的链接表 for(int i=0;i<m;i++)//数据域输进去,指针域置为空指针 { cin>>a>>b>>w;//a到b有边权值是w g.InsertArc(a-'a',b-'a',w);//字符转化为对应的下标 //g.insertArc(b-'a',a-'a',w);//无向图增加此句 } g.Traverse(); cin>>a>>b; g.DeleteArc(a-'a',b-'a'); // g.DeleteArc(a-'a',b-'a',w);//无向图增加此句 g.Traverse(); return 0; } void ALGraph::InitG(int num)//初始化一个顶点总数为num的图 { vexnum=num; V=new VNode[vexnum];//申请一个vexnum这么大的数组由V来指向 for(int i=0;i<vexnum;i++) { V[i].first=NULL;//first指针域设为空指针 cin>>V[i].data;//输入数据域 } } void ALGraph::InsertArc(int from,int to,int weight)//起点,终点,权值 { ENode *s=new ENode; s->adjvex=to;//s对应的链接点下标设为to s->weight=weight; s->next=V[from].first;//新节点s插到链表vertices[v] 的头 V[from].first=s; } void ALGraph::DeleteArc(int from,int to)//将弧<from,to>从图中删除 { ENode *p=V[from].first,*q=p;//还是节点的操作 while(p!=NULL) { if(p->adjvex==to) break; q=p; p=p->next; } if(q==p) V[from].first=p->next; else q->next=p->next; delete p; } void ALGraph::Traverse(){ for(int i=0;i<vexnum;i++) { ENode *p=V[i].first; while(p!=NULL){//当链表还没结束时,将链表输出来 cout<<V[i].data<<"-->"; cout<<V[p->adjvex].data<<endl; p=p->next; } } }