图的邻接表建立问题for(k=0;karcnum;k++){cin>>v1>>v2;i=LocateV(G,v1);//返回顶点的位置j=LocateV(G,v2);p=new ArcNode;//以v2为入,v1为出建立一条弧p->adjvex=j;p->nextarc=G->Vertex[i].FirstArc;G->Vertex[i].FirstArc=p;//同理一v1
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/09 05:14:23
图的邻接表建立问题for(k=0;karcnum;k++){cin>>v1>>v2;i=LocateV(G,v1);//返回顶点的位置j=LocateV(G,v2);p=new ArcNode;//以v2为入,v1为出建立一条弧p->adjvex=j;p->nextarc=G->Vertex[i].FirstArc;G->Vertex[i].FirstArc=p;//同理一v1
图的邻接表建立问题
for(k=0;karcnum;k++)
{
cin>>v1>>v2;
i=LocateV(G,v1);//返回顶点的位置
j=LocateV(G,v2);
p=new ArcNode;
//以v2为入,v1为出建立一条弧
p->adjvex=j;
p->nextarc=G->Vertex[i].FirstArc;
G->Vertex[i].FirstArc=p;
//同理一v1为入,v2为出建立一条弧
p=new ArcNode;
p->adjvex=i;
p->nextarc=G->Vertex[j].FirstArc;
G->Vertex[j].FirstArc=p;
}
这样,在深度优先遍历时,假如输入a--b,a--c,a--d 得到的顺序是a d c b,怎么样才能得到abcd这个顺序呢?(输入顺序不变)
教材上都是这么写的,明显是把新的邻接点插入最左边(即当做头结点的第一个邻接点了),怎么改成在最后一个邻接点接上呢?
我想这么改,让指针pre沿链表查找,直到pre=NULL,再把新节点生成赋给pre.
但是好像无效.怎么改正呢?
p=new ArcNode;
pre=G->Vertex[i].FirstArc;
while(pre!=NULL)
{
pre=pre->nextarc;
}
p->adjvex=j;
p->nextarc=NULL;
pre=p;
图的邻接表建立问题for(k=0;karcnum;k++){cin>>v1>>v2;i=LocateV(G,v1);//返回顶点的位置j=LocateV(G,v2);p=new ArcNode;//以v2为入,v1为出建立一条弧p->adjvex=j;p->nextarc=G->Vertex[i].FirstArc;G->Vertex[i].FirstArc=p;//同理一v1
这是我写的图的邻接表添加一条边的函数,仅供参考
有两个函数,我的这个就是在最后一个邻接点上接上的,具体思路就是先设一个指针,让指针一直循环到邻接表的尾端,然后插入新边
template
bool ALGraph::InsertEdge(const T& vex1,const T& vex2,int wgh)
{
//找到两个顶点在邻接表中的序号,分别赋值给v1,v2
//两个顶点中只要有一个在图的顶点表中未找到,则返回
int v1=LocateVertex(vex1);
int v2=LocateVertex(vex2);
if (v1==-1||v2==-1)
{
return false;
}
//为第一个顶点的邻接表中增加一条边
vertices[v1].AppendEdge(v2,wgh);
//如果为无向图,则必须在另一节点的邻接链表中增加一条边
if (style==UDG||style==UDN)
{
vertices[v2].AppendEdge(v1,wgh);
}
numEdges++;
return true;
}
template
bool VertexNode::AppendEdge(int v,int wgh)
{
EdgeNode*p=edgeList;
EdgeNode*q=NULL;
//找到链表中末节点,末节点的指针赋值给q,如果发现有一个节点的adjVex的值
//于v相同,则返回false
while (p!=NULL)
{
if (p->adjVertex==v)
{
return false;
}
q=p;
p=p->next;
}
//在邻接表的最后加上一条边
p=new EdgeNode(v,wgh);
if (q==0)
{
edgeList=p;
}
else
q->next=p;
return true;
}