sort函数的问题,不知道得到的头指针应该赋给谁,要是赋值给arclist,得到的结果
所以我就把整个sort函数直接放到调用的地方,把p(排序后的邻接表的头指针)赋值给g.vertices[i].firstarc,TM就对了,就离谱。
#include <iostream>
#include <iomanip>
#include<string.h>
using namespace std;
#define MVNum 100 //最大顶点数
#define OK 1
typedef string VerTexType; //顶点信息
typedef int OtherInfo; //和边相关的信息
//- - - - -图的邻接表存储表示- - - - -
typedef struct ArcNode //边结点
{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
OtherInfo info; //和边相关的信息
} ArcNode;
typedef struct VNode
{
VerTexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
} VNode, AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct
{
AdjList vertices; //邻接表
int vexnum, arcnum; //图的当前顶点数和边数
} Graph;
//得到顶点i的数据
VerTexType Vertexdata(const Graph &g, int i)
{
return g.vertices[i].data;
}
int LocateVex(const Graph &g, VerTexType v)
{
//确定点v在G中的位置
for(int i = 0; i < g.vexnum; ++i)
if(g.vertices[i].data == v)
return i;
return -1;
}//LocateVex
//返回v的第一个邻接顶点。若顶点在G中没有邻接表顶点,则返回-1。
int FirstAdjVex(const Graph &g, int v)
{
if(g.vertices[v].firstarc) return g.vertices[v].firstarc->adjvex;
return -1;
}
// 返回v的(相对于w的)下一个邻接顶点。
int NextAdjVex(const Graph &g, int v, int w)
{
ArcNode *p;
p=g.vertices[v].firstarc;
while(p)
{
if(p->adjvex==w&&p->nextarc)
{
return p->nextarc->adjvex;
}
p=p->nextarc;
}
return -1;
}
//对每个顶点的链表排序,按顶点编号从小到大排列
void sort( ArcNode *arclist)
{
ArcNode *p,*pre,*p1,*p2,*p3,*p4;
p=arclist;
p1=p->nextarc;
p->nextarc=NULL;
while(p1)
{
p2=p;
pre=p;
while(p2)
{
if(p2->adjvex>p1->adjvex)
{
p3=p1->nextarc;
p1->nextarc=p2;
if(p2==p) {p=p1;}
else {pre->nextarc=p1;}
p1=p3;
break;
}
pre=p2;
p2=p2->nextarc;
}
if(!p2)
{
pre->nextarc=p1;
p3=p1->nextarc;
p1->nextarc=NULL;
p1=p3;
}
}
arclist=p;
}
int CreateUDG(Graph &g)
{
//采用邻接表表示法,创建无向图G
int i,j,k;
char v1[3],v2[3];
ArcNode *p1,*p2,*p;
cin>>g.vexnum>>g.arcnum;
for(i=0; i<g.vexnum; i++)
{
cin>>g.vertices[i].data;
g.vertices[i].firstarc=NULL;
}
for(k=0; k<g.arcnum; k++)
{
cin>>v1>>v2;
i=LocateVex(g,v1);
j=LocateVex(g,v2);
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=g.vertices[i].firstarc;
g.vertices[i].firstarc=p1;
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=g.vertices[j].firstarc;
g.vertices[j].firstarc=p2;
}
for(i = 0; i < g.vexnum; ++i)//保证有序,不依赖输入次序
{
ArcNode *p,*pre,*p1,*p2,*p3,*p4,*arclist;
arclist=g.vertices[i].firstarc;
p=arclist;
p1=p->nextarc;
p->nextarc=NULL;
while(p1)
{
p2=p;
pre=p;
while(p2)
{
if(p2->adjvex>p1->adjvex)
{
p3=p1->nextarc;
p1->nextarc=p2;
if(p2==p) {p=p1;}
else {pre->nextarc=p1;}
p1=p3;
break;
}
pre=p2;
p2=p2->nextarc;
}
if(!p2)
{
pre->nextarc=p1;
p3=p1->nextarc;
p1->nextarc=NULL;
p1=p3;
}
}
g.vertices[i].firstarc=p;
}
return OK;
}//CreateUDG
void DestroyUDG(Graph &g)
{
g.vexnum=0;
g.arcnum=0;
}
int main()
{
Graph g;
CreateUDG(g);
//输出各个顶点的邻接点
for(int i = 0; i < g.vexnum; i++)
{
cout << Vertexdata(g, i) << ":";
for(int w = FirstAdjVex(g, i); w >= 0; w = NextAdjVex(g, i, w))
{
cout << ' ' << Vertexdata(g, w);
}
cout << endl;
}
DestroyUDG(g);
return 0;
}
问题就出在我排序之后的赋值,我都快码了一年的代码,还犯这种低级错误,关键是纠结了好久。