给定一个无向图,在此无向图中增加一条边。
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100 //最大顶点数
using namespace std;
typedef struct ArcNode
{//边结点
int adjvex; //邻接点域:该边所指向的顶点的位置
int data; //数据域:存储和边相关的信息
struct ArcNode* nextarc; //链域:指向下一条边的指针
}ArcNode;
typedef struct VNode
{//顶点信息
int data; //顶点结点的数据域
ArcNode *firstarc; //链域:指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct
{//邻接表
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和边数
}ALGragh;
int CreateUDG(ALGragh &G,int vexnum,int arcnum)
{//采用邻接表表示法,创建无向图G
G.vexnum=vexnum; //输入总顶点数
G.arcnum=arcnum; //输入总边数
if(G.vexnum>MVNum) return ERROR; //超出最大顶点数则结束函数
for(int i=0;i<G.vexnum;++i) //构造表头结点表
{
G.vertices[i].data=i+1; //输入顶点值
G.vertices[i].firstarc=NULL; //初始化表头结点的指针域为NULL
}
for(int j=0;j<G.arcnum;j++) //输入各边,构造邻接表
{
int h,k;
cin>>h>>k; //输入一条边依附的两个顶点h和k
ArcNode* p1=new ArcNode; //生成一个新的边结点*p1
p1->adjvex=h-1; //邻接点序号为h-1,即顶点在G.vertices中的序号
p1->data=k;
p1->nextarc=G.vertices[h-1].firstarc; //将新结点*p1插入顶点vh-1的边表头部
G.vertices[h-1].firstarc=p1;
ArcNode* p2=new ArcNode; //生成一个新的边结点*p2
p2->adjvex=k-1; //邻接点序号为k-1,即顶点在G.vertices中的序号
p2->data=h;
p2->nextarc=G.vertices[k-1].firstarc; //将新结点*p2插入顶点vk-1的边表头部
G.vertices[k-1].firstarc=p2;
}
return OK;
}
int InsertArc(ALGragh &G)
{//在以邻接表形式存储的无向图G上插入边
/**************begin************/
/**************end************/
}
int PrintGraph(ALGragh G)
{//输出图G
for(int i=0;i<G.vexnum;i++)
{
cout<<G.vertices[i].data; //先输出顶点信息
ArcNode* p=G.vertices[i].firstarc; //初始化指针p指向与顶点邻接的第一个边结点
if(p==NULL) //不存在与顶点邻接的第一个边结点
{
cout<<endl;
continue;
}
else //存在时遍历边表
{
cout<<" ";
while(p->nextarc)
{
cout<<p->data<<" ";
p=p->nextarc;
}
cout<<p->data<<endl;
}
}
return OK;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break; //输入结束标志
ALGragh G;
CreateUDG(G,n,m); //采用邻接表表示法,创建无向图G
InsertArc(G); //在图G中增添新边
PrintGraph(G); //输出图G
}
return 0;
}