扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“数据库邻接表有什么特点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联建站是一家集网站建设,南宫企业网站建设,南宫品牌网站建设,网站定制,南宫网站建设报价,网络营销,网络优化,南宫网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
2. 邻接表(无向图)的特点:
有时候邻接矩阵并不是一个很好的选择:
如上图: 边数相对顶点较少,这种结构无疑是存在对存储空间的极大浪费。
邻接表: 数组和链表结合一起来存储。
1.)顶点用一个一位数组存储。
2.)每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择单链表来存储。
2. 邻接表(有向图)的特点:
把顶点当弧尾建立的邻接表,这样很容易就可以得到每个顶点的出度。
有时为了便于确定顶点的入度或以顶点为弧头的弧,我们可以建立一个有向图的逆邻接表:
3. 邻接表(网)的特点:
对于带权值的网图,可以在边表结点定义中再增加一个数据域来存储权值即可:
typedef char Vtype //顶点类型 typedef int Etype //权值类型 #definde MAXV 100; typedef struct edgeNode //边表节点 { int adjvex; //邻接点 存储该顶点对应的下标 Etype weight;//边 权值 struct edgeNode *next; }EdgeNode; typedef struct Vnode //顶点表 节点 { Vtype data; EdgeNode* firstEdge; }VNODE; // typedef struct { VNODE adjlist[MAXV]; int numV;//当前顶点数 int numE;//当前边数 }GraphAdjList; void CreateALGraph(GraphAdjList* G) { int i,j,k; EdgeNode* e= NULL; cout<<输入顶点数"; cin>>G->numV; cout<<输入边数"; cin>>G->numE; for(i=0;inumV;i++)//建立顶点信息 { cin >> G->adjlist[i].data; //输入顶点信息 G->adjlist[i].firstEdge = NULL; //边表节点 为空 } for(k=0;k >i; cout<<"输入边的结尾"; cin>>j; e = new EdgeNode; //(1,3) 这个线的插入是相互的对于两个点1,3来说 分别不同的因此有两个new e->adjvex = j; e->next = G->adjlist[i].firstEdge; //类似与栈里的 node->next = list->head; list->head = node; G->adjlist[i].firstEdge = e; e = new EdgeNode; e->adjvex = i; e->next = G->adjlist[j].firstEdge; G->adjlist[j].firstEdge = e; } }
对于无向图来说一条边对应都是两个顶点,所以在一次循环中就对i和j分别进行了插入 对于n个顶点e个边来说 O(n+e)
“数据库邻接表有什么特点”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流