diff --git a/DataStructure/README.md b/DataStructure/README.md index 4c444fa..7b17884 100644 --- a/DataStructure/README.md +++ b/DataStructure/README.md @@ -16,7 +16,9 @@ ├── test3 # 实验3 ├── test4 # 实验4 ├── test5 # 实验5 -└── test6 # 实验6 +├── test6 # 实验6 +├── test7 # 实验7 +└── test8 # 实验8 ``` ### 实验结果 - 实验 1 @@ -42,3 +44,11 @@ - 实验 6 ![实验 6](./images/test6.png) + +- 实验 7 + + ![实验 7](./images/test7.png) + +- 实验 8 + + ![实验 8](./images/test8.png) diff --git a/DataStructure/images/test7.png b/DataStructure/images/test7.png new file mode 100644 index 0000000..308bf96 Binary files /dev/null and b/DataStructure/images/test7.png differ diff --git a/DataStructure/images/test8.png b/DataStructure/images/test8.png new file mode 100644 index 0000000..ff35f39 Binary files /dev/null and b/DataStructure/images/test8.png differ diff --git a/DataStructure/test7/实验七.cpp b/DataStructure/test7/实验七.cpp new file mode 100644 index 0000000..a166a18 --- /dev/null +++ b/DataStructure/test7/实验七.cpp @@ -0,0 +1,133 @@ +#include + +int inf = 1000; + +typedef struct +{ + int weight; // ½áµãȨֵ + int parent, lchild, rchild; // ½áµãµÄË«Çס¢×óº¢×Ó¡¢ÓÒº¢×ÓµÄϱê + char ch; // ×Ö·û +} HTNode, *HuffmanTree; + +// ²éÕÒ +int Find(HuffmanTree HT, int n) +{ + int min = 0; + for (int i = 1; i <= n; i++) + { + if (HT[i].weight < HT[min].weight && HT[i].parent == 0) + min = i; + } + return min; +} + +// Ñ¡Ôñ +void select(HuffmanTree HT, int n, int &s1, int &s2) // ´«Èë²ÎÊýn=k-1 +{ + s1 = Find(HT, n); // a¡¢ÔÚHT[k](1¡Ük¡Üi-1)ÖÐÑ¡ÔñÁ½¸öÆäË«Ç×ÓòΪ0£¬ ÇÒȨֵ×îСµÄ½áµã£¬²¢·µ»ØËüÃÇÔÚHTÖеÄÐòºÅs1ºÍs2 + HT[s1].parent = n + 1; // b¡¢µÃµ½Ð½áµãn + 1£¬´ÓÉ­ÁÖÖÐɾ³ýs1,s2£¬½«s1,s2µÄË«Ç×ÓòÓÉ0¸ÄΪk (¼´n+1) + s2 = Find(HT, n); + HT[s2].parent = n + 1; // b¡¢µÃµ½Ð½áµãn + 1£¬´ÓÉ­ÁÖÖÐɾ³ýs1,s2£¬½«s1,s2µÄË«Ç×ÓòÓÉ0¸ÄΪk (¼´n+1) +} + +// ¹¹Ôì +void CreatHuffmanTree(HuffmanTree &HT, int weight[], char c[], int n) // char c[100]; ×Öĸ +{ + if (n <= 1) + return; + int m = 2 * n - 1; // Êý×é´æ´¢2n-1¸öÔªËØ + HT = new HTNode[m + 1]; // 0ºÅµ¥ÔªÎ´Óã¬ËùÒÔÐèÒª¿ª±Ùm+1¸öµ¥Ôª£¬HT[m]±íʾ¸ù½áµã + for (int i = 1; i <= m; ++i) // ½«2n-1¸öÔªËØµÄlch¡¢ rch¡¢ parent³õʼ»¯Îª0, ch×Ö·ûÈ«²¿³õʼ»¯Îª# + { + // todo list ´¦Àíparent ¡¢lchild ¡¢rchild + HT[i].parent = 0; + HT[i].lchild = 0; + HT[i].rchild = 0; + HT[i].ch = '#'; + } + HT[0].weight = inf; // int inf = 1000; + + for (int j = 1; j <= n; ++j) + { + // todo list //»ñÈ¡ ǰn¸öµ¥ÔªÖÐÒ¶×Ó½ÚµãµÄ weightÖµ + HT[j].weight = weight[j]; + HT[j].ch = c[j]; // »ñÈ¡ ǰn¸öµ¥ÔªÖÐÒ¶×Ó½ÚµãµÄ ×Ö·û + } + for (int k = n + 1; k <= m; ++k) // ºÏ²¢²úÉún-1¸ö½áµã¡ª¡ª¹¹ÔìHuffmanÊ÷ + { + int s1, s2; + select(HT, k - 1, s1, s2); // Ñ¡ÔñÁ½¸öÐèÒªÇóºÍµÄϱê + // todo list //c¡¢s1,s2·Ö±ð×÷ΪkµÄ×óÓÒº¢×Ó + HT[k].lchild = s1; + HT[k].rchild = s2; + // todo list //c¡¢k µÄȨֵΪ×óÓÒº¢×ÓȨֵ֮ºÍ + HT[k].weight = HT[s1].weight + HT[s2].weight; + } +} + +// Êä³ö¹þ·òÂüÊ÷ +void DisplayHF(HuffmanTree HT, int r) +{ + printf("%c %d\n", HT[r].ch, HT[r].weight); + + int s1 = HT[r].lchild; + int s2 = HT[r].rchild; + if (s1 != 0) + DisplayHF(HT, s1); + if (s2 != 0) + DisplayHF(HT, s2); +} + +// Êä³ö¹þ·òÂü±àÂë +void DisplayHFCode(HuffmanTree HT, int r, int arr[], int top) +{ + int s1 = HT[r].lchild; // »ñÈ¡µ±Ç°½ÚµãµÄ×óº¢×ÓË÷Òý¸³Öµ¸øs1 + int s2 = HT[r].rchild; // »ñÈ¡µ±Ç°½ÚµãµÄÓÒº¢×ÓË÷Òý¸³Öµ¸øs2 + + if (HT[r].lchild != 0) + { // ×óº¢×Ó´æÔÚ + arr[top] = 0; // ÔÚ·¾¶Êý×éarrµÄµ±Ç°Î»ÖÃtop´æÈë0£¬±íʾ×ßÏò×óº¢×Ó + DisplayHFCode(HT, s1, arr, top + 1); // µÝ¹éµ÷ÓÃDisplayHFCodeº¯Êý£¬´¦Àí×óº¢×ӽڵ㣬ͬʱtop¼Ó1 + } + if (HT[r].rchild != 0) + { // ÓÒº¢×Ó´æÔÚ + arr[top] = 1; // ÔÚ·¾¶Êý×éarrµÄµ±Ç°Î»ÖÃtop´æÈë1£¬±íʾ×ßÏòÓÒº¢×Ó + DisplayHFCode(HT, s2, arr, top + 1); // µÝ¹éµ÷ÓÃDisplayHFCodeº¯Êý£¬´¦ÀíÓÒº¢×ӽڵ㣬ͬʱtop¼Ó1 + } + if (HT[r].lchild == 0 && HT[r].rchild == 0) + { // Ò¶×Ó½Úµã + printf("×Ö·û %c µÄ±àÂë: ", HT[r].ch); // ´òÓ¡µ±Ç°Ò¶×Ó½Úµã¶ÔÓ¦µÄ×Ö·û + for (int i = 0; i < top; ++i) + { // ±éÀú·¾¶Êý×éarr£¬´Ó0µ½top-1 + printf("%d", arr[i]); // ´òӡ·¾¶Êý×éÖеÄÿ¸öÔªËØ£¬¼´×Ö·ûµÄ¹þ·òÂü±àÂë + } + printf("\n"); + } +} + +int main() +{ + HuffmanTree HT; + int a[100]; // Ȩֵ + char c[100]; // ×Öĸ + int arr[100]; // arr:ÓÃÓÚ´æ´¢´Ó¸ù½áµãµ½µ±Ç°½áµãµÄ·¾¶ÉϵÄ0ºÍ1µÄÊý×é + int top = 0; // top: arrÊý×éµÄµ±Ç°Ë÷Òý£¬±íʾÒѾ­´æ´¢µ½µÄ·¾¶µÄ³¤¶È + + printf("ÇëÊäÈëÆß×éÊý¾Ý!(×Öĸ Ȩֵ)\n"); + for (int i = 1; i <= 7; i++) + { + scanf("%c %d", &c[i], &a[i]); + getchar(); // ÎüÊÕ»»Ðзû£¬±ÜÃâÓ°ÏìÏÂÒ»´ÎÊäÈë + } + CreatHuffmanTree(HT, a, c, 7); + printf("¹þ·òÂüÊ÷ÏÈÐò±éÀúÐòÁÐΪ£¨×Öĸ Ȩֵ£©£º\n"); + printf("ÐÂÉú³É½áµãÓá®#¡¯±ê¼Ç\n"); + DisplayHF(HT, 7 * 2 - 1); // ¸ù½ÚµãϱêΪ2n-1=13 + + printf("¹þ·òÂü±àÂëΪ£º\n"); + DisplayHFCode(HT, 7 * 2 - 1, arr, top); + + // ÊͷŶ¯Ì¬·ÖÅäµÄÄڴ棨±ÜÃâÄÚ´æÐ¹Â©£© + delete[] HT; + return 0; +} diff --git a/DataStructure/test8/实验八.cpp b/DataStructure/test8/实验八.cpp new file mode 100644 index 0000000..b372813 --- /dev/null +++ b/DataStructure/test8/实验八.cpp @@ -0,0 +1,228 @@ +#include +#include +#include + +#define MaxSize 8 + +typedef struct ArcNode +{ // ¡¾±ß½áµã¡¿ + int adjvex; // ¸Ã±ßËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode *nextarc; // Ö¸ÏòÏÂÒ»Ìõ±ßµÄÖ¸Õë +} ArcNode; + +typedef struct VNode +{ // ¡¾±íÍ·½áµã¡¿ + char data[3]; // ¶¥µãÐÅÏ¢¡ª¡ªÃ¿¸ö¶¥µãµÄÊý¾ÝÊÇÒ»¸öÓÉ3¸ö×Ö·û×é³ÉµÄ×Ö·û´®£¨»ò×Ö·ûÊý×飩V0,V1 + ArcNode *firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +} VNode; + +typedef struct +{ + VNode vertices[MaxSize]; // ÁÚ½Ó±í(verticesΪÊý×éÃû) + int vexnum, arcnum; // ͼµÄµ±Ç°¶¥µãÊýºÍ±ßÊý +} ALGragh; + +// 1¡¢¹¹½¨Í¼£º²Î¿¼P151Ëã·¨6.2 +void InitList(ALGragh &G, char a[][3]) +{ + int i, j; + for (i = 0; i < G.vexnum; i++) + { + for (j = 0; j < 3; j++) + // todo list //ÊäÈë¶¥µãÖµ + G.vertices[i].data[j] = a[i][j]; + // todo list //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + G.vertices[i].firstarc = NULL; + } + + printf("ÇëÊäÈë¸÷±ßËùÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖÃ\n"); + for (int k = 0; k < G.arcnum; k++) + { + scanf("%d %d", &i, &j); + // Éú³ÉÒ»¸öеı߽áµã*p1: + ArcNode *p1 = (ArcNode *)malloc(sizeof(struct ArcNode)); + // todo list Éè´ËÁÚ½ÓµãÐòºÅΪj£¬²¢½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿(Í·²å·¨) + p1->adjvex = j; + p1->nextarc = G.vertices[i].firstarc; + G.vertices[i].firstarc = p1; + + // Éú³ÉÁíÒ»¸ö¶Ô³ÆµÄеı߽áµã*p2£º + ArcNode *p2 = (ArcNode *)malloc(sizeof(struct ArcNode)); + // todo list Éè´ËÁÚ½ÓµãÐòºÅΪi£¬²¢½«Ð½áµã*p2²åÈë¶¥µãvjµÄ±ß±íÍ·²¿(Í·²å·¨) + p2->adjvex = i; + p2->nextarc = G.vertices[j].firstarc; + G.vertices[j].firstarc = p2; + } +} + +// 2¡¢Êä³öÁÚ½Ó±í +void PrintInf(ALGragh G) +{ + int i; + ArcNode *p; // struct ArcNode* p; + printf("Êä³öͼµÄÁÚ½Ó±í£º\n"); + for (i = 0; i < G.vexnum; i++) + { // G.vexnum±íʾͼÖеĶ¥µãÊýÁ¿¡£ + printf("%s ", G.vertices[i].data); // ´òÓ¡µ±Ç°¶¥µã i µÄÊý¾Ý (%s ±»ÓÃÓÚ±íʾ´ý²åÈëµÄÊý¾ÝÊÇ×Ö·û´®ÀàÐÍ) + // for (// todo list) //forÑ­»·±éÀúµ±Ç°¶¥µã i µÄËùÓÐÁÚ½Ó¶¥µã£¬²¢´òÓ¡ÕâЩÁÚ½Ó¶¥µã¡£ + for (p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) + printf("%d ", p->adjvex); + printf("\n"); + } +} + +// 3¡¢¶Ô²ÉÓá¾ÁÚ½Ó±í¡¿±íʾµÄͼ£¬×öÉî¶ÈÓÅÏȱéÀú£º²Î¿¼P157Ëã·¨6.6 +void DFS_AL(ALGragh G, int visited[], int v) +{ + printf("%s ", G.vertices[v].data); // ·ÃÎÊµÚ v ¸ö¶¥µã + ArcNode *p; + int w; + visited[v] = 1; + + // todo list //½« p ³õʼ»¯ÎªÖ¸Ïò¶¥µã v µÄµÚÒ»¸öÁÚ½ÓµãµÄÖ¸Õë + p = G.vertices[v].firstarc; + // todo list //whileÑ­»·£º¶Ôvδ±»·ÃÎʵÄÁÚ½Ó¶¥µãwµÝ¹éµ÷ÓÃDFSTraverse º¯Êý£»²¢Ñ°ÕÒvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + while (p != NULL) + { + w = p->adjvex; + if (!visited[w]) + DFS_AL(G, visited, w); + p = p->nextarc; + } +} + +// 4¡¢Éî¶ÈÓÅÏȱéÀú·ÇÁ¬Í¨Í¼£¨Ò²¼æÈÝÁ¬Í¨Í¼£© £º ²Î¿¼P156Ëã·¨6.4 £¨¿ÉÓÃÓÚ¼ÆËãÁ¬Í¨·ÖÁ¿µÄ¸öÊý£¬µ«ÐèÒªÔö¼Ócount±äÁ¿£¬ÈçÏÂËã·¨5£© +void DFSTraverse_AL(ALGragh G, int visited[]) +{ + int v; + for (v = 0; v < G.vexnum; v++) // ³õʼ»¯±ê¼ÇÊý×é,ÖÃΪ0 + visited[v] = 0; + for (v = 0; v < G.vexnum; v++) + // todo list Èç¹ûÓж¥µãûÓб»·ÃÎÊ£¬ÄǾÍÒÔËüΪÆðµã±éÀúËùÔÚµÄÁ¬Í¨·ÖÁ¿ + if (!visited[v]) + DFS_AL(G, visited, v); + printf("\n"); +} + +// 5¡¢¼ÆËãÁ¬Í¨·ÖÁ¿µÄ¸öÊý +void Count(ALGragh G, int visited[]) +{ + int count = 0, v; + for (v = 0; v < G.vexnum; v++) // ³õʼ»¯±ê¼ÇÊý×é,ÖÃΪ0 + visited[v] = 0; + for (v = 0; v < G.vexnum; v++) + // todo list Èç¹ûÓж¥µãûÓб»·ÃÎÊ£¬ÄǾÍÒÔËüΪÆðµã±éÀúËùÔÚµÄÁ¬Í¨·ÖÁ¿£¬Á¬Í¨·ÖÁ¿¸öÊý¼ÓÒ» + if (!visited[v]) + { + DFS_AL(G, visited, v); + count++; + } + printf("\n"); + printf("Á¬Í¨·ÖÁ¿¸öÊý:%d\n", count); +} + +// ˼¿¼1 +// ¶Ô²ÉÓá¾ÁÚ½Ó¾ØÕó¡¿±íʾµÄͼ£¬×öÉî¶ÈÏȱéÀú£º +void DFS_AM(ALGragh G, int visited[], int v) +{ +} +// Éî¶ÈÓÅÏȱéÀú·ÇÁ¬Í¨Í¼ +void DFSTraverse_AM(ALGragh G, int visited[], int v) +{ +} + +// ˼¿¼2 +// ¶Ô²ÉÓá¾ÁÚ½Ó±í¡¿±íʾµÄͼ£¬×ö¹ã¶ÈÏȱéÀú£º +void BFS_AL(ALGragh G, int visited[], int v) +{ +} +// ¹ã¶ÈÓÅÏȱéÀú·ÇÁ¬Í¨Í¼ +void BFSTraverse_AL(ALGragh G, int visited[], int v) +{ +} + +// ˼¿¼3 +// ¶Ô²ÉÓá¾ÁÚ½Ó¾ØÕó¡¿±íʾµÄͼ£¬×ö¹ã¶ÈÏȱéÀú£º +void BFS_AM(ALGragh G, int visited[], int v) +{ +} +// ¹ã¶ÈÓÅÏȱéÀú·ÇÁ¬Í¨Í¼ +void BFSTraverse_AM(ALGragh G, int visited[], int v) +{ +} + +// 6¡¢ÅжÏÓÐÎÞ·¾¶¿É´ï +void Judge(ALGragh G, int visited[], int v, int u) +{ + for (int i = 0; i < G.vexnum; i++) + visited[i] = 0; + // todo list ÒÔv×÷ΪÆðµã£¬×öÉî¶ÈÓÅÏȱéÀúͼ£¬Ôڴ˹ý³ÌÖв»¶Ï½«ËùÓÐÏ໥Á¬½ÓµÄÁÚ½Ó½áµãµÄvisited[u]¸üÐÂΪ1 + DFS_AL(G, visited, v); + if (visited[u] == 1) + { + printf("\n"); + printf("V%dÓëV%dÓз¾¶¿É´ï!\n", v, u); + } + else + { + printf("\n"); + printf("V%dÓëV%dÎÞ·¾¶¿É´ï!\n", v, u); + } +} + +int main() +{ + int v, u; // jÊDZߵÄÊýÄ¿,v¡¢uΪ¶¥µãλÖà + int choose = -1; + // aÊÇÒ»¸ö¶þά×Ö·ûÊý×飬´æ´¢¶¥µãÐÅÏ¢(×Ö·û´®»¹µÃ±£´æ½áβµÄ¿Õ×Ö·û\0£¬Òò´ËÁÐÊýÐèÒªÉèΪ3) + char a[MaxSize][3] = {"V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"}; + int visited[MaxSize] = {0}; + ALGragh G; + G.vexnum = MaxSize; + + printf("*****************************************************\n"); + printf("********** ʵÑé°Ë *******\n"); + printf("*****************************************************\n"); + printf("********** 1.¹¹½¨Í¼ *******\n"); + printf("********** 2.Êä³öÁÚ½Ó±í *******\n"); + printf("********** 3.Éî¶ÈÓÅÏȱéÀúµÄ½á¹û *******\n"); + printf("********** 4.ÅжÏÁ½¸öµãÖ®¼äÊÇ·ñÓз¾¶¿É´ï *******\n"); + printf("********** 5.Êä³öÁ¬Í¨·ÖÁ¿µÄ¸öÊý *******\n"); + printf("********** 0.Í˳ö *******\n"); + printf("*****************************************************\n"); + while (choose) + { + printf("ÇëÊäÈëÄãµÄÑ¡ÔñÏ"); + scanf("%d", &choose); + switch (choose) + { + case 1: + printf("ÊäÈë±ßÊý:"); + scanf("%d", &G.arcnum); + InitList(G, a); + break; + case 2: + PrintInf(G); + break; + case 3: + printf("Éî¶ÈÓÅÏȱéÀú½á¹û£º"); + DFSTraverse_AL(G, visited); // 3 Éî¶ÈÓÅÏȱéÀúͼ + // DFS_AL(G, visited,v); //Èç¹ûÊÇÒ»¸öÁ¬Í¨Í¼£¬Ö±½Óµ÷Óà DFS_ALÒ²¿ÉÒԵõ½ÕýÈ·½á¹û + printf("\n"); + break; + case 4: + printf("ÊäÈëÒªÅжϵÄÁ½¸öµã:"); + scanf("%d %d", &v, &u); + Judge(G, visited, v, u); + break; + case 5: + Count(G, visited); + break; + case 0: + exit(0); + break; + } + } + + return 0; +} \ No newline at end of file diff --git a/Server/README.md b/Server/README.md index e2620e5..fc79bec 100644 --- a/Server/README.md +++ b/Server/README.md @@ -20,5 +20,6 @@ ├── test4 # 实验4 ├── test5 # 实验5 ├── test6 # 实验6 - └── test7 # 实验7 + ├── test7 # 实验7 + └── test8 # 实验8 ```