数据结构_十字链表(C语言)
生活随笔
收集整理的這篇文章主要介紹了
数据结构_十字链表(C语言)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)據(jù)結(jié)構(gòu)總目錄
十字鏈表
1. 圖文解析
在無向圖中,兩個頂點(diǎn)之間的連接我們稱之為邊;
而在有向圖中,兩個頂點(diǎn)之間具有方向的連接稱之為弧(英文:Arc)
如下圖中弧(A->B)的權(quán)值=10,其中A為該弧的頭頂點(diǎn),B為該弧的尾頂點(diǎn)
也可以理解為在無向圖中每條邊都存在兩條弧
十字鏈表的結(jié)構(gòu)和鄰接表的結(jié)構(gòu)較為相似,同樣采用了順序表與鏈表結(jié)構(gòu)的結(jié)合,但在十字鏈表中存在兩個鏈表,分別用于表示相同頭頂點(diǎn)和尾頂點(diǎn)的弧鏈表。
邊結(jié)點(diǎn)結(jié)構(gòu)圖
頂點(diǎn)結(jié)點(diǎn)結(jié)構(gòu)圖
圖與十字鏈表
1、在十字鏈表中,如果僅看相同頭頂點(diǎn)的弧鏈表,其結(jié)構(gòu)和鄰接表相同,采用頭插法插入弧結(jié)點(diǎn)
2、對于相同尾結(jié)點(diǎn)的弧鏈表,實(shí)際上就是在已插入的弧結(jié)點(diǎn)中,對相同尾頂點(diǎn)的弧結(jié)點(diǎn)進(jìn)行鏈接,其操作也是鏈表的頭插法。
2. 源代碼
#include <stdio.h> #include <stdlib.h> #define MaxVex 20typedef int ArcType; typedef char VertexType;// 弧結(jié)點(diǎn)結(jié)構(gòu) typedef struct ArcNode {ArcType arcData; // 弧的數(shù)據(jù)int headVertex, tailVertex; // 弧的頭頂點(diǎn)和尾頂點(diǎn)struct ArcNode *nextHeadArc, *nextTailArc; // 指向相同頭、尾頂點(diǎn)的弧指針 }ArcNode, *ArcList;// 頂點(diǎn)結(jié)點(diǎn)結(jié)構(gòu) typedef struct VertexNode {VertexType vertexData; // 頂點(diǎn)的數(shù)據(jù)ArcList headList, tailList; // 相同頭、尾頂點(diǎn)的弧鏈表 }VertexNode, *VertexList;// 十字鏈表結(jié)構(gòu) typedef struct {VertexList vertexList;int numVertexs, numArcs; }OLGraph;// 初始化十字鏈表 void InitOLGraph(OLGraph *G) {// 初始化頂點(diǎn)G->numVertexs = 0;G->numArcs = 0;G->vertexList = (VertexNode *)malloc(MaxVex * sizeof(VertexNode));// 初始化頂點(diǎn)的兩個鏈表頭結(jié)點(diǎn)(也可不帶頭結(jié)點(diǎn))int i;for (i = 0; i < MaxVex; i++){// 相同頭頂點(diǎn)的弧鏈表G->vertexList[i].headList = (ArcNode *)malloc(sizeof(ArcNode));G->vertexList[i].headList->nextHeadArc = NULL;G->vertexList[i].headList->nextTailArc = NULL;// 相同尾頂點(diǎn)的弧鏈表G->vertexList[i].tailList = (ArcNode *)malloc(sizeof(ArcNode));G->vertexList[i].tailList->nextHeadArc = NULL;G->vertexList[i].tailList->nextTailArc = NULL;}printf("已初始化十字鏈表!\n"); }// 創(chuàng)建十字鏈表 void CreateOLGraph(OLGraph *G) {printf("請輸入頂點(diǎn)數(shù)和弧數(shù):");scanf("%d %d", &G->numVertexs, &G->numArcs);// 輸入頂點(diǎn)數(shù)據(jù)int i, j, k;for (i = 0; i < G->numVertexs; i++){fflush(stdin);printf("請輸入第%d個頂點(diǎn)信息:", i + 1);scanf("%c", &G->vertexList[i].vertexData);}// 輸入弧結(jié)點(diǎn)數(shù)據(jù)ArcType w;for (k = 0; k < G->numArcs; k++){printf("請輸入弧(Ai, Aj)的頭、尾頂點(diǎn)及其權(quán)值:");scanf("%d %d %d", &i, &j, &w);// 創(chuàng)建新的弧結(jié)點(diǎn),并設(shè)置該弧結(jié)點(diǎn)的數(shù)據(jù)和頭尾頂點(diǎn)的下標(biāo)ArcNode *s;s = (ArcNode *)malloc(sizeof(ArcNode));s->arcData = w;s->headVertex = i - 1;s->tailVertex = j - 1;// 頭插法插入相同頭頂點(diǎn)的弧鏈表s->nextHeadArc = G->vertexList[i - 1].headList->nextHeadArc;G->vertexList[i - 1].headList->nextHeadArc = s;// 頭插法插入相同尾頂點(diǎn)的弧鏈表s->nextTailArc = G->vertexList[j - 1].tailList->nextTailArc;G->vertexList[j - 1].tailList->nextTailArc = s;}printf("已完成十字鏈表的創(chuàng)建!\n"); }void DisplayOLGraph(OLGraph G) {int i;ArcNode *p;for (i = 0; i < G.numVertexs; i++){printf("頂點(diǎn):%c\n", G.vertexList[i].vertexData);// 相同頭頂點(diǎn)的弧鏈表printf("\t相同頭頂點(diǎn)的弧:");p = G.vertexList[i].headList;while (p->nextHeadArc){p = p->nextHeadArc;printf("(%c)%d(%c) => ", G.vertexList[p->headVertex].vertexData,p->arcData, G.vertexList[p->tailVertex].vertexData);}printf("NULL\n");// 相同尾頂點(diǎn)的弧鏈表printf("\t相同尾頂點(diǎn)的弧:");p = G.vertexList[i].tailList;while (p->nextTailArc){p = p->nextTailArc;printf("(%c)%d(%c) => ", G.vertexList[p->headVertex].vertexData,p->arcData, G.vertexList[p->tailVertex].vertexData);}printf("NULL\n");} }int main() {OLGraph G;InitOLGraph(&G);CreateOLGraph(&G);DisplayOLGraph(G);system("pause");return 0; }3. 測試結(jié)果
總結(jié)
以上是生活随笔為你收集整理的数据结构_十字链表(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2007cad多个文件窗口上部排列_【中
- 下一篇: C 语言中可以调用命令行指令的 syst