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

/************************************************************************ 边(弧)结点 -------------------------- |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; }

 

 

 

 

 

转载于:https://my.oschina.net/u/926461/blog/350858

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值