diff --git a/datastructure/2025301205+施光甲+实验七.cpp b/datastructure/2025301205+施光甲+实验七.cpp new file mode 100644 index 0000000..3975965 --- /dev/null +++ b/datastructure/2025301205+施光甲+实验七.cpp @@ -0,0 +1,126 @@ +#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 #include #define OK 1 -typedef int Status; +typedef int Status; typedef struct BiTNode { - char data; //½áµãÊý¾ÝÓò - struct BiTNode *lchild, *rchild; //×óÓÒº¢×ÓÖ¸Õë -}BiTNode,*BiTree; + char data; // ½áµãÊý¾ÝÓò + struct BiTNode *lchild, *rchild; // ×óÓÒº¢×ÓÖ¸Õë +} BiTNode, *BiTree; -//1¡¢´´½¨¶þ²æÁ´±í£º°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T -// Àý£º½¨Á¢¿Î±¾P115ͼ5.10(b)µÄ¶þ²æÊ÷--¶ÁÈë×Ö·ûµÄ˳ÐòΪ£ºABC##DE#G##F###(#±íʾ¿ÕÊ÷) +// 1¡¢´´½¨¶þ²æÁ´±í£º°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T +// Àý£º½¨Á¢¿Î±¾P115ͼ5.10(b)µÄ¶þ²æÊ÷¡ª¡ª¶ÁÈë×Ö·ûµÄ˳ÐòΪ£ºABC##DE#G##F###(#±íʾ¿ÕÊ÷) BiTree Create(BiTree &T) { - char ch; - printf("ÇëÊäÈëÒ»¸ö×Ö·û:"); - scanf("%c",&ch); - getchar(); //Çå¿Õ»º³åÇø£¬°ÑÒÅÁôµÄ\nÇå³ý - //todo list //if: Èç¹ûÊäÈëµÄÊÇ'#'£¬Ôò½¨Á¢Ò»¿Ã¿ÕÊ÷ - //else£º·ñÔò£¬µÝ¹é½¨Á¢Ò»¸ö¶þ²æÊ÷£¨×¢Ò⣺Êǰ´°´ÏÈÐò´ÎÐò´´½¨µÄ¶þ²æÊ÷£© - if(ch == '#') { - T = NULL; //½¨Á¢¿ÕÊ÷ - } else { - T = (BiTree)malloc(sizeof(BiTNode)); //´´½¨Ð½áµã - T->data = ch; - T->lchild = NULL; - T->rchild = NULL; - T->lchild = Create(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ - T->rchild = Create(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ - } - return T; + char ch; + printf("ÇëÊäÈëÒ»¸ö×Ö·û:"); + scanf("%c", &ch); + getchar(); // Çå¿Õ»º³åÇø£¬°ÑÒÅÁôµÄ\nÇå³ý + + // todo list //if: Èç¹ûÊäÈëµÄÊÇ¡¯#¡¯£¬Ôò½¨Á¢Ò»¿Ã¿ÕÊ÷ + if (ch == '#') + { + T = NULL; + } + // else£º·ñÔò£¬µÝ¹é½¨Á¢Ò»¸ö¶þ²æÊ÷£¨×¢Ò⣺Êǰ´°´ÏÈÐò´ÎÐò´´½¨µÄ¶þ²æÊ÷£© + else + { + T = (BiTree)malloc(sizeof(BiTNode)); + T->data = ch; + Create(T->lchild); + Create(T->rchild); + } + return T; } -//ÏÈÐò±éÀú¶þ²æÊ÷ -Status PreOrder(BiTree &T) +// ÏÈÐò±éÀú¶þ²æÊ÷ +Status PreOrder(BiTree &T) { - //todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø - //else:·ñÔò£¬ÏÈ·ÃÎʸù½áµã (D) - //ǰÐò±éÀú×ó×ÓÊ÷ (L) - //ǰÐò±éÀúÓÒ×ÓÊ÷ (R) - if(T == NULL) { - return OK; - } else { - printf("%c ", T->data); //·ÃÎʸù½áµã - PreOrder(T->lchild); //ǰÐò±éÀú×ó×ÓÊ÷ - PreOrder(T->rchild); //ǰÐò±éÀúÓÒ×ÓÊ÷ - } - return OK; + // todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø + if (T == NULL) + { + return OK; + } + // else:·ñÔò£¬ÏÈ·ÃÎʸù½áµã (D) + else + { + printf("%c ", T->data); + // ǰÐò±éÀú×ó×ÓÊ÷ (L) + PreOrder(T->lchild); + // ǰÐò±éÀúÓÒ×ÓÊ÷ (R) + PreOrder(T->rchild); + } + return OK; } -//ÖÐÐò±éÀú¶þ²æÊ÷ +// ÖÐÐò±éÀú¶þ²æÊ÷ Status InOrder(BiTree &T) { - //todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø - //else:·ñÔò£¬ÏÈÖÐÐò±éÀú×ó×ÓÊ÷ (L) - //·ÃÎʸù½áµã (D) - //ÖÐÐò±éÀúÓÒ×ÓÊ÷ (R) - if(T == NULL) { - return OK; - } else { - InOrder(T->lchild); //ÖÐÐò±éÀú×ó×ÓÊ÷ - printf("%c ", T->data); //·ÃÎʸù½áµã - InOrder(T->rchild); //ÖÐÐò±éÀúÓÒ×ÓÊ÷ - } - return OK; + // todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø + if (T == NULL) + { + return OK; + } + // else:·ñÔò£¬ÏÈÖÐÐò±éÀú×ó×ÓÊ÷ (L) + else + { + InOrder(T->lchild); + // ·ÃÎʸù½áµã (D) + printf("%c ", T->data); + // ÖÐÐò±éÀúÓÒ×ÓÊ÷ (R) + InOrder(T->rchild); + } + return OK; } -//ºóÐò±éÀú +// ºóÐò±éÀú Status PostOrder(BiTree &T) { - //todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø - //else:·ñÔò£¬ÏȺóÐò±éÀú×ó×ÓÊ÷ (L) - //ºóÐò±éÀúÓÒ×ÓÊ÷ (R) - //·ÃÎʸù½áµã (D) - if(T == NULL) { - return OK; - } else { - PostOrder(T->lchild); //ºóÐò±éÀú×ó×ÓÊ÷ - PostOrder(T->rchild); //ºóÐò±éÀúÓÒ×ÓÊ÷ - printf("%c ", T->data); //·ÃÎʸù½áµã - } - return OK; + // todo list //if: Èç¹ûÊÇ¿ÕÊ÷£¬Ôò·µ»Ø + if (T == NULL) + { + return OK; + } + // else:·ñÔò£¬ÏȺóÐò±éÀú×ó×ÓÊ÷ (L) + else + { + PostOrder(T->lchild); + // ºóÐò±éÀúÓÒ×ÓÊ÷ (R) + PostOrder(T->rchild); + // ·ÃÎʸù½áµã (D) + printf("%c ", T->data); + } + return OK; } -//²ã´Î±éÀú1 +// ²ã´Î±éÀú1 void LeverOrder(BiTree &T) { - if (T == NULL) { // ´¦Àí¿ÕÊ÷£¬±ÜÃâ¿ÕÖ¸Õë·ÃÎÊ + if (T == NULL) + { // ´¦Àí¿ÕÊ÷£¬±ÜÃâ¿ÕÖ¸Õë·ÃÎÊ printf("¶þ²æÊ÷Ϊ¿Õ£¡\n"); return; } - //BT *Queue[100]; //¶ÓÁÐ - BiTree Queue[100]; //¶ÓÁÐ - char ch; - int front = 0; - int rear = 0; - // ¶ÓÁб߽ç¼ì²é£¨ÐÂÔö£º·ÀÖ¹Êý×éÔ½½ç£© - if (rear >= 100) { + // BT *Queue[100]; //¶ÓÁÐ + BiTree Queue[100]; // ¶ÓÁÐ + char ch; + int front = 0; + int rear = 0; + // ¶ÓÁб߽ç¼ì²é£¨ÐÂÔö£º·ÀÖ¹Êý×éÔ½½ç£© + if (rear >= 100) + { printf("¶ÓÁÐÒÑÂú£¬ÎÞ·¨Èë¶Ó£¡\n"); return; } - Queue[rear++] = T; //¸ù½ÚµãÈë¶Ó - while (front < rear) //µ±¶Ó²»¿Õ - { - ch = Queue[front]->data; //³ö¶Ó¶ÓÍ·ÔªËØ - printf("%c ",ch); - if (Queue[front]->lchild){ - if (rear >= 100) { - printf("¶ÓÁÐÒÑÂú£¬×óº¢×ÓÎÞ·¨Èë¶Ó£¡\n"); + Queue[rear++] = T; // ¸ù½ÚµãÈë¶Ó + while (front < rear) // µ±¶Ó²»¿Õ + { + ch = Queue[front]->data; // ³ö¶Ó¶ÓÍ·ÔªËØ + printf("%c ", ch); + if (Queue[front]->lchild) + { + if (rear >= 100) + { + printf("¶ÓÁÐÒÑÂú£¬×óº¢×ÓÎÞ·¨Èë¶Ó£¡\n"); break; } - Queue[rear++] = Queue[front]->lchild; - } - if (Queue[front]->rchild){ - if (rear >= 100) { - printf("¶ÓÁÐÒÑÂú£¬ÓÒº¢×ÓÎÞ·¨Èë¶Ó£¡\n"); - break; - } - Queue[rear++] = Queue[front]->rchild; - } - front++; // ¶ÓÍ·ºóÒÆ£¬Íê³É³ö¶Ó - } - + Queue[rear++] = Queue[front]->lchild; + } + if (Queue[front]->rchild) + { + if (rear >= 100) + { + printf("¶ÓÁÐÒÑÂú£¬ÓÒº¢×ÓÎÞ·¨Èë¶Ó£¡\n"); + break; + } + Queue[rear++] = Queue[front]->rchild; + } + front++; // ¶ÓÍ·ºóÒÆ£¬Íê³É³ö¶Ó + } } -//½Úµã×ÜÊý +/* + +// ------------- Ñ­»·¶ÓÁнṹÌ嶨Ò壨²ãÐò±éÀúÒÀÀµ¶ÓÁУ© ------------- +#define MAXQSIZE 100 // ¶ÓÁÐ×î´óÈÝÁ¿ +typedef struct { + BiTree base[MAXQSIZE]; // ¶ÓÁд洢¶þ²æÊ÷½áµãÖ¸Õë + int front; // ¶ÓÍ·Ö¸Õë + int rear; // ¶ÓβָÕë +} SqQueue; + +// ³õʼ»¯¶ÓÁÐ +int InitQueue(SqQueue *qu) { + qu->front = qu->rear = 0; // ¿Õ¶ÓÁУº¶ÓÍ·=¶Óβ=0 + return 1; +} + +// Åж϶ÓÁÐÊÇ·ñΪ¿Õ +int QueueEmpty(SqQueue *qu) { + return qu->front == qu->rear; +} + +// Èë¶Ó²Ù×÷£¨½«¶þ²æÊ÷½áµãÖ¸ÕëÈë¶Ó£© +int enQueue(SqQueue *qu, BiTree p) { + // Åж϶ÓÁÐÊÇ·ñÂú£¨Ñ­»·¶ÓÁÐÅÐÂúÌõ¼þ£© + if ((qu->rear + 1) % MAXQSIZE == qu->front) { + printf("¶ÓÁÐÂú£¬Èë¶Óʧ°Ü£¡\n"); + return 0; + } + qu->base[qu->rear] = p; // ½áµãÖ¸ÕëÈë¶Ó + qu->rear = (qu->rear + 1) % MAXQSIZE; // ¶ÓβָÕëºóÒÆ + return 1; +} + +// ³ö¶Ó²Ù×÷£¨È¡³ö¶ÓÍ·½áµãÖ¸Õ룩 +int deQueue(SqQueue *qu, BiTree *p) { + if (QueueEmpty(qu)) { // ¶Ó¿ÕÔò³ö¶Óʧ°Ü + printf("¶ÓÁпգ¬³ö¶Óʧ°Ü£¡\n"); + return 0; + } + *p = qu->base[qu->front]; // È¡³ö¶ÓÍ·ÔªËØ + qu->front = (qu->front + 1) % MAXQSIZE; // ¶ÓÍ·Ö¸ÕëºóÒÆ + return 1; +} + +// ------------- ²ã´Î±éÀú2 ------------- +void LevelOrder(BiTree b) { + BiTree p; + SqQueue qu; // ¶¨Òå¶ÓÁУ¨×¢Ò⣺ԭ²Î¿¼ÖÐquÊÇÖ¸Õ룬´Ë´¦¸ÄΪֱ½Ó¶¨Òå½á¹¹Ì壬¸üÒ×Àí½â£© + + if (b == NULL) return; // ¿ÕÊ÷Ö±½Ó·µ»Ø + + InitQueue(&qu); // ³õʼ»¯¶ÓÁÐ + enQueue(&qu, b); // ¸ù½áµãÈë¶Ó + + while (!QueueEmpty(&qu)) { // ¶ÓÁзǿÕÔòÑ­»· + deQueue(&qu, &p); // ³ö¶Óµ±Ç°½áµã + printf("%c ", p->data); // ·ÃÎʵ±Ç°½áµã + + // ×óº¢×Ó·Ç¿ÕÔòÈë¶Ó + if (p->lchild != NULL) { + enQueue(&qu, p->lchild); + } + // ÓÒº¢×Ó·Ç¿ÕÔòÈë¶Ó + if (p->rchild != NULL) { + enQueue(&qu, p->rchild); + } + } +} +*/ + +// ½Úµã×ÜÊý int Count(BiTree &T) { - //todo list //if£ºÈç¹ûÊÇ¿ÕÊ÷£¬Ôò½áµã¸öÊýΪ0£» - //else£º·ñÔò£¬½áµã¸öÊýΪ×ó×ÓÊ÷µÄ½áµã¸öÊý+ÓÒ×ÓÊ÷µÄ½áµã¸öÊýÔÙ+1¡£ - if(T == NULL) { - return 0; - } else { - return Count(T->lchild) + Count(T->rchild) + 1; - } + // todo list //if£ºÈç¹ûÊÇ¿ÕÊ÷£¬Ôò½áµã¸öÊýΪ0£» + if (T == NULL) + { + return 0; + } + // else£º·ñÔò£¬½áµã¸öÊýΪ×ó×ÓÊ÷µÄ½áµã¸öÊý+ÓÒ×ÓÊ÷µÄ½áµã¸öÊýÔÙ+1¡£ + else + { + return Count(T->lchild) + Count(T->rchild) + 1; + } } -//Ò¶×Ó½Úµã +// Ò¶×Ó½Úµã int CountLeaf(BiTree &T) { - //todo list //if£ºÈç¹ûÊÇ¿ÕÊ÷£¬ÔòÒ¶×Ó½áµã¸öÊýΪ0£» - //else if£ºÈç¹ûÊÇÒ¶×Ó½áµã£¬Ôò·µ»Ø1£» - //else·ñÔò£¬Îª×ó×ÓÊ÷µÄÒ¶×Ó½áµã¸öÊý+ÓÒ×ÓÊ÷µÄÒ¶×Ó½áµã¸öÊý¡£ - if(T == NULL) { - return 0; - } else if(T->lchild == NULL && T->rchild == NULL) { - return 1; - } else { - return CountLeaf(T->lchild) + CountLeaf(T->rchild); - } + // todo list //if£ºÈç¹ûÊÇ¿ÕÊ÷£¬ÔòÒ¶×Ó½áµã¸öÊýΪ0£» + if (T == NULL) + { + return 0; + } + // else if£ºÈç¹ûÊÇÒ¶×Ó½áµã£¬Ôò·µ»Ø1£» + else if (T->lchild == NULL && T->rchild == NULL) + { + return 1; + } + // else·ñÔò£¬Îª×ó×ÓÊ÷µÄÒ¶×Ó½áµã¸öÊý+ÓÒ×ÓÊ÷µÄÒ¶×Ó½áµã¸öÊý¡£ + else + { + return CountLeaf(T->lchild) + CountLeaf(T->rchild); + } } int main() { - BiTree T = NULL; //´´½¨Ò»¿Å¿ÕÊ÷ - int choose = -1; - printf("*********************************************\n"); - printf("********** ʵÑéÁù *******\n"); - printf("*********************************************\n"); - printf("********** 1.´´½¨Ò»¿Ã¶þ²æÊ÷ *******\n"); - printf("********** 2.ÏÈÐò±éÀú¶þ²æÊ÷ *******\n"); - printf("********** 3.ÖÐÐò±éÀú¶þ²æÊ÷ *******\n"); - printf("********** 4.ºóÐò±éÀú¶þ²æÊ÷ *******\n"); - printf("********** 5.²ãÐò±éÀú¶þ²æÊ÷ *******\n"); - printf("********** 6.Çó¶þ²æÊ÷½Úµã¸öÊý *******\n"); - printf("********** 7.Çó¶þ²æÊýÒ¶×Ó½Úµã¸öÊý *******\n"); - printf("********** 0.Í˳ö *******\n"); - printf("*********************************************\n"); - while (choose) - { - printf("\n"); - printf("ÇëÊäÈëÄãµÄÑ¡ÔñÏ"); - scanf("%d", &choose); - getchar(); //Çå¿Õ»º³åÇø£¬°ÑÒÅÁôµÄ\nÇå³ý - switch (choose) - { - case 1:T = Create(T); break; //´´½¨ - printf("\n"); - case 2: - printf("ÏÈÐòÐòÁÐΪ£º") ; - PreOrder(T); break; //ÏÈÐò±éÀú¶þ²æÊ÷ - printf("\n"); - case 3: - printf("ÖÐÐòÐòÁÐΪ£º") ; - InOrder(T); break; //ÖÐÐò±éÀú¶þ²æÊ÷ - printf("\n"); - case 4: - printf("ºóÐòÐòÁÐΪ£º") ; - PostOrder(T); break; //ºóÐò±éÀú¶þ²æÊ÷ - printf("\n"); - case 5: - printf("²ã´ÎÐòÁÐΪ£º") ; - LeverOrder(T); break; //²ãÐò±éÀú¶þ²æÊ÷ - printf("\n"); - case 6:printf("½Úµã×ÜÊýΪ£º%d\n", Count(T)); break;//½áµã×ÜÊý - case 7:printf("Ò¶×Ó½Úµã×ÜÊýΪ£º%d\n", CountLeaf(T)); break; //Ò¶×Ó½áµã×ÜÊý - case 0:exit(0); break; - } - } + BiTree T = NULL; // ´´½¨Ò»¿Å¿ÕÊ÷ + int choose = -1; + printf("*********************************************\n"); + printf("********** ʵÑéÁù *******\n"); + printf("*********************************************\n"); + printf("********** 1.´´½¨Ò»¿Ã¶þ²æÊ÷ *******\n"); + printf("********** 2.ÏÈÐò±éÀú¶þ²æÊ÷ *******\n"); + printf("********** 3.ÖÐÐò±éÀú¶þ²æÊ÷ *******\n"); + printf("********** 4.ºóÐò±éÀú¶þ²æÊ÷ *******\n"); + printf("********** 5.²ãÐò±éÀú¶þ²æÊ÷ *******\n"); + printf("********** 6.Çó¶þ²æÊ÷½Úµã¸öÊý *******\n"); + printf("********** 7.Çó¶þ²æÊýÒ¶×Ó½Úµã¸öÊý *******\n"); + printf("********** 0.Í˳ö *******\n"); + printf("*********************************************\n"); + while (choose) + { + printf("\n"); + printf("ÇëÊäÈëÄãµÄÑ¡ÔñÏ"); + scanf("%d", &choose); + getchar(); // Çå¿Õ»º³åÇø£¬°ÑÒÅÁôµÄ\nÇå³ý + switch (choose) + { + case 1: + T = Create(T); + break; // ´´½¨ + printf("\n"); + case 2: + printf("ÏÈÐòÐòÁÐΪ£º"); + PreOrder(T); + break; // ÏÈÐò±éÀú¶þ²æÊ÷ + printf("\n"); + case 3: + printf("ÖÐÐòÐòÁÐΪ£º"); + InOrder(T); + break; // ÖÐÐò±éÀú¶þ²æÊ÷ + printf("\n"); + case 4: + printf("ºóÐòÐòÁÐΪ£º"); + PostOrder(T); + break; // ºóÐò±éÀú¶þ²æÊ÷ + printf("\n"); + case 5: + printf("²ã´ÎÐòÁÐΪ£º"); + LeverOrder(T); + break; // ²ãÐò±éÀú¶þ²æÊ÷ + printf("\n"); + case 6: + printf("½Úµã×ÜÊýΪ£º%d\n", Count(T)); + break; // ½áµã×ÜÊý + case 7: + printf("Ò¶×Ó½Úµã×ÜÊýΪ£º%d\n", CountLeaf(T)); + break; // Ò¶×Ó½áµã×ÜÊý + case 0: + exit(0); + break; + } + } } diff --git a/datastructure/2025301205+施光甲+试验八.cpp b/datastructure/2025301205+施光甲+试验八.cpp new file mode 100644 index 0000000..4643818 --- /dev/null +++ b/datastructure/2025301205+施光甲+试验八.cpp @@ -0,0 +1,180 @@ +#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++) + G.vertices[i].data[j] = a[i][j]; //todo list //ÊäÈë¶¥µãÖµ + G.vertices[i].firstarc = NULL; //todo list //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + } + + printf("ÇëÊäÈë¸÷±ßËùÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖÃ\n"); + for (int k = 0; k < G.arcnum; k++) { + scanf("%d %d", &i, &j); +//Éú³ÉÒ»¸öеı߽áµã*p1: + ArcNode* p1 = (ArcNode*)malloc(sizeof(struct ArcNode)); + p1->adjvex = j; + p1->nextarc = G.vertices[i].firstarc; + G.vertices[i].firstarc = p1; //todo list Éè´ËÁÚ½ÓµãÐòºÅΪj£¬²¢½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿(Í·²å·¨) + + //Éú³ÉÁíÒ»¸ö¶Ô³ÆµÄеı߽áµã*p2£º + ArcNode* p2 = (ArcNode*)malloc(sizeof(struct ArcNode)); + p2->adjvex = i; + p2->nextarc = G.vertices[j].firstarc; + G.vertices[j].firstarc = p2; //todo list Éè´ËÁÚ½ÓµãÐòºÅΪi£¬²¢½«Ð½áµã*p2²åÈë¶¥µãvjµÄ±ß±íÍ·²¿(Í·²å·¨) + } +} + + +//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 (p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) //forÑ­»·±éÀúµ±Ç°¶¥µã i µÄËùÓÐÁÚ½Ó¶¥µã£¬²¢´òÓ¡ÕâЩÁÚ½Ó¶¥µã¡£ + 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; + + p = G.vertices[v].firstarc; //todo list //½« p ³õʼ»¯ÎªÖ¸Ïò¶¥µã v µÄµÚÒ»¸öÁÚ½ÓµãµÄÖ¸Õë + while (p != NULL) { //todo list //whileÑ­»·£º¶Ôvδ±»·ÃÎʵÄÁÚ½Ó¶¥µãwµÝ¹éµ÷ÓÃDFSTraverse º¯Êý£»²¢Ñ°ÕÒvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + 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++) + if (!visited[v]) { //todo list Èç¹ûÓж¥µãûÓб»·ÃÎÊ£¬ÄǾÍÒÔËüΪÆðµã±éÀúËùÔÚµÄÁ¬Í¨·ÖÁ¿ + 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++) + if (!visited[v]) { //todo list Èç¹ûÓж¥µãûÓб»·ÃÎÊ£¬ÄǾÍÒÔËüΪÆðµã±éÀúËùÔÚµÄÁ¬Í¨·ÖÁ¿£¬Á¬Í¨·ÖÁ¿¸öÊý¼ÓÒ» + DFS_AL(G, visited, v); + count++; + } + printf("\n"); + printf("Á¬Í¨·ÖÁ¿¸öÊý:%d\n", count); +} + + +//6¡¢ÅжÏÓÐÎÞ·¾¶¿É´ï +void Judge(ALGragh G, int visited[], int v, int u) { + for (int i = 0; i < G.vexnum; i++) + visited[i] = 0; + DFS_AL(G, visited, v); //todo list ÒÔv×÷ΪÆðµã£¬×öÉî¶ÈÓÅÏȱéÀúͼ£¬Ôڴ˹ý³ÌÖв»¶Ï½«ËùÓÐÏ໥Á¬½ÓµÄÁÚ½Ó½áµãµÄvisited[u]¸üÐÂΪ1 + 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; +}