数据结构 邻接表有向图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(vList.GetPosP(i)->data.lis.GetPosP(j)->data == site)
{//第i个顶点结点表的第j个边的终点的位置为site时
vList.GetPosP(i)->data.lis.DelElem(j);//删除与指向顶点的边
edgeNum--;//边总数减1
return i;//返回顶点v在顶点表的位置若未找到返回的值为表的顶点数加一
}
void AdjListDirGraph:: showVertex()
{
if(vexNum) cout<<"\n图当前有"<<vexNum<<"个顶点\n依次为:";
for(int i=1; i<=vexNum; i++)//获取顶点链表的各个顶点到e中
}
void GraphInputHelp()
{
int choice=1, i;
char cTmp, cTmp2;
AdjListDirGraph G;
while(choice)
{
cout<<"\n--------------------------------------------------------------";
{
char vex;//顶点元素
LinkList<int> lis;//边链表
ListNode(){};//结点的无参构造函数
ListNode(char v) { vex=v;}//给定顶点时构造结点
void operator = (ListNode& n) {vex=n.vex; lis=n.lis;}//实现结点的赋值
int inDegree(int v);//求第v个顶点的入度
int outDegree(int v);//求以顶点v为起点的边数求第v个顶点的出度
int inDegree(char v) { return inDegree(getSite(v)); }//求顶点v的入度
int outDegree(char v) { return outDegree(getSite(v)); }//求取顶点v的出度
vList.GetPosP(v1)->data.lis.Sort();//对顶点v1表进行排序
vList.GetPosP(v1)->data.lis.KillDouble();//对顶点v1表进行去重
edgeNum += vList.GetPosP(v1)->data.lis.Length()-tmp;//将新增的边数加到图的总边数中
#include "C:\Documents and Settings\中原\桌面\Graph\LinkList.h"
//====================================================================================================================================
}
int AdjListDirGraph:: inDegree(int v)
{
int count=0;
if(v>=1 && v<=vexNum)//当要求入度的顶点在已存在顶点的表示的范围之内时进行操作
{
for(int i=1; i<=vList.Length(); i++)
{//对于所有顶点表
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
{
int site = getSite(v);
if(site>=1 && site<=vexNum)//当顶点在已存在顶点的表示的范围之内时进行操作
{
for(int i=1; i<=vList.Length(); i++)
{//i<=vList的顶点数时
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
}
}
void AdjListDirGraph:: delEdge(int v1, int v2)
{
if(v1>=1 && v2>=1 && v1<=vexNum && v2<= vexNum)//当要插入的边在顶点表示的范围之内时进行操作
{
for(int i=1; i<=vList.GetPosP(v1)->data.lis.Length(); i++)
break;
}
}
}
}
int AdjListDirGraph:: getSite(char v)
{
for(int i=1; i<=vList.Length(); i++)//搜索整个顶点表
{
if(vList.GetPosP(i)->data.vex == v) break;//当找到顶点v时计数寻找
}
{//对于每个顶点表的每条边
if(vList.GetPosP(i)->data.lis.GetPosP(j)->data == v)
{//第i个顶点结点表的第j个边的终点的位置为v
count++;//第v个顶点的入度加1
break;//中断for循环因为从第i个顶点到第v个顶点最多只有一条边
}
}
}
}
void delEdge(int v1, int v2);//删除从顶点v1到顶点v2的边v1、v2为顶点对应的位置
int getSite(char v);//获取顶点v在顶点表中的位置
void setEdge(char v1, char v2){ setEdge(getSite(v1), getSite(v2)); }//插入从顶点v1到顶点v2的边v1、v2为顶点
vList.GetPosP(i)->data.lis.GetPosP(j)->data--;
}
}
}
vList.GetPosP(site)->data.lis.Clear();//对顶点表清空
vList.DelElem(site);//删除顶点表结点v
vexNum--;//顶点总数减1
}
}
void AdjListDirGraph:: setEdge(int v1, int v2)
{//j<=第i个表结点中边表lis的元素个数时
vList.GetPosP(i)->data.lis.GetElem(j, tmp);//获取第i个顶点表的第j项边的数据部分到tmp中
cout<<" ->"<<vList.GetPosP(tmp)->data.vex;//输出显示第tmp个顶点
}
cout<<endl;
{
int site = getSite(v);
if(site == vexNum+1)
{
ListNode e(v);//生成顶点结点v
vList.TailInsert(e);//向顶点表的末位插入一个顶点结点
vexNum++;
}
}
void AdjListDirGraph:: delVertex(char v)
bool operator > (ListNode n) { return vex>n.vex; }//实现结点的比较
bool operator == (ListNode n){ return vex == n.vex; }//实现结点的比较
};
class AdjListDirGraph//定义邻接表有向图
{
public:
int vexNum, edgeNum;//定义vexNum存储图的顶点数、和有向边数edgeNum
LinkList<ListNode> vList;//定义以图的顶点结点构成的表
AdjListDirGraph(){vexNum=0; edgeNum=0;}//图的构造函数无参数时默认构造0个顶点的图
return count;
}
void AdjListDirGraph:: clear()
{
while(vexNum)
{
vList.GetPosP(1)->data.lis.Clear();//对顶点表清空
vList.DelElem(1);//删除顶点表结点v
vexຫໍສະໝຸດ Baiduum--;//顶点总数减1
}
edgeNum = 0;
void delEdge(char v1, char v2){ delEdge(getSite(v1), getSite(v2)); }//删除从顶点v1到顶点v2的边v1、v2为顶点
void showVertex();//输出图的顶点及其对应的位置
void showEdge();//输出以每个顶点为起点的边
void clear();//图清空
void operator = (AdjListDirGraph& G) {vexNum=G.vexNum; edgeNum=G.edgeNum; vList=G.vList;}
//重载运算符”="实现图的复制
};
void AdjListDirGraph:: insetVertex(char v)
{
int tmp;
if(vexNum) cout<<"\n图邻接表表示为:\n";
for(int i=1; i<=vList.Length(); i++)
{
cout<<vList.GetPosP(i)->data.vex<<" ";//输出显示邻接表的第i个表结点所表示的顶点
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
{//i<=第v1个顶点结点表的边数时
if(vList.GetPosP(v1)->data.lis.GetPosP(i)->data == v2)
{//第v1个顶点结点表的第i个边的数据部分==v2时
vList.GetPosP(v1)->data.lis.DelElem(i);//删除从顶点v1到顶点v2的边
{
cout<<vList.GetPosP(i)->data.vex<<" ";//输出显示各个顶点
}
/*cout<<"\n对应位置";
for(i=1; i<=vexNum; i++)//显示各个顶点在邻接表中的对应位置
{
cout<<i<<" ";
}
*/
cout<<endl;
}
void AdjListDirGraph:: showEdge()
~AdjListDirGraph(){clear();}//析构函数
void insetVertex(char v);//向图中插入一个顶点v
void delVertex(char v);//在图中删除顶点v
void setEdge(int v1, int v2);//插入从顶点v1到顶点v2的边v1、v2为顶点对应的位置
}
}
int AdjListDirGraph:: outDegree(int v)
{
if(v>vexNum) return 0;//当给出的顶点位置超出当前的顶点数时其出度为0
else
return vList.GetPosP(v)->data.lis.Length();//给出的顶点在当前顶点的表示范围之内时返回对应顶点表的长度
{
if(v1>=1 && v2>=1 && v1<=vexNum && v2<= vexNum)//当要插入的边在顶点表示的范围之内时进行操作
{
vList.GetPosP(v1)->data.lis.TailInsert(v2);//在顶点v1的链表中插入到顶点v2的边
int tmp = vList.GetPosP(v1)->data.lis.Length();//将顶点v1表的长度暂存到tmp中
cout<<"\n请选择相关操作:\n\n1.构造有向图2.构造无向图";
cout<<"\n--------------------------------------------------------------\nEnter确定:";
i--;//删除第i个元素后第i个位置为后一个元素故i应保持不动//中断for循环因为从第i个顶点到第v个顶点最多只有一条边
}
else if(vList.GetPosP(i)->data.lis.GetPosP(j)->data > site)
{//第i个顶点结点表的第j个边的数据部分>site时位置减1
//
//邻接表有向图部分
//
//====================================================================================================================================
struct ListNode//定义图的顶点结点每个结点包含结点vex和一个用于存储边的链表lis
if(vList.GetPosP(i)->data.lis.GetPosP(j)->data == site)
{//第i个顶点结点表的第j个边的终点的位置为site时
vList.GetPosP(i)->data.lis.DelElem(j);//删除与指向顶点的边
edgeNum--;//边总数减1
return i;//返回顶点v在顶点表的位置若未找到返回的值为表的顶点数加一
}
void AdjListDirGraph:: showVertex()
{
if(vexNum) cout<<"\n图当前有"<<vexNum<<"个顶点\n依次为:";
for(int i=1; i<=vexNum; i++)//获取顶点链表的各个顶点到e中
}
void GraphInputHelp()
{
int choice=1, i;
char cTmp, cTmp2;
AdjListDirGraph G;
while(choice)
{
cout<<"\n--------------------------------------------------------------";
{
char vex;//顶点元素
LinkList<int> lis;//边链表
ListNode(){};//结点的无参构造函数
ListNode(char v) { vex=v;}//给定顶点时构造结点
void operator = (ListNode& n) {vex=n.vex; lis=n.lis;}//实现结点的赋值
int inDegree(int v);//求第v个顶点的入度
int outDegree(int v);//求以顶点v为起点的边数求第v个顶点的出度
int inDegree(char v) { return inDegree(getSite(v)); }//求顶点v的入度
int outDegree(char v) { return outDegree(getSite(v)); }//求取顶点v的出度
vList.GetPosP(v1)->data.lis.Sort();//对顶点v1表进行排序
vList.GetPosP(v1)->data.lis.KillDouble();//对顶点v1表进行去重
edgeNum += vList.GetPosP(v1)->data.lis.Length()-tmp;//将新增的边数加到图的总边数中
#include "C:\Documents and Settings\中原\桌面\Graph\LinkList.h"
//====================================================================================================================================
}
int AdjListDirGraph:: inDegree(int v)
{
int count=0;
if(v>=1 && v<=vexNum)//当要求入度的顶点在已存在顶点的表示的范围之内时进行操作
{
for(int i=1; i<=vList.Length(); i++)
{//对于所有顶点表
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
{
int site = getSite(v);
if(site>=1 && site<=vexNum)//当顶点在已存在顶点的表示的范围之内时进行操作
{
for(int i=1; i<=vList.Length(); i++)
{//i<=vList的顶点数时
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
}
}
void AdjListDirGraph:: delEdge(int v1, int v2)
{
if(v1>=1 && v2>=1 && v1<=vexNum && v2<= vexNum)//当要插入的边在顶点表示的范围之内时进行操作
{
for(int i=1; i<=vList.GetPosP(v1)->data.lis.Length(); i++)
break;
}
}
}
}
int AdjListDirGraph:: getSite(char v)
{
for(int i=1; i<=vList.Length(); i++)//搜索整个顶点表
{
if(vList.GetPosP(i)->data.vex == v) break;//当找到顶点v时计数寻找
}
{//对于每个顶点表的每条边
if(vList.GetPosP(i)->data.lis.GetPosP(j)->data == v)
{//第i个顶点结点表的第j个边的终点的位置为v
count++;//第v个顶点的入度加1
break;//中断for循环因为从第i个顶点到第v个顶点最多只有一条边
}
}
}
}
void delEdge(int v1, int v2);//删除从顶点v1到顶点v2的边v1、v2为顶点对应的位置
int getSite(char v);//获取顶点v在顶点表中的位置
void setEdge(char v1, char v2){ setEdge(getSite(v1), getSite(v2)); }//插入从顶点v1到顶点v2的边v1、v2为顶点
vList.GetPosP(i)->data.lis.GetPosP(j)->data--;
}
}
}
vList.GetPosP(site)->data.lis.Clear();//对顶点表清空
vList.DelElem(site);//删除顶点表结点v
vexNum--;//顶点总数减1
}
}
void AdjListDirGraph:: setEdge(int v1, int v2)
{//j<=第i个表结点中边表lis的元素个数时
vList.GetPosP(i)->data.lis.GetElem(j, tmp);//获取第i个顶点表的第j项边的数据部分到tmp中
cout<<" ->"<<vList.GetPosP(tmp)->data.vex;//输出显示第tmp个顶点
}
cout<<endl;
{
int site = getSite(v);
if(site == vexNum+1)
{
ListNode e(v);//生成顶点结点v
vList.TailInsert(e);//向顶点表的末位插入一个顶点结点
vexNum++;
}
}
void AdjListDirGraph:: delVertex(char v)
bool operator > (ListNode n) { return vex>n.vex; }//实现结点的比较
bool operator == (ListNode n){ return vex == n.vex; }//实现结点的比较
};
class AdjListDirGraph//定义邻接表有向图
{
public:
int vexNum, edgeNum;//定义vexNum存储图的顶点数、和有向边数edgeNum
LinkList<ListNode> vList;//定义以图的顶点结点构成的表
AdjListDirGraph(){vexNum=0; edgeNum=0;}//图的构造函数无参数时默认构造0个顶点的图
return count;
}
void AdjListDirGraph:: clear()
{
while(vexNum)
{
vList.GetPosP(1)->data.lis.Clear();//对顶点表清空
vList.DelElem(1);//删除顶点表结点v
vexຫໍສະໝຸດ Baiduum--;//顶点总数减1
}
edgeNum = 0;
void delEdge(char v1, char v2){ delEdge(getSite(v1), getSite(v2)); }//删除从顶点v1到顶点v2的边v1、v2为顶点
void showVertex();//输出图的顶点及其对应的位置
void showEdge();//输出以每个顶点为起点的边
void clear();//图清空
void operator = (AdjListDirGraph& G) {vexNum=G.vexNum; edgeNum=G.edgeNum; vList=G.vList;}
//重载运算符”="实现图的复制
};
void AdjListDirGraph:: insetVertex(char v)
{
int tmp;
if(vexNum) cout<<"\n图邻接表表示为:\n";
for(int i=1; i<=vList.Length(); i++)
{
cout<<vList.GetPosP(i)->data.vex<<" ";//输出显示邻接表的第i个表结点所表示的顶点
for(int j=1; j<=vList.GetPosP(i)->data.lis.Length(); j++)
{//i<=第v1个顶点结点表的边数时
if(vList.GetPosP(v1)->data.lis.GetPosP(i)->data == v2)
{//第v1个顶点结点表的第i个边的数据部分==v2时
vList.GetPosP(v1)->data.lis.DelElem(i);//删除从顶点v1到顶点v2的边
{
cout<<vList.GetPosP(i)->data.vex<<" ";//输出显示各个顶点
}
/*cout<<"\n对应位置";
for(i=1; i<=vexNum; i++)//显示各个顶点在邻接表中的对应位置
{
cout<<i<<" ";
}
*/
cout<<endl;
}
void AdjListDirGraph:: showEdge()
~AdjListDirGraph(){clear();}//析构函数
void insetVertex(char v);//向图中插入一个顶点v
void delVertex(char v);//在图中删除顶点v
void setEdge(int v1, int v2);//插入从顶点v1到顶点v2的边v1、v2为顶点对应的位置
}
}
int AdjListDirGraph:: outDegree(int v)
{
if(v>vexNum) return 0;//当给出的顶点位置超出当前的顶点数时其出度为0
else
return vList.GetPosP(v)->data.lis.Length();//给出的顶点在当前顶点的表示范围之内时返回对应顶点表的长度
{
if(v1>=1 && v2>=1 && v1<=vexNum && v2<= vexNum)//当要插入的边在顶点表示的范围之内时进行操作
{
vList.GetPosP(v1)->data.lis.TailInsert(v2);//在顶点v1的链表中插入到顶点v2的边
int tmp = vList.GetPosP(v1)->data.lis.Length();//将顶点v1表的长度暂存到tmp中
cout<<"\n请选择相关操作:\n\n1.构造有向图2.构造无向图";
cout<<"\n--------------------------------------------------------------\nEnter确定:";
i--;//删除第i个元素后第i个位置为后一个元素故i应保持不动//中断for循环因为从第i个顶点到第v个顶点最多只有一条边
}
else if(vList.GetPosP(i)->data.lis.GetPosP(j)->data > site)
{//第i个顶点结点表的第j个边的数据部分>site时位置减1
//
//邻接表有向图部分
//
//====================================================================================================================================
struct ListNode//定义图的顶点结点每个结点包含结点vex和一个用于存储边的链表lis