zoukankan      html  css  js  c++  java
  • 数据结构之---C++语言实现图的十字链表存储表示

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


    //有向图的十字链表存储表示
    //杨鑫
    #include <iostream>
    #include <cstdio>
    #include <stdlib.h>
    #include <cstring>
    using namespace std;
    #define MAX_VERTEX_NUM 20
    #define OVERFLOW -2
    #define OK 1
    typedef 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("请输入有向图的顶点数以及弧数:
    ");
    	scanf("%d%d",&G.vexnum, &G.arcnum);
    	printf("请输入%d个顶点的值,之间有空格隔开:
    ",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)
    ",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("
    ");
    }
    
    
    //顶点的度:入度+出度
    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("=========================================
    ");
    	printf("该有向图的弧例如以下:
    ");
    	DisplayArc(G);
    	VertexType v;
    	printf("
    =========================================
    ");
    	while(1)
    	{
    		if(flag == 0)
    				break;
    		printf("请输入随意顶点,将输出该顶点度的值:");
    		scanf("%s",v);
    		getchar();
    		printf("顶点 %s 的度为 :%d
    ",v,VexDegree(G,v));
    		printf("结束请输入 0 以回车键结束
    
    ");
    		cin>>flag;
    	}
    	printf("=========================================
    ");
    	return 0;
    }
    
    



    结果:



  • 相关阅读:
    自定义 alert 弹窗
    js控制div内的滚动条的位置
    vue 的 起手式
    d3.js封装文本实现自动换行和旋转平移等功能
    redux
    mui 本地打包
    vue-router 运行机制 及 底层原理
    替代 Navigator 组件
    react-native 创建 ios 项目
    三元运算符
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6973377.html
Copyright © 2011-2022 走看看