【算法与数据结构】图 -- 邻接表

/************************************************************************ 边(弧)结点 -------------------------- |adjvex | info | nextarc | -------------------------- adjvex:邻接点域,该点在图中的位置 info :相关信息,比如可以保存从某顶点到该点的权值 nextac:指向下一个与该点有相同邻接点的顶点 顶点结点 ------------------ |data | firstarc | ------------------ data :该顶点的数据 firstarc:第一个与该顶点邻接的顶点 e.g. 顶点1,2,3,4 --------- -------- --------- 0 | 1 | |--->| 2 | |--->| 1 | ^ | --------- 1 | 2 | ^ | --------- --------- 2 | 3 | |--->| 3 | ^ | --------- --------- 3 | 4 | |--->| 0 | ^ | --------- --------- PS:画上面这个图 容易么我 ************************************************************************/

 

 

 

//最大顶点个数

const int MAX_VERTEX = 100; //最大值

const int MAX_VALUE = (1 << 31) - 1; //边(弧)结点

typedef struct _tagArcNode { int                 adjvex;  //该边(弧)所指向的顶点在图中的位置

    struct _tagArcNode* nextarc; //下一个与该顶点有相同邻接点的边(弧)结点

    char                info;    //相关信息,比如可以保存该边(弧)的权值

}ArcNode; //顶点节点

typedef struct _tagVNode { char data;          //顶点信息

    ArcNode* firstArc;  //该顶点的第一条边(弧)所指向的顶点

}VNode, AdjList[MAX_VERTEX]; typedef struct _tagGraph { AdjList vertices; //该图的所有顶点

    int vexnum;        //顶点个数

    int arcnum;        //边(弧)的条数

}Graph;

 

 

 

定位顶点在图中的位置,其位置也就是在一维数组中的下标

int Locate(Graph& graph, char ch) { for (int i = 0; i < graph.vexnum; ++ i) { if (ch == graph.vertices[i].data) return i; } return -1; }

 

 

构造图

void CreateGraph(Graph& graph) { int num = 0; cout << "请输入图的顶点个数:"; cin >> num; graph.vexnum = num; cout << "请输入图的边(弧)的条数:"; cin >> num; graph.arcnum = num; cout<<endl<<endl; cout<<"开始输入每个顶点"<<endl; for (int i = 0; i < graph.vexnum; ++ i) { cout << "请输入顶点:"; char ch = 0; cin >> ch; graph.vertices[i].data = ch; graph.vertices[i].firstArc = NULL; } cout<<endl<<"结束输入顶点"<<endl<<endl; cout<<"开始构造邻接表"<<endl; for (int i = 0; i < graph.vexnum; ++ i) { int nCount = 1; while(1) { cout << "请输入顶点 "<<graph.vertices[i].data<<" 的第 " << nCount++<<" 个邻接点, 输入#结束:"; char ch = 0; cin >> ch; if (ch == '#') break; ArcNode* pArcNode = new ArcNode(); pArcNode->adjvex = Locate(graph, ch); pArcNode->nextarc = NULL; //如果该顶点还没有设置第一条边(弧),则将该输入顶点确定的边(弧) //作为该顶点的第一条边(弧)

            if (NULL == graph.vertices[i].firstArc) { graph.vertices[i].firstArc = pArcNode; } //否则,遍历该顶点所在链表,找到最后一个节点,将其nextarc指针域 //设置为由当前输入的顶点确定的边(弧)

            else { ArcNode* pTemp = graph.vertices[i].firstArc; //直到找到顶点所在链表的最后一个边(弧)结点为止

                while(pTemp->nextarc != NULL) pTemp = pTemp->nextarc; //找到最后一个边(弧)结点后,将其nextarc指针域设置为当前输入的顶点所确定的边(弧)

                pTemp->nextarc = pArcNode; } } //while(1)

    } //for

 cout << endl<<"结束构造邻接表"<<endl<<endl; }

 

 

 

int _tmain(int argc, _TCHAR* argv[]) { Graph graph; CreateGraph(graph); return 0; }

 

 

 

【算法与数据结构】图 -- 邻接表

 

 

你可能感兴趣的:(数据结构)