邻接表的实现(改进版)
这次代码是在上一次实现邻接表的基础上进行的改进,减少了一个类(用于存储横向结构即直接相邻节点的类),同时在Headlinklist增设了一个Topoint类的end指针用于为每个出发点插入相应的邻接节点,较上次代码来说减少了很多指针,结构上大大简化,降低了思维难度,比较容易想清楚结构。
矩阵中存储的图的结构如下:
实现代码如下:
#include <iostream> #include <string.h> using namespace std; #define WHITE -1; #define GRAY 0; #define BLACK 1; class Topoint { public: string topointname; int topointweight; int topointcolor; Topoint* nexto; Topoint() { nexto=NULL; } Topoint(string _topointname,int _topointweight,int _topointcolor) { topointname=_topointname; topointweight=_topointweight; topointcolor=_topointcolor; nexto=NULL; } void Display() { cout<<"ToPoint name: "<<topointname<<" weight: "<<topointweight<<" pointcolor: "<<topointcolor<<endl; } }; class Frompoint { public: string frompointname; int frompointcolor; Frompoint* nextpoint; Topoint* nextopoint; Frompoint() { nextpoint=NULL; nextopoint=NULL; } Frompoint(string _frompointname,int _frompointcolor) { frompointname=_frompointname; frompointcolor=_frompointcolor; nextopoint=NULL; nextpoint=NULL; } void Display() { cout<<"Frompoint name: "<<frompointname<<" pointcolor: "<<frompointcolor<<endl; } }; class Headlinklist { public: Frompoint* head; Frompoint* rear; Topoint* end; Headlinklist() { head=NULL; rear=NULL; end=NULL; } int InsertFrompoint(string frompointname,int frompointcolor) //竖直方向添加节点 { Frompoint* p=new Frompoint(frompointname,frompointcolor); if(head==NULL) { head=rear=p; return 1; } else { rear->nextpoint=p; rear=rear->nextpoint; return 1; } return 0; } int InsertTopoint(string _topointname,int _topointweight,int _topointcolor) //横向添加节点 { Topoint* p=new Topoint(_topointname,_topointweight,_topointcolor); if(rear->nextopoint==NULL) { rear->nextopoint=p; end=p; return 1; } else { end->nexto=p; end=end->nexto; return 1; } return 0; } void Display() { Frompoint* p=head; while(p!=NULL) { cout<<"出发节点:"<<endl; p->Display(); Topoint* q=p->nextopoint; cout<<"直接邻接节点:"<<endl; while(q!=NULL) { q->Display(); q=q->nexto; } p=p->nextpoint; } } }; int main() { Headlinklist head; head.InsertFrompoint("1",-1); head.InsertTopoint("2",1,-1); head.InsertTopoint("5",1,-1); head.InsertFrompoint("2",-1); head.InsertTopoint("1",1,-1); head.InsertTopoint("3",1,-1); head.InsertTopoint("4",1,-1); head.InsertTopoint("5",1,-1); head.InsertFrompoint("3",-1); head.InsertTopoint("2",1,-1); head.InsertTopoint("4",1,-1); head.InsertFrompoint("4",-1); head.InsertTopoint("2",1,-1); head.InsertTopoint("3",1,-1); head.InsertTopoint("5",1,-1); head.InsertFrompoint("5",-1); head.InsertTopoint("1",1,-1); head.InsertTopoint("2",1,-1); head.InsertTopoint("4",1,-1); head.Display(); return 0; }
输出结果如下: