数据结构之---C++语言实现图的十字链表存储表示

来源:互联网 发布:临床医学出国留学 知乎 编辑:程序博客网 时间:2024/05/18 04:54

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储。


//有向图的十字链表存储表示//杨鑫#include <iostream>#include <cstdio>#include <stdlib.h>#include <cstring>using namespace std;#define MAX_VERTEX_NUM 20#define OVERFLOW -2#define OK 1typedef int Status;typedef char VertexType[MAX_VERTEX_NUM];typedef char InfoType;//弧(边)的结构体typedef struct ArcBox{int tailvex,headvex;  //该弧的尾和头顶点的位置struct ArcBox *hlink, *tlink;  //分别为弧头相同和弧尾相同的弧的链域InfoType *info;  //该弧的相关信息的指针}ArcBox;//顶点的结构体typedef struct VexNode{VertexType data;ArcBox *firstin, *firstout;  //分别指向该顶点的第一条入弧和出弧}VexNode;//有向图的结构体typedef struct  {VexNode xlist[MAX_VERTEX_NUM];  //表头向量int vexnum, arcnum;  //有向图的当前顶点数和弧数}OLGraph;int LocateVex(OLGraph &G, VertexType u){for(int i = 0; i < G.vexnum; ++i)if(strcmp(G.xlist[i].data, u) == 0)return i;return -1;}//构造有向图G;Status CreateDG(OLGraph &G){int i,j,k;printf("请输入有向图的顶点数以及弧数:\n");scanf("%d%d",&G.vexnum, &G.arcnum);printf("请输入%d个顶点的值,之间有空格隔开:\n",G.vexnum);for(i=0; i<G.vexnum; ++i) //构造表头向量{getchar();scanf("%s",G.xlist[i].data);  //输入顶点值G.xlist[i].firstin = NULL;G.xlist[i].firstout = NULL;}VertexType v1,v2;ArcBox *p;printf("请依次输入%d条弧各自依附的两个顶点(输入格式:v1 v2)\n",G.arcnum);for(k=0; k < G.arcnum; ++k)  //输入各弧并构造十字链表{getchar();scanf("%s%s",v1,v2);i=LocateVex(G,v1);j=LocateVex(G,v2);p = (ArcBox *)malloc(sizeof(ArcBox));if(!p)exit(OVERFLOW);p->tailvex = i;p->headvex = j;p->hlink = G.xlist[j].firstin;p->tlink = G.xlist[i].firstout;p->info = NULL;G.xlist[j].firstin = G.xlist[i].firstout = p;  //完成在入弧和出弧链头的插入}getchar();return OK;}void DisplayArc(OLGraph &G){ArcBox *p;for(int i=0; i < G.vexnum; ++i){p=G.xlist[i].firstout;while(p){printf("<%s,%s> ",G.xlist[p->tailvex].data, G.xlist[p->headvex].data);p = p->tlink;}}printf("\n");}//顶点的度:入度+出度int VexDegree(OLGraph &G, VertexType v){int k = LocateVex(G,v);if(k<0)exit(OVERFLOW);int id=0,od=0;  //入度,出度ArcBox *pin = G.xlist[k].firstin;ArcBox *pout = G.xlist[k].firstout;while(pin)  //求入度{++id;pin = pin->hlink;}while(pout)  //求出度{++od;pout = pout->tlink;}return id+od; //顶点的度}int main(){int flag = 1;OLGraph G;CreateDG(G);printf("=========================================\n");printf("该有向图的弧如下:\n");DisplayArc(G);VertexType v;printf("\n=========================================\n");while(1){if(flag == 0)break;printf("请输入任意顶点,将输出该顶点度的值:");scanf("%s",v);getchar();printf("顶点 %s 的度为 :%d\n",v,VexDegree(G,v));printf("结束请输入 0 以回车键结束\n\n");cin>>flag;}printf("=========================================\n");return 0;}



结果:



0 0
原创粉丝点击