第十一週 【專案1-圖基本演算法庫】
阿新 • • 發佈:2018-12-26
/*
*Copyright (c)2017,煙臺大學計算機與控制工程學院
*All rights reservrd.
*作者:趙楷文
*完成時間:2017年11月09日
*版本號:v1.0
*問題描述:圖的儲存結構主要包括鄰接矩陣和鄰接表,本演算法庫提供儲存結構的定義,以及用於構造圖儲存結構、不同結構的轉換及顯示的程式碼
一、graph.h
二、graph.cpp#include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; int ltag,rtag; //Ôö¼ÓµÄÏßË÷±ê¼Ç struct node *lchild; struct node *rchild; } TBTNode; void CreateTBTNode(TBTNode * &b,char *str) { TBTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; //½¨Á¢µÄ¶þ²æÊ÷³õʼʱΪ¿Õ ch=str[j]; while (ch!='\0') //strδɨÃèÍêʱѻ· { switch(ch) { case '(': top++; St[top]=p; k=1; break; //Ϊ×ó½áµã case ')': top--; break; case ',': k=2; break; //ΪÓÒ½áµã default: p=(TBTNode *)malloc(sizeof(TBTNode)); p->data=ch; p->lchild=p->rchild=NULL; if (b==NULL) //*pΪ¶þ²æÊ÷µÄ¸ù½áµã b=p; else //Òѽ¨Á¢¶þ²æÊ÷¸ù½áµã { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; } } void DispTBTNode(TBTNode *b) { if (b!=NULL) { printf("%c",b->data); if (b->lchild!=NULL || b->rchild!=NULL) { printf("("); DispTBTNode(b->lchild); if (b->rchild!=NULL) printf(","); DispTBTNode(b->rchild); printf(")"); } } } TBTNode *pre; //È«¾Ö±äÁ¿ void Thread(TBTNode *&p) { if (p!=NULL) { Thread(p->lchild); //×ó×ÓÊ÷ÏßË÷»¯ if (p->lchild==NULL) //Ç°ÇýÏßË÷ { p->lchild=pre; //½¨Á¢µ±Ç°½áµãµÄÇ°ÇýÏßË÷ p->ltag=1; } else p->ltag=0; if (pre->rchild==NULL) //ºó¼ÌÏßË÷ { pre->rchild=p; //½¨Á¢Ç°Çý½áµãµÄºó¼ÌÏßË÷ pre->rtag=1; } else pre->rtag=0; pre=p; Thread(p->rchild); //ÓÒ×ÓÊ÷ÏßË÷»¯ } } TBTNode *CreaThread(TBTNode *b) //ÖÐÐòÏßË÷»¯¶þ²æÊ÷ { TBTNode *root; root=(TBTNode *)malloc(sizeof(TBTNode)); //´´½¨¸ù½áµã root->ltag=0; root->rtag=1; root->rchild=b; if (b==NULL) //¿Õ¶þ²æÊ÷ root->lchild=root; else { root->lchild=b; pre=root; //preÊÇ*pµÄÇ°Çý½áµã,¹©¼ÓÏßË÷Óà Thread(b); //ÖÐÐò±éÀúÏßË÷»¯¶þ²æÊ÷ pre->rchild=root; //×îºó´¦Àí,¼ÓÈëÖ¸Ïò¸ù½áµãµÄÏßË÷ pre->rtag=1; root->rchild=pre; //¸ù½áµãÓÒÏßË÷»¯ } return root; } void ThInOrder(TBTNode *tb) { TBTNode *p=tb->lchild; //Ö¸Ïò¸ù½áµã while (p!=tb) { while (p->ltag==0) p=p->lchild; printf("%c ",p->data); while (p->rtag==1 && p->rchild!=tb) { p=p->rchild; printf("%c ",p->data); } p=p->rchild; } } int main() { TBTNode *b,*tb; CreateTBTNode(b,"A(B(D(,G)),C(E,F))"); printf(" ¶þ²æÊ÷:"); DispTBTNode(b); printf("\n"); tb=CreaThread(b); printf(" ÏßË÷ÖÐÐòÐòÁÐ:"); ThInOrder(tb); printf("\n"); return 0; }
三、#include <stdio.h> #include <malloc.h> #include "graph.h" //¹¦ÄÜ£ºÓÉÒ»¸ö·´Ó³Í¼Öж¥µãÁÚ½Ó¹ØϵµÄ¶þάÊý×飬¹¹Ôì³öÓÃÁÚ½Ó¾ØÕó´æ´¢µÄͼ //²ÎÊý£ºArr - Êý×éÃû£¬ÓÉÓÚÐÎʽ²ÎÊýΪ¶þάÊý×éʱ±ØÐë¸ø³öÿÐеÄÔªËظöÊý£¬Ôڴ˽«²ÎÊýArrÉùÃ÷ΪһάÊý×éÃû£¨Ö¸ÏòintµÄÖ¸Õ룩 // n - ¾ØÕóµÄ½×Êý // g - Òª¹¹Ôì³öÀ´µÄÁÚ½Ó¾ØÕóÊý¾Ý½á¹¹ void ArrayToMat(int *Arr, int n, MGraph &g) { int i,j,count=0; //countÓÃÓÚͳ¼Æ±ßÊý£¬¼´¾ØÕóÖзÇ0ÔªËظöÊý g.n=n; for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) { g.edges[i][j]=Arr[i*n+j]; //½«Arr¿´×÷n¡ÁnµÄ¶þάÊý×飬Arr[i*n+j]¼´ÊÇArr[i][j]£¬¼ÆËã´æ´¢Î»ÖõŦ·òÔÚ´ËÓ¦Óà if(g.edges[i][j]!=0 && g.edges[i][j]!=INF) count++; } g.e=count; } void ArrayToList(int *Arr, int n, ALGraph *&G) { int i,j,count=0; //countÓÃÓÚͳ¼Æ±ßÊý£¬¼´¾ØÕóÖзÇ0ÔªËظöÊý ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); G->n=n; for (i=0; i<n; i++) //¸øÁÚ½Ó±íÖÐËùÓÐÍ·½ÚµãµÄÖ¸ÕëÓòÖóõÖµ G->adjlist[i].firstarc=NULL; for (i=0; i<n; i++) //¼ì²éÁÚ½Ó¾ØÕóÖÐÿ¸öÔªËØ for (j=n-1; j>=0; j--) if (Arr[i*n+j]!=0) //´æÔÚÒ»Ìõ±ß£¬½«Arr¿´×÷n¡ÁnµÄ¶þάÊý×飬Arr[i*n+j]¼´ÊÇArr[i][j] { p=(ArcNode *)malloc(sizeof(ArcNode)); //´´½¨Ò»¸ö½Úµã*p p->adjvex=j; p->info=Arr[i*n+j]; p->nextarc=G->adjlist[i].firstarc; //²ÉÓÃÍ·²å·¨²åÈë*p G->adjlist[i].firstarc=p; } G->e=count; } void MatToList(MGraph g, ALGraph *&G) //½«ÁÚ½Ó¾ØÕógת»»³ÉÁÚ½Ó±íG { int i,j; ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); for (i=0; i<g.n; i++) //¸øÁÚ½Ó±íÖÐËùÓÐÍ·½ÚµãµÄÖ¸ÕëÓòÖóõÖµ G->adjlist[i].firstarc=NULL; for (i=0; i<g.n; i++) //¼ì²éÁÚ½Ó¾ØÕóÖÐÿ¸öÔªËØ for (j=g.n-1; j>=0; j--) if (g.edges[i][j]!=0) //´æÔÚÒ»Ìõ±ß { p=(ArcNode *)malloc(sizeof(ArcNode)); //´´½¨Ò»¸ö½Úµã*p p->adjvex=j; p->info=g.edges[i][j]; p->nextarc=G->adjlist[i].firstarc; //²ÉÓÃÍ·²å·¨²åÈë*p G->adjlist[i].firstarc=p; } G->n=g.n; G->e=g.e; } void ListToMat(ALGraph *G,MGraph &g) //½«ÁÚ½Ó±íGת»»³ÉÁÚ½Ó¾ØÕóg { int i,j; ArcNode *p; g.n=G->n; //¸ù¾Ýһ¥ͬѧ¡°¾Ù±¨¡±¸ÄµÄ¡£g.nδ¸³Öµ£¬ÏÂÃæµÄ³õʼ»¯²»Æð×÷Óà g.e=G->e; for (i=0; i<g.n; i++) //Ïȳõʼ»¯ÁÚ½Ó¾ØÕó for (j=0; j<g.n; j++) g.edges[i][j]=0; for (i=0; i<G->n; i++) //¸ù¾ÝÁÚ½Ó±í£¬ÎªÁÚ½Ó¾ØÕó¸³Öµ { p=G->adjlist[i].firstarc; while (p!=NULL) { g.edges[i][p->adjvex]=p->info; p=p->nextarc; } } } void DispMat(MGraph g) //Êä³öÁÚ½Ó¾ØÕóg { int i,j; for (i=0; i<g.n; i++) { for (j=0; j<g.n; j++) if (g.edges[i][j]==INF) printf("%3s","¡Þ"); else printf("%3d",g.edges[i][j]); printf("\n"); } } void DispAdj(ALGraph *G) //Êä³öÁÚ½Ó±íG { int i; ArcNode *p; for (i=0; i<G->n; i++) { p=G->adjlist[i].firstarc; printf("%3d: ",i); while (p!=NULL) { printf("-->%d/%d ",p->adjvex,p->info); p=p->nextarc; } printf("\n"); } }
程式測試:#include <stdio.h> #include <malloc.h> #include "graph.h" int main() { MGraph g1,g2; ALGraph *G1,*G2; int A[6][6]= { {0,5,0,7,0,0}, {0,0,4,0,0,0}, {8,0,0,0,0,9}, {0,0,5,0,0,6}, {0,0,0,5,0,0}, {3,0,0,0,1,0} }; ArrayToMat(A[0], 6, g1); //È¡¶þάÊý×éµÄÆðʼµØÖ·×÷ʵ²Î£¬ÓÃA[0]£¬ÒòÆäʵÖÊΪһάÊý×éµØÖ·£¬ÓëÐβÎÆ¥Åä printf(" ÓÐÏòͼg1µÄÁÚ½Ó¾ØÕó:\n"); DispMat(g1); ArrayToList(A[0], 6, G1); printf(" ÓÐÏòͼG1µÄÁÚ½Ó±í:\n"); DispAdj(G1); MatToList(g1,G2); printf(" ͼg1µÄÁÚ½Ó¾ØÕóת»»³ÉÁÚ½Ó±íG2:\n"); DispAdj(G2); ListToMat(G1,g2); printf(" ͼG1µÄÁÚ½Ó±íת»»³ÉÁÚ½ÓÁÚÕóg2:\n"); DispMat(g2); printf("\n"); return 0; }