数据结构图的基本操作--邻接表法(不包括深度、广度算法)

来源:互联网 发布:php程序员简历项目经验 编辑:程序博客网 时间:2024/06/05 20:16

基本操作代码如下

#include <iostream>#include <cstdlib>using namespace std; #define MAX_VERTEX_NUM 20#define ERROR -1int visited[10000];typedef struct arcnode//结点的组成域{int adjvex;struct arcnode *nextarc;//指向下一条弧的指针int *info;//该弧相关信息指针}arcnode;typedef struct vnode{//表头结点int data;//结点名字arcnode *firsarc;int value;}vnode,adjlist[MAX_VERTEX_NUM];typedef struct{//图adjlist vertices;int vexnum, arcnum;//当前顶点数,弧数int kind;}algraph;int LocateVex(algraph &G, int &v1);void creategraph(algraph &G,int v,int vr){arcnode *p, *q;int v1, v2;int i, j, k,n;G.vexnum = v;G.arcnum = vr;cout << "录入各个结点名字:" << endl;for (i = 0; i < v; i++)//录入顶点名字,值,且将依附该顶点的第一条指针附空{cin >> G.vertices[i].data;G.vertices[i].firsarc = NULL;}cout << "输入弧头弧尾,创建边:" << endl;for (k = 0; k<G.arcnum; k++) //创建边,并连接头结点  {cin >> v1;  //v1为弧尾  cin >> v2;   //v2为弧头  i = LocateVex(G, v1); j = LocateVex(G, v2);if (G.vertices[i].firsarc == NULL)  //如果链表为空新建一个表节点,让头节点的指针指向该表节点  {p = (arcnode *)new arcnode;G.vertices[i].firsarc = p;q = G.vertices[i].firsarc;}else        //链表的插入  {q = G.vertices[i].firsarc;//获取头结点的表头指针  for (n = 0; n<G.arcnum; n++, q = q->nextarc)//将q指针移动至链表的尾巴处  {if (!q->nextarc)break;}p = (arcnode *)new arcnode;q->nextarc = p; //将该边(弧)加入到链表中  q = q->nextarc;}q->adjvex = j;  //记录弧头的索引  q->nextarc = NULL;}cout << "图构建成功!"<<endl;}void destory(algraph &G)//销毁该图{for (int i = 0; i < G.vexnum; i++){G.vertices[i].firsarc = NULL;}}int LocateVex(algraph &G, int &v1)   //查找节点V1在图G的存储节点数组中的索引位置  {int i;for (i = 0; i<G.vexnum; i++){if (G.vertices[i].data == v1) //如果数组中有这个节点,返回该节点在数组中的索引  return i;}if (i >= G.vexnum)return ERROR;elsereturn 0;}int getvex(algraph &G,int v)//得到定点v的值{for (int i = 0; i < G.vexnum; i++){if (v == G.vertices[i].data)return G.vertices[i].value;}return ERROR;}void putvex(algraph &G,int v)//为定点v录入值{cout << "输入结点" << v << "值:" << endl;for (int i = 0; i < G.vexnum; i++){if (v == G.vertices[i].data)cin >> G.vertices[i].value;}}int firstadjvex(algraph &G,int v){for (int i = 0; i < G.vexnum;i++)if (G.vertices[i].data == v)cout << G.vertices[G.vertices[i].firsarc->adjvex].data << endl;return 0;}int next(algraph &G, int v, int w){arcnode *p=NULL;for (int i = 0; i < G.vexnum;i++)if (G.vertices[i].data == v)p = G.vertices[i].firsarc;if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)cout << G.vertices[p->nextarc->adjvex].data << endl;elsefor (int i = 0; i < G.arcnum; i++){p = p->nextarc;if (G.vertices[p->adjvex].data == w&&p->nextarc != NULL)cout << G.vertices[p->nextarc->adjvex].data << endl;else if (p->nextarc != NULL)continue;elsereturn ERROR;}}void shuchu(algraph &G){arcnode *p;for (int i = 0; i < G.vexnum; i++){if (G.vertices[i].data == 0)continue;else{cout << G.vertices[i].data << "->";p = G.vertices[i].firsarc;for (int j = 0; j < G.arcnum; j++){if (p != NULL){cout << G.vertices[p->adjvex].data << "->";p = p->nextarc;}elsebreak;}cout <<"^"<< endl;}}}int main(){    algraph G;int v, vr;int v1,v2;cout << "输入图的节点数量,边的数量:" << endl;cin >> v >> vr;creategraph(G, v, vr);cout << "输入结点名字,用来给结点赋值:" << endl;cin >> v1;putvex(G, v1);cout << "输入结点名字,用来输出结点值:" << endl;cin >> v1;cout << "输出结点" << v1 << "的值:" << endl;if (getvex(G, v1)<0)cout << "该顶点未录入值" << endl;elsecout << getvex(G, v1) << endl;cout << "输入结点名字,用来输出结点的第一个邻接结点:" << endl;cin >> v1;cout << "该结点为:" << endl;firstadjvex(G, v1);cout << "" << endl;cout << "输入结点v1,并输入结点v1的某个邻接结点v2,用来输出v1的邻接结点中v2的下一个结点:" << endl;cin >> v1 >> v2;cout << "该结点为:" << endl;next(G, v1, v2);cout << "该邻接表输出结果为:" << endl;shuchu(G);system("pause");return 0;}


0 0