diff --git a/README.md b/README.md index 5b0ef81..bb0b515 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - [`DataStructure`**(数æ�®ç»“构)**](æ•°æ�®ç»“æž„/) - [x] æ•°æ�®ç»“æž„1800题 - [ ] æ•°æ�®ç»“æž„1800题分题目详解 - - [x] 严版教æ��PPT&课å�Žä¹ é¢˜ç­”案 + - [x] 严版教æ��PPT&课å�Žä¹ é¢˜ç­”案&书中算法 - [x] 王é�“考研数æ�®ç»“æž„PPT - [x] 冒泡排åº� - [x] 王é�“æ•°æ�®ç»“æž„æ€�维导图 diff --git a/æ•°æ�®ç»“æž„/README.md b/æ•°æ�®ç»“æž„/README.md index b0f409b..c826131 100644 --- a/æ•°æ�®ç»“æž„/README.md +++ b/æ•°æ�®ç»“æž„/README.md @@ -1,7 +1,7 @@ - [x] æ•°æ�®ç»“æž„1800题 - [ ] æ•°æ�®ç»“æž„1800题分题目详解 - [x] 王é�“æ•°æ�®ç»“构课件 -- [x] 严版教æ��PPT&课å�Žä¹ é¢˜ç­”案 +- [x] 严版教æ��PPT&课å�Žä¹ é¢˜ç­”案&书中算法 - [x] 冒泡排åº� - [x] 王é�“æ•°æ�®ç»“æž„æ€�维导图 - [x] æ—¶é—´å¤�æ�‚度 diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构实验1å¿…å�šéƒ¨åˆ†OJ版-é…�套实验.pdf b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构实验1å¿…å�šéƒ¨åˆ†OJ版-é…�套实验.pdf new file mode 100644 index 0000000..ab0e3ac Binary files /dev/null and b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构实验1å¿…å�šéƒ¨åˆ†OJ版-é…�套实验.pdf differ diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/2.1-2.5.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/2.1-2.5.cpp new file mode 100644 index 0000000..de21bef --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/2.1-2.5.cpp @@ -0,0 +1,171 @@ +#include +#include +#include +#include +using namespace std; +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; //Status ÊǺ¯Êý·µ»ØÖµÀàÐÍ£¬ÆäÖµÊǺ¯Êý½á¹û״̬´úÂë¡£ +typedef int ElemType; //ElemType Ϊ¿É¶¨ÒåµÄÊý¾ÝÀàÐÍ£¬´ËÉèΪintÀàÐÍ + +#define MAXSIZE 100 //˳Ðò±í¿ÉÄÜ´ïµ½µÄ×î´ó³¤¶È +struct Book { + string id;//ISBN + string name;//ÊéÃû + double price;//¶¨¼Û +}; +typedef struct { + Book *elem; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //µ±Ç°³¤¶È +} SqList; + +Status InitList_Sq(SqList &L) { //Ëã·¨2.1 ˳Ðò±íµÄ³õʼ»¯ + //¹¹ÔìÒ»¸ö¿ÕµÄ˳Ðò±íL + L.elem = new Book[MAXSIZE]; //Ϊ˳Ðò±í·ÖÅäÒ»¸ö´óСΪMAXSIZEµÄÊý×é¿Õ¼ä + if (!L.elem) + exit(OVERFLOW); //´æ´¢·ÖÅäʧ°ÜÍ˳ö + L.length = 0; //¿Õ±í³¤¶ÈΪ0 + return OK; +} + +Status GetElem(SqList L, int i, Book &e) {//Ëã·¨2.2¡¡Ë³Ðò±íµÄȡֵ + if (i < 1 || i > L.length) + return ERROR; //ÅжÏiÖµÊÇ·ñºÏÀí£¬Èô²»ºÏÀí£¬·µ»ØERROR + e = L.elem[i - 1]; //elem[i-1]µ¥Ôª´æ´¢µÚi¸öÊý¾ÝÔªËØ + return OK; +} + +int LocateElem_Sq(SqList L, double e) { //Ëã·¨2.3 ˳Ðò±íµÄ²éÕÒ + //˳Ðò±íµÄ²éÕÒ + for (int i = 0; i < L.length; i++) + if (L.elem[i].price == e) + return i + 1;//²éÕҳɹ¦£¬·µ»ØÐòºÅi+1 + return 0;//²éÕÒʧ°Ü£¬·µ»Ø0 +} + +Status ListInsert_Sq(SqList &L, int i, Book e) { //Ëã·¨2.4 ˳Ðò±íµÄ²åÈë + //ÔÚ˳Ðò±íLÖеÚi¸öλÖÃ֮ǰ²åÈëеÄÔªËØe + //iÖµµÄºÏ·¨·¶Î§ÊÇ1<=i<=L.length+1 + if ((i < 1) || (i > L.length + 1)) + return ERROR; //iÖµ²»ºÏ·¨ + if (L.length == MAXSIZE) + return ERROR; //µ±Ç°´æ´¢¿Õ¼äÒÑÂú + for (int j = L.length - 1; j >= i - 1; j--) + L.elem[j + 1] = L.elem[j]; //²åÈëλÖü°Ö®ºóµÄÔªËØºóÒÆ + L.elem[i - 1] = e; //½«ÐÂÔªËØe·ÅÈëµÚi¸öλÖà + ++L.length; //±í³¤Ôö1 + return OK; +} + +Status ListDelete_Sq(SqList &L, int i) { //Ëã·¨2.5 ˳Ðò±íµÄɾ³ý + //ÔÚ˳Ðò±íLÖÐɾ³ýµÚi¸öÔªËØ£¬²¢ÓÃe·µ»ØÆäÖµ + //iÖµµÄºÏ·¨·¶Î§ÊÇ1<=i<=L.length + if ((i < 1) || (i > L.length)) + return ERROR; //iÖµ²»ºÏ·¨ + for (int j = i; j <= L.length; j++) + L.elem[j - 1] = L.elem[j]; //±»É¾³ýÔªËØÖ®ºóµÄÔªËØÇ°ÒÆ + --L.length; //±í³¤¼õ1 + return OK; +} + +int main() { + SqList L; + int i = 0, temp, a, c, choose; + double price; + Book e; + string head_1, head_2, head_3; + cout << "1. ½¨Á¢\n"; + cout << "2. ÊäÈë\n"; + cout << "3. ȡֵ\n"; + cout << "4. ²éÕÒ\n"; + cout << "5. ²åÈë\n"; + cout << "6. ɾ³ý\n"; + cout << "7. Êä³ö\n"; + cout << "0. Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1://´´½¨Ë³Ðò±í + if (InitList_Sq(L)) + cout << "³É¹¦½¨Á¢Ë³Ðò±í\n\n"; + else + cout << "˳Ðò±í½¨Á¢Ê§°Ü\n\n"; + break; + case 2: {//˳Ðò±íÐÅÏ¢ÊäÈë + i = 0; + L.elem = new Book[MAXSIZE]; + if (!L.elem) + exit(OVERFLOW); + L.length = 0; + fstream file; + file.open("book.txt"); + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡" << endl; + exit(ERROR); + } + file >> head_1 >> head_2 >> head_3; + while (!file.eof()) { + file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price; + i++; + } + cout << "ÊäÈë book.txt ÐÅÏ¢Íê±Ï\n\n"; + L.length = i; + file.close(); + } + break; + case 3://˳Ðò±íµÄȡֵ + cout << "ÇëÊäÈëÒ»¸öλÖÃÓÃÀ´È¡Öµ£º\n"; + cin >> i; + temp = GetElem(L, i, e); + if (temp != 0) { + cout << "²éÕҳɹ¦\n"; + cout << "µÚ" << i << "±¾Í¼ÊéµÄÐÅÏ¢ÊÇ£º\n"; + cout << left << setw(15) << e.id << "\t" << left << setw(50) + << e.name << "\t" << left << setw(5) << e.price << endl + << endl; + } else + cout << "²éÕÒʧ°Ü£¡Î»Öó¬³ö·¶Î§\n\n"; + break; + case 4: //˳Ðò±íµÄ²éÕÒ + cout << "ÇëÊäÈëËùÒª²éÕÒ¼Û¸ñ:"; + cin >> price; + temp = LocateElem_Sq(L, price); + if (temp != 0) { + cout << "²éÕҳɹ¦\n"; + cout << "¸Ã¼Û¸ñ¶ÔÓ¦µÄÊéÃûΪ£º" << L.elem[temp - 1].name << endl << endl; + } else + cout << "²éÕÒʧ°Ü£¡Ã»ÓÐÕâ¸ö¼Û¸ñ¶ÔÓ¦µÄÊé¼®\n\n"; + break; + case 5: //˳Ðò±íµÄ²åÈë + cout << "ÇëÊäÈë²åÈëµÄλÖúÍÊé±¾ÐÅÏ¢£¬°üÀ¨£º±àºÅ ÊéÃû ¼Û¸ñ£¨Óÿոñ¸ô¿ª£©:"; + cin >> a; + cin >> e.id >> e.name >> e.price; //ÊäÈëaºÍb£¬a´ú±í²åÈëµÄλÖã¬b´ú±í²åÈëµÄÊýÖµ£¨Êé±¾ÐÅÏ¢£© + if (ListInsert_Sq(L, a, e)) + cout << "²åÈë³É¹¦.\n\n"; + else + cout << "²åÈëʧ°Ü.\n\n"; + break; + case 6: //˳Ðò±íµÄɾ³ý + cout << "ÇëÊäÈëËùҪɾ³ýµÄÊé¼®µÄλÖÃ:"; + cin >> c; + if (ListDelete_Sq(L, c)) + cout << "ɾ³ý³É¹¦.\n\n"; + else + cout << "ɾ³ýʧ°Ü.\n\n"; + break; + case 7: //˳Ðò±íµÄÊä³ö + cout << "µ±Ç°Í¼ÊéϵͳÐÅÏ¢£¨Ë³Ðò±í£©¶Á³ö:\n"; + for (i = 0; i < L.length; i++) + cout << left << setw(15) << L.elem[i].id << "\t" << left + << setw(50) << L.elem[i].name << "\t" << left + << setw(5) << L.elem[i].price << endl; + cout << endl; + break; + } + } + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/book.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/book.txt new file mode 100644 index 0000000..3701fc8 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.1-2.5/book.txt @@ -0,0 +1,17 @@ +ISBN ÊéÃû ¶¨¼Û +9787302257646 ³ÌÐòÉè¼Æ»ù´¡ 25 +9787302219972 µ¥Æ¬»ú¼¼Êõ¼°Ó¦Óà 32 +9787302203513 ±àÒëÔ­Àí 46 +9787811234923 »ã±àÓïÑÔ³ÌÐòÉè¼Æ½Ì³Ì 21 +9787512100831 ¼ÆËã»ú²Ù×÷ϵͳ 17 +9787302265436 ¼ÆËã»úµ¼ÂÛʵÑéÖ¸µ¼ 18 +9787302180630 ʵÓÃÊý¾Ý½á¹¹ 29 +9787302225065 Êý¾Ý½á¹¹£¨CÓïÑ԰棩 38 +9787302171676 C#ÃæÏò¶ÔÏó³ÌÐòÉè¼Æ 39 +9787302250692 CÓïÑÔ³ÌÐòÉè¼Æ 42 +9787302150664 Êý¾Ý¿âÔ­Àí 35 +9787302260806 Java±à³ÌÓëʵ¼ù 56 +9787302252887 Java³ÌÐòÉè¼ÆÓëÓ¦ÓÃ½Ì³Ì 39 +9787302198505 ǶÈëʽ²Ù×÷ϵͳ¼°±à³Ì 25 +9787302169666 Èí¼þ²âÊÔ 24 +9787811231557 Eclipse»ù´¡ÓëÓ¦Óà 35 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/2.13-2.14.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/2.13-2.14.cpp new file mode 100644 index 0000000..f830fad --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/2.13-2.14.cpp @@ -0,0 +1,189 @@ +#include +#include +#include +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; //Status ÊǺ¯Êý·µ»ØÖµÀàÐÍ£¬ÆäÖµÊǺ¯Êý½á¹û״̬´úÂë¡£ +typedef int ElemType; //ElemType Ϊ¿É¶¨ÒåµÄÊý¾ÝÀàÐÍ£¬´ËÉèΪintÀàÐÍ + +struct Book { + string id;//ISBN + string name;//ÊéÃû + double price;//¶¨¼Û +}; +typedef struct DuLNode { + Book data; //Êý¾ÝÓò + struct DuLNode *prior; //Ö±½ÓǰÇý + struct DuLNode *next; //Ö±½Óºó¼Ì +} DuLNode, *DuLinkList; + +string head_1, head_2, head_3; +int length; + +Status InitDuList_L(DuLinkList &L) { + //¹¹ÔìÒ»¸ö¿ÕµÄË«ÏòÁ´±íL + L = new DuLNode; //Éú³Éнáµã×÷Ϊͷ½áµã£¬ÓÃÍ·Ö¸ÕëLÖ¸ÏòÍ·½áµã + L->next = NULL; //Í·½áµãµÄÖ¸ÕëÓòÖÃ¿Õ + L->prior = NULL; + return OK; +} + +DuLNode *GetElemP_DuL(DuLinkList L, int i) { + //ÔÚ´øÍ·½áµãµÄË«ÏòÁ´±íLÖвéÕÒµÚi¸öÔªËØ£¬·µ»Ø½áµãµÄµØÖ· + int j; + DuLinkList p; + p = L->next; + j = 1; //³õʼ»¯£¬pÖ¸ÏòµÚÒ»¸ö½áµã£¬jΪ¼ÆÊýÆ÷ + while (j < i && p) { //˳Á´ÓòÏòºóɨÃ裬ֱµ½pÖ¸ÏòµÚi¸öÔªËØ»òpΪ¿Õ + p = p->next; + ++j; + } + if (!p || j > i) + return NULL; //µÚi¸öÔªËØ²»´æÔÚ + return p; +} //GetElemP_DuL + +Status ListInsert_DuL(DuLinkList &L, int i, Book e) { //Ëã·¨2.13 Ë«ÏòÁ´±íµÄ²åÈë + //ÔÚ´øÍ·½áµãµÄË«ÏòÁ´±íLÖеÚi¸öλÖÃ֮ǰ²åÈëÔªËØe£¬iµÄºÏ·¨ÖµÎª1<=i<=±í³¤+1 + DuLinkList s, p; + if (!(p = GetElemP_DuL(L, i))) //ÔÚLÖÐÈ·¶¨µÚi¸öÔªËØµÄλÖÃÖ¸Õëp + return ERROR; //pΪNULLʱ£¬µÚi¸öÔªËØ²»´æÔÚ + if (i == 1) {//ÔÚË«ÏòÁ´±íµÄµÚÒ»¸öÔªËØÉϲåÈë + s = new DuLNode; //Éú³Éнáµãs + s->data = e; //½«½áµãsÊý¾ÝÖÃΪe + DuLinkList p = L->next; + L->next = s; + s->prior = L; + s->next = p;//½«½áµã*s²åÈëLÖÐ + p->prior = s; + ++length; + } else if (i == length) {//ÔÚË«ÏòÁ´±íµÄ×îºóÒ»¸öÔªËØÉϲåÈë + s = new DuLNode; //Éú³Éнáµãs + s->data = e; //½«½áµãsÊý¾ÝÖÃΪe + DuLinkList p = L; + while (p->next) + p = p->next;//½«LinkList pÖ¸ÏòË«ÏòÁ´±í½áβ + p->next = s; + s->prior = p;//½«½áµã*s²åÈëµ½pµÄºóÃæ£¬²åÈëµ½LÖÐ + s->next = NULL; + ++length; + } else { + s = new DuLNode; //Éú³Éнáµã*s + s->data = e; //½«½áµã*sÊý¾ÝÓòÖÃΪe + s->prior = p->prior; //½«½áµã*s²åÈëLÖУ¬´Ë²½¶ÔӦͼ2.20¢Ù + p->prior->next = s; //¶ÔӦͼ2.20¢Ú + s->next = p; //¶ÔӦͼ2.20¢Û + p->prior = s; //¶ÔӦͼ2.20¢Ü + ++length; + } + return OK; +} //ListInsert_DuL + +Status ListDelete_DuL(DuLinkList &L, int i) { //Ëã·¨2.14 Ë«ÏòÁ´±íµÄɾ³ý + //ɾ³ý´øÍ·½áµãµÄË«ÏòÁ´±íLÖеÚi¸öλÖÃ֮ǰ²åÈëÔªËØe£¬iµÄºÏ·¨ÖµÎª1<=i<=±í³¤ + DuLinkList p; + if (!(p = GetElemP_DuL(L, i))) //ÔÚLÖÐÈ·¶¨µÚi¸öÔªËØµÄλÖÃÖ¸Õëp + return ERROR; //pΪNULLʱ£¬µÚi¸öÔªËØ²»´æÔÚ + if (i == 1)//ɾ³ýË«ÏòÁ´±íµÄµÚÒ»¸öÔªËØ + L = L->next; + else if (i == length) {//ɾ³ýË«ÏòÁ´±íµÄ×îºóÒ»¸öÔªËØ + p->prior->next = NULL; + delete p; + --length; + return OK; + } else { + p->prior->next = p->next; //Ð޸ı»É¾½áµãµÄǰÇý½áµãµÄºó¼ÌÖ¸Õ룬¶ÔӦͼ2.21¢Ù + p->next->prior = p->prior; //Ð޸ı»É¾½áµãµÄºó¼Ì½áµãµÄǰÇýÖ¸Õ룬¶ÔӦͼ2.21¢Ú + delete p; //Êͷű»É¾½áµãµÄ¿Õ¼ä + --length; + return OK; + } +}//ListDelete_DuL + +void CreateDuList_L(DuLinkList &L) { + //ÕýλÐòÊäÈën¸öÔªËØµÄÖµ£¬½¨Á¢´ø±íÍ·½áµãµÄË«ÏòÁ´±íL£¬Í¬Ê±½¨Á¢Ç°ÇýÖ¸Õë + DuLinkList r, p; + L = new DuLNode; + L->next = NULL; //ÏȽ¨Á¢Ò»¸ö´øÍ·½áµãµÄ¿ÕÁ´±í + r = L;//βָÕërÖ¸ÏòÍ·½áµã + length = 0; + fstream file; + file.open("book.txt"); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + file >> head_1 >> head_2 >> head_3; + while (!file.eof()) { + p = new DuLNode; //Éú³Éнáµã + file >> p->data.id >> p->data.name >> p->data.price; //ÊäÈëÔªËØÖµ + p->next = NULL; + r->next = p; //²åÈëµ½±íβ + r = p; //rÖ¸ÏòеÄβ½áµã + p->prior = L->prior; //²åÈëµ½±íÍ· + L->prior = p; + length++; + } + file.close(); +} //CreateDuList_L + +int main() { + int a, choose; + Book e; + DuLinkList L, p; + cout << "1. ½¨Á¢\n"; + cout << "2. ÊäÈë\n"; + cout << "3. ²åÈë\n"; + cout << "4. ɾ³ý\n"; + cout << "5. Êä³ö\n"; + cout << "0. Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1: //½¨Á¢Ò»¸öË«ÏòÁ´±í + if (InitDuList_L(L)) + cout << "³É¹¦½¨Á¢Ë«ÏòÁ´±í!\n\n"; + break; + case 2: //ʹÓúó²å·¨´´½¨Ë«ÏòÁ´±í + CreateDuList_L(L); + cout << "ÊäÈë book.txt ÐÅÏ¢Íê±Ï\n\n"; + break; + case 3: //Ë«ÏòÁ´±íµÄ²åÈë + cout << "ÇëÊäÈëÁ½¸öÊý·Ö±ð´ú±í²åÈëµÄλÖúÍÊýÖµ£¨ÊéµÄÐÅÏ¢£º±àºÅ&ÊéÃû&¼Û¸ñ£©:"; + cin >> a; + cin >> e.id >> e.name >> e.price; + if (ListInsert_DuL(L, a, e)) + cout << "²åÈë³É¹¦.\n\n"; + else + cout << "²åÈëʧ°Ü!\n\n"; + break; + case 4: //Ë«ÏòÁ´±íµÄɾ³ý + cout << "ÇëÊäÈëËùҪɾ³ýµÄÊé¼®µÄλÖÃ:"; + cin >> a; + if (ListDelete_DuL(L, a)) + cout << "ɾ³ý³É¹¦!\n\n"; + else + cout << "ɾ³ýʧ°Ü!\n\n"; + break; + case 5: //Ë«ÏòÁ´±íµÄÊä³ö + cout << "µ±Ç°Í¼ÊéϵͳÐÅÏ¢¶Á³ö:\n"; + p = L->next; + while (p) { + cout << left << setw(15) << p->data.id << "\t" << left << setw( + 50) << p->data.name << "\t" << left << setw(5) + << p->data.price << endl; + p = p->next; + } + cout << endl; + break; + } + } + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/book.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/book.txt new file mode 100644 index 0000000..3701fc8 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.13-2.14/book.txt @@ -0,0 +1,17 @@ +ISBN ÊéÃû ¶¨¼Û +9787302257646 ³ÌÐòÉè¼Æ»ù´¡ 25 +9787302219972 µ¥Æ¬»ú¼¼Êõ¼°Ó¦Óà 32 +9787302203513 ±àÒëÔ­Àí 46 +9787811234923 »ã±àÓïÑÔ³ÌÐòÉè¼Æ½Ì³Ì 21 +9787512100831 ¼ÆËã»ú²Ù×÷ϵͳ 17 +9787302265436 ¼ÆËã»úµ¼ÂÛʵÑéÖ¸µ¼ 18 +9787302180630 ʵÓÃÊý¾Ý½á¹¹ 29 +9787302225065 Êý¾Ý½á¹¹£¨CÓïÑ԰棩 38 +9787302171676 C#ÃæÏò¶ÔÏó³ÌÐòÉè¼Æ 39 +9787302250692 CÓïÑÔ³ÌÐòÉè¼Æ 42 +9787302150664 Êý¾Ý¿âÔ­Àí 35 +9787302260806 Java±à³ÌÓëʵ¼ù 56 +9787302252887 Java³ÌÐòÉè¼ÆÓëÓ¦ÓÃ½Ì³Ì 39 +9787302198505 ǶÈëʽ²Ù×÷ϵͳ¼°±à³Ì 25 +9787302169666 Èí¼þ²âÊÔ 24 +9787811231557 Eclipse»ù´¡ÓëÓ¦Óà 35 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/2.15(链表).cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/2.15(链表).cpp new file mode 100644 index 0000000..97e1347 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/2.15(链表).cpp @@ -0,0 +1,109 @@ +#include +#include +#include +using namespace std; + +#define ERROR 0 + +typedef struct LNode { + int data; //½áµãµÄÊý¾ÝÓò + struct LNode *next; //½áµãµÄÖ¸ÕëÓò +} LNode, *List; //LinkListΪָÏò½á¹¹ÌåLNodeµÄÖ¸ÕëÀàÐÍ + +int n, m; +char st = 'A'; + +void InitList(List &L) //´´½¨Á´±í +{ + L = new LNode; + L->next = NULL; +} + +void ListInput(List &L, int n) //Á´±íÊý¾ÝµÄÊäÈë +{ + int i; + List p, r; + r = L; + char filename[20] = { 0 }; + cout << "ÇëÊäÈë˳Ðò±íL" << st << "µÄÊý¾ÝÎļþÃû³Æ£¨ÎļþÃû+¡°.txt¡±£¬ÈçList" << st << ".txt£©£º" << endl; + ++st; + gets(filename); + fstream file; + file.open(filename); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + while (!file.eof()) { + p = new LNode; + file >> p->data; + p->next = NULL; + r->next = p; + r = p; + n++; + } + file.close(); +} + +bool LocateElem(List L, int e) //ÅжÏListÀïÓÐûÓÐeÕâ¸öÔªËØ +{ + List p; + p = L->next; + while (p != NULL) { + if (p->data == e) + return true; + p = p->next; + } + return false; +} + +void ListInsert(List &L, int e) //½«e²åÈëµ½ListÖÐ +{ + List p; + p = new LNode; + p->data = e; + p->next = L->next; + L->next = p; +} + +void ListOutput(List L) //Êä³öList +{ + List p; + p = L->next; + while (p != NULL) { + cout << p->data << " "; + p = p->next; + } + cout << endl; +} + +void unionList(List &LA, List LB) //Ëã·¨2.15 ÏßÐÔ±íµÄºÏ²¢£¨Á´±í£© +{ + //½«ËùÓÐÔÚÏßÐÔ±íLBÖе«²»ÔÚLAÖеÄÊý¾ÝÔªËØ²åÈëµ½LAÖÐ + int e; + List p; + p = LB->next; + while (p != NULL) { + e = p->data; + if (!LocateElem(LA, e)) //LAÖв»´æÔÚºÍeÏàͬµÄÊý¾ÝÔªËØ£¬Ôò²åÈëÖ® + ListInsert(LA, e); + p = p->next; + } +} //unionList + +int main() { + List LA, LB; + + InitList(LA); + + InitList(LB); + + ListInput(LA, n); + ListInput(LB, m); + + unionList(LA, LB); + + cout << "LAºÍLBºÏ²¢ºóµÄ¼¯ºÏΪ£º\n"; + ListOutput(LA); + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListA.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListA.txt new file mode 100644 index 0000000..6f2b0bc --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListA.txt @@ -0,0 +1 @@ +7 5 3 11 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListB.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListB.txt new file mode 100644 index 0000000..8a56b96 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(链表)/ListB.txt @@ -0,0 +1 @@ +2 6 3 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/2.15(顺åº�表).cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/2.15(顺åº�表).cpp new file mode 100644 index 0000000..1a1eb80 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/2.15(顺åº�表).cpp @@ -0,0 +1,100 @@ +#include +#include +using namespace std; +#define MAXSIZE 100 +#define ERROR 0 +typedef struct { //¶¨Òå˳Ðò±í + int *elem; + int length; +} List; +int n, m; +char st = 'A'; + +void InitList(List &L) //´´½¨Ë³Ðò±í +{ + L.elem = new int[MAXSIZE]; + L.length = 0; +} + +void ListInput(List &L, int n) //˳Ðò±íÊý¾ÝµÄÊäÈë +{ + int i = 0; + char filename[20] = { 0 }; + cout << "ÇëÊäÈë˳Ðò±íL" << st << "µÄÊý¾ÝÎļþÃû³Æ£¨ÎļþÃû+¡°.txt¡±£¬ÈçList" << st << ".txt£©£º" << endl; + ++st; + gets(filename); + fstream file; + file.open(filename); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + while (!file.eof()) { + file >> L.elem[i]; + i++; + } + L.length = i; + +} + +int ListLength(List L) //Çó˳Ðò±íµÄ³¤¶È +{ + return L.length; +} + +void GetElem(List L, int i, int &e) //Çó˳Ðò±íµÄµÚi¸öÔªËØ£¬²¢ÒÔe·µ»Ø +{ + e = L.elem[i - 1]; +} + +bool LocateElem(List L, int e) //ÅжÏListÀïÓÐûÓÐeÕâ¸öÔªËØ +{ + int i; + for (i = 0; i < L.length; i++) + if (e == L.elem[i]) + return true; + return false; +} + +void ListInsert(List &L, int e) //½«e²åÈëµ½ListµÄ×îºó +{ + L.elem[L.length] = e; + L.length++; +} + +void ListOutput(List L) //Êä³öList +{ + int i; + for (i = 0; i < L.length; i++) + cout << L.elem[i] << " "; + cout << endl; +} + +void unionList(List &LA, List LB) //Ëã·¨2.14 ÏßÐÔ±íµÄºÏ²¢£¨Ë³Ðò±í£© +{ + //½«ËùÓÐÔÚÏßÐÔ±íLBÖе«²»ÔÚLAÖеÄÊý¾ÝÔªËØ²åÈëµ½LAÖÐ + int LA_len, LB_len, i, e; + LA_len = ListLength(LA); + LB_len = ListLength(LB); //ÇóÏßÐÔ±íµÄ³¤¶È + for (i = 1; i <= LB_len; i++) { + GetElem(LB, i, e); //È¡LBÖеÚi¸öÊý¾ÝÔªËØ¸³¸øe + if (!LocateElem(LA, e)) //LAÖв»´æÔÚºÍeÏàͬµÄÊý¾ÝÔªËØ£¬Ôò²åÈëÖ® + ListInsert(LA, e); + } +} //unionList + +int main() { + List LA, LB; + InitList(LA); + InitList(LB); + + ListInput(LA, n); + + ListInput(LB, m); + + unionList(LA, LB); + + cout << "LAºÍLBºÏ²¢ºóµÄ¼¯ºÏΪ£º\n"; + ListOutput(LA); + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListA.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListA.txt new file mode 100644 index 0000000..6f2b0bc --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListA.txt @@ -0,0 +1 @@ +7 5 3 11 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListB.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListB.txt new file mode 100644 index 0000000..8a56b96 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.15(顺åº�表)/ListB.txt @@ -0,0 +1 @@ +2 6 3 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/2.16.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/2.16.cpp new file mode 100644 index 0000000..25081e0 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/2.16.cpp @@ -0,0 +1,93 @@ +#include +#include +using namespace std; +#define MAXSIZE 100 +#define ERROR 0 + +typedef struct //¶¨Òå˳Ðò±í +{ + int *elem; + int length; +} SqList; +int num_a = 0, num_b = 0; +char st = 'A'; + +void InitList_Sq(SqList &L, int n) //´´½¨Ë³Ðò±í +{ + L.elem = new int[MAXSIZE]; + if (!L.elem) + exit(0); + L.length = 0; +} + +void input(SqList &L, int n) //ÒÀ´ÎÍù˳Ðò±íLÀïÊäÈëÊý¾Ý +{ + int i = 0; + char filename[20] = { 0 }; + cout << "ÇëÊäÈë·ÇµÝ¼õÏßÐÔ±í" << st << "µÄÊý¾ÝÎļþÃû³Æ£¨ÎļþÃû+¡°.txt¡±£¬ÈçList" << st << ".txt£©£º" << endl; + ++st; + gets(filename); + fstream file; + file.open(filename); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + while (!file.eof()) { + file >> L.elem[i]; + i++; + } + L.length = i; +} + +void output(SqList L) //ÒÀ´ÎÊä³ö˳Ðò±íÀïµÄÿ¸öÔªËØ +{ + int i; + for (i = 0; i < L.length; i++) { + if (i) + cout << ","; + cout << L.elem[i]; + } +} + +void MergeList_Sq(SqList LA, SqList LB, SqList &LC) //Ëã·¨2.16 ˳ÐòÓÐÐò±íµÄºÏ²¢ +{ + //ÒÑ֪˳ÐòÓÐÐò±íLAºÍLBµÄÔªËØ°´Öµ·ÇµÝ¼õÅÅÁÐ + //¹é²¢LAºÍLBµÃµ½ÐµÄ˳ÐòÓÐÐò±íLC£¬LCµÄÔªËØÒ²°´Öµ·ÇµÝ¼õÅÅÁÐ + int *pa, *pb, *pc, *pa_last, *pb_last; + pa = LA.elem; + pb = LB.elem; //Ö¸ÕëpaºÍpbµÄ³õÖµ·Ö±ðÖ¸ÏòÁ½¸ö±íµÄµÚÒ»´ÎÔªËØ + LC.length = LA.length + LB.length; //ÐÂ±í³¤¶ÈΪ´ýºÏ²¢Á½±íµÄ³¤¶ÈÖ®ºÍ + LC.elem = new int[LC.length]; //ΪºÏ²¢ºóµÄбí·ÖÅäÒ»¸öÊý×é¿Õ¼ä + pc = LC.elem; //Ö¸ÕëpcÖ¸ÏòбíµÄµÚÒ»¸öÔªËØ + pa_last = LA.elem + LA.length - 1; //Ö¸Õëpa_lastÖ¸ÏòLA±íµÄ×îºóÒ»¸öÔªËØ + pb_last = LB.elem + LB.length - 1; //Ö¸Õëpb_lastÖ¸ÏòLB±íµÄ×îºóÒ»¸öÔªËØ + while (pa <= pa_last && pb <= pb_last) //Á½¸ö±í¶¼·Ç¿Õ + { + if (*pa <= *pb) //ÒÀ´Î¡°ÕªÈ¡¡±Á½±íÖÐÖµ½ÏСµÄ½áµã²åÈëµ½LC±íµÄ×îºó + *pc++ = *pa++; + else + *pc++ = *pb++; + } + while (pa <= pa_last) //LBÒѵ½´ï±í⣬ÒÀ´Î½«LAµÄÊ£ÓàÔªËØ²åÈëLC±íµÄ×îºó + *pc++ = *pa++; + while (pb <= pb_last) //LAÒѵ½´ï±í⣬ÒÀ´Î½«LBµÄÊ£ÓàÔªËØ²åÈëLC±íµÄ×îºó + *pc++ = *pb++; +} //MergeList_List + +int main() { + SqList La, Lb, Lc; + + InitList_Sq(La, num_a); //La±íµÄ´´½¨ + input(La, num_a); //ÒÀ´ÎÍù˳Ðò±íLaÀïÊäÈëÊý¾Ý + + InitList_Sq(Lb, num_b); //Lb±íµÄ´´½¨ + input(Lb, num_b); //ÒÀ´ÎÍù˳Ðò±íLaÀïÊäÈëÊý¾Ý + + MergeList_Sq(La, Lb, Lc); //½«Ë³Ðò±íLaºÍLb½øÐкϲ¢ + + cout << "·ÇµÝ¼õÏßÐÔ±íA£¬BºÏ²¢ºóµÄ·ÇµÝ¼õÏßÐÔ±íCΪ£º\n"; //Êä³öºÏ²¢ºóµÄÓÐÐò˳Ðò±íLc + output(Lc); + cout << endl; + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListA.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListA.txt new file mode 100644 index 0000000..601ea4a --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListA.txt @@ -0,0 +1 @@ +3 5 8 11 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListB.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListB.txt new file mode 100644 index 0000000..f8f292f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.16/ListB.txt @@ -0,0 +1 @@ +2 6 8 9 11 15 20 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/2.17.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/2.17.cpp new file mode 100644 index 0000000..8eb909e --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/2.17.cpp @@ -0,0 +1,104 @@ +#include +#include +using namespace std; +#define ERROR 0 + +typedef struct LNode //¶¨Òåµ¥Á´±í +{ + int data; + struct LNode *next; +} LNode, *LinkList; + +int num_a, num_b; +char st = 'A'; + +void InitList_L(LinkList &L) //´´½¨µ¥Á´±í +{ + L = new LNode; + L->next = NULL; +} + +void input(LinkList &L, int n) //ÒÀ´ÎÍùµ¥Á´±íLÀïÊäÈëÊý¾Ý +{ + int i; + LNode *p, *r; + r = L; + char filename[20] = { 0 }; + cout << "ÇëÊäÈë·ÇµÝ¼õµ¥Á´±í" << st << "µÄÊý¾ÝÎļþÃû³Æ£¨ÎļþÃû+¡°.txt¡±£¬ÈçList" << st << ".txt£©£º" << endl; + ++st; + gets(filename); + fstream file; + file.open(filename); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + while (!file.eof()) { + p = new LNode; + file >> p->data; + p->next = NULL; + r->next = p; + r = p; + n++; + } + file.close(); +} + +void output(LinkList L) //ÒÀ´ÎÊä³öµ¥Á´±íÀïµÄÿ¸öÔªËØ +{ + int i = 0; + LNode *p; + p = L->next; + while (p) { + if (i) + cout << ","; + cout << p->data; + p = p->next; + i = 1; + } +} + +void MergeList_L(LinkList &LA, LinkList &LB, LinkList &LC) //Ëã·¨2.17 Á´Ê½ÓÐÐò±íµÄºÏ²¢ +{ + //ÒÑÖªµ¥Á´±íLAºÍLBµÄÔªËØ°´Öµ·ÇµÝ¼õÅÅÁÐ + //¹é²¢LAºÍLBµÃµ½Ðµĵ¥Á´±íLC£¬LCµÄÔªËØÒ²°´Öµ·ÇµÝ¼õÅÅÁÐ + LinkList pa, pb, pc; + pa = LA->next; + pb = LB->next; //paºÍpbµÄ³õÖµ·Ö±ðÖ¸ÏòÁ½¸ö±íµÄµÚÒ»¸ö½áµã + LC = LA; //ÓÃLAµÄÍ·½áµã×÷ΪLCµÄÍ·½áµã + pc = LC; //pcµÄ³õÖµÖ¸ÏòLCµÄÍ·½áµã + while (pa && pb) //Á½¸ö±í¶¼·Ç¿Õ + { + if (pa->data <= pb->data) //ÒÀ´Î"ժȡ"Á½±íÖÐÖµ½ÏСµÄ½áµã²åÈëµ½LC±íµÄ×îºó + { + pc->next = pa; //½«paËùÖ¸½áµãÁ´½Óµ½pcËùÖ¸½áµãÖ®ºó + pc = pa; + pa = pa->next; + } else { + pc->next = pb; //½«pbËùÖ¸½áµãÁ´½Óµ½pcËùÖ¸½áµãÖ®ºó + pc = pb; + pb = pb->next; + } + } + pc->next = pa ? pa : pb; //²åÈë·Ç¿Õ±íµÄÊ£Óà¶Î + delete LB; //ÊÍ·ÅLBµÄÍ·½áµã +} //MergeList_L() + +int main() { + LinkList La, Lb, Lc; + + InitList_L(La); //La±íµÄ´´½¨ + input(La, num_a); //ÒÀ´ÎÍùµ¥Á´±íLaÀïÊäÈëÊý¾Ý + + InitList_L(Lb); //Lb±íµÄ´´½¨ + input(Lb, num_b); //ÒÀ´ÎÍùµ¥Á´±íLaÀïÊäÈëÊý¾Ý + + InitList_L(Lc); + MergeList_L(La, Lb, Lc); //½«µ¥Á´±íLaºÍLb½øÐкϲ¢ + + + cout << "·ÇµÝ¼õµ¥Á´±íA£¬BºÏ²¢ºóµÄ·ÇµÝ¼õµ¥Á´±íCΪ£º\n"; //Êä³öºÏ²¢ºóµÄµ¥Á´±íLc + output(Lc); + cout << endl; + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListA.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListA.txt new file mode 100644 index 0000000..601ea4a --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListA.txt @@ -0,0 +1 @@ +3 5 8 11 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListB.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListB.txt new file mode 100644 index 0000000..f8f292f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.17/ListB.txt @@ -0,0 +1 @@ +2 6 8 9 11 15 20 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/2.18-2.19.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/2.18-2.19.cpp new file mode 100644 index 0000000..a8c6141 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/2.18-2.19.cpp @@ -0,0 +1,124 @@ +#include +#include +#include +using namespace std; +#define ERROR 0 + +typedef struct PNode { + float coef; //ϵÊý + int expn; //Ö¸Êý + struct PNode *next; +} PNode, *Polynomial; +string head_1, head_2; +int temp; +char st = 'A'; + +void CreatPolyn(Polynomial &P, int m) //Ëã·¨2.18 ¶àÏîʽµÄ´´½¨ +{ + //ÊäÈëmÏîµÄϵÊýºÍÖ¸Êý£¬½¨Á¢±íʾһ¸ö¶àÏîʽµÄÓÐÐòÁ´±íP + Polynomial q, pre, s; + int i; + P = new PNode; + P->next = NULL; //ÏȽ¨Á¢Ò»¸ö´øÍ·½áµãµÄµ¥Á´±í + char filename[20] = { 0 }; + cout << "ÇëÊäÈëÓйضàÏîʽp" << char(st + 32) << "ϵÊýºÍÖ¸ÊýµÄÊý¾ÝÎļþÃû³Æ£¨ÎļþÃû+¡°.txt¡±£¬ÈçPoly" << st << ".txt£©£º" << endl; + ++st; + gets(filename); + fstream file; + file.open(filename); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + file >> head_1 >> head_2; + while (!file.eof()) + { + s = new PNode; //Éú³Éнáµã + file >> s->coef >> s->expn; //ÊäÈëÔªËØÖµ + pre = P; //preÓÃÓÚ±£´æqµÄǰÇý£¬³õֵΪͷ½áµã + q = P->next; + while (q && q->expn < s->expn) //ͨ¹ý±È½ÏÖ¸ÊýÕÒµ½µÚÒ»¸ö´óÓÚÊäÈëÏîÖ¸ÊýµÄÏîq + { + pre = q; + q = q->next; + } //while + s->next = q; //½«ÊäÈëÏîs²åÈëµ½qºÍÆäǰÇý½áµãpreÖ®¼ä + pre->next = s; + }//for + file.close(); +} //CreatPolyn + +void AddPolyn(Polynomial &Pa, Polynomial &Pb) //Ëã·¨2.19 ¶àÏîʽµÄÏà¼Ó +{ + //¶àÏîʽ¼Ó·¨£ºPa=Pa+Pb£¬ÀûÓÃÁ½¸ö¶àÏîʽµÄ½áµã¹¹³É¡°ºÍ¶àÏîʽ¡± + Polynomial r, p1, p2, p3; + float sum; + p1 = Pa->next; + p2 = Pb->next; //p1ºÍp2³õÖµ·Ö±ðÖ¸ÏòPaºÍPbµÄµÚÒ»¸ö½áµã + p3 = Pa; //p3Ö¸ÏòºÍ¶àÏîʽµÄµ±Ç°½áµã£¬³õֵΪPa + while (p1 && p2) //p1ºÍp2¾ù·Ç¿Õ + { + if (p1->expn == p2->expn) //Ö¸ÊýÏàµÈ + { + sum = p1->coef + p2->coef; //sum±£´æÁ½ÏîµÄϵÊýºÍ + if (sum != 0) //ϵÊýºÍ²»Îª0 + { + p1->coef = sum; //ÐÞ¸ÄPaµ±Ç°½áµãp1µÄϵÊýֵΪÁ½ÏîϵÊýµÄºÍ + p3->next = p1; + p3 = p1; //½«Ð޸ĺóµÄPaµ±Ç°½áµãp1Á´ÔÚp3Ö®ºó£¬p3Ö¸Ïòp1 + p1 = p1->next; //p1Ö¸ÏòºóÒ»Ïî + r = p2; + p2 = p2->next; + delete r; //ɾ³ýPbµ±Ç°½áµãr + } else //ϵÊýºÍΪ0 + { + r = p1; + p1 = p1->next; + delete r; //ɾ³ýPbµ±Ç°½áµãp1 + r = p2; + p2 = p2->next; + delete r; //ɾ³ýPbµ±Ç°½áµãp2 + } + } else if (p1->expn < p2->expn) //Paµ±Ç°½áµãp1µÄÖ¸ÊýֵС + { + p3->next = p1; //½«p1Á´ÔÚp3Ö®ºó + p3 = p1; //p3Ö¸Ïòp1 + p1 = p1->next; //p1Ö¸ÏòºóÒ»Ïî + } else //Paµ±Ç°½áµãp2µÄÖ¸ÊýֵС + { + p3->next = p2; //½«p2Á´ÔÚp3Ö®ºó + p3 = p2; //p3Ö¸Ïòp2 + p2 = p2->next; //p2Ö¸ÏòºóÒ»Ïî + } + } //while + p3->next = p1 ? p1 : p2; //²åÈë·Ç¿Õ¶àÏîʽµÄÊ£Óà¶Î + delete Pb; //ÊÍ·ÅPbµÄÍ·½áµã +} //AddPolyn + + +int main() { + Polynomial Pa, Pb; + Polynomial p; + int i; + + //´´½¨¶àÏîʽPa + CreatPolyn(Pa, temp); //µ÷Óú¯Êý£¬ÊäÈëPaÿһÏîµÄϵÊýºÍÖ¸Êý + + //´´½¨¶àÏîʽPb + CreatPolyn(Pb, temp); //µ÷Óú¯Êý£¬ÊäÈëPaÿһÏîµÄϵÊýºÍÖ¸Êý + + AddPolyn(Pa, Pb); + cout << "¶àÏîʽPaºÍPbÏà¼ÓºóµÄ½á¹ûÊÇ£º\n"; + p = Pa->next; + i = 0; + while (p) //Êä³öÏà¼ÓºóµÄ½á¹û£¬Ã¿Ò»ÏîÒÔx^n±íʾ + { + if (i) + cout << " + "; + cout << "(" << p->coef << ") * x^" << p->expn; + p = p->next; + i = 1; + } + cout << endl; + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyA.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyA.txt new file mode 100644 index 0000000..d5f72c1 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyA.txt @@ -0,0 +1,5 @@ +ϵÊýp Ö¸Êý +7 0 +3 1 +9 8 +5 17 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyB.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyB.txt new file mode 100644 index 0000000..5100be2 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.18-2.19/PolyB.txt @@ -0,0 +1,4 @@ +ϵÊýp Ö¸Êý +8 1 +22 7 +-9 8 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/2.6-2.12.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/2.6-2.12.cpp new file mode 100644 index 0000000..c180a07 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/2.6-2.12.cpp @@ -0,0 +1,227 @@ +#include +#include +#include +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; //Status ÊǺ¯Êý·µ»ØÖµÀàÐÍ£¬ÆäÖµÊǺ¯Êý½á¹û״̬´úÂë¡£ +typedef int ElemType; //ElemType Ϊ¿É¶¨ÒåµÄÊý¾ÝÀàÐÍ£¬´ËÉèΪintÀàÐÍ + +struct Book { + string id;//ISBN + string name;//ÊéÃû + double price;//¶¨¼Û +}; +typedef struct LNode { + Book data; //½áµãµÄÊý¾ÝÓò + struct LNode *next; //½áµãµÄÖ¸ÕëÓò +} LNode, *LinkList; //LinkListΪָÏò½á¹¹ÌåLNodeµÄÖ¸ÕëÀàÐÍ + +string head_1, head_2, head_3; +int length; + +Status InitList_L(LinkList &L) { //Ëã·¨2.6 µ¥Á´±íµÄ³õʼ»¯ + //¹¹ÔìÒ»¸ö¿ÕµÄµ¥Á´±íL + L = new LNode; //Éú³Éнáµã×÷Ϊͷ½áµã£¬ÓÃÍ·Ö¸ÕëLÖ¸ÏòÍ·½áµã + L->next = NULL; //Í·½áµãµÄÖ¸ÕëÓòÖÃ¿Õ + return OK; +} + +Status GetElem_L(LinkList L, int i, Book &e) { //Ëã·¨2.7 µ¥Á´±íµÄȡֵ + //ÔÚ´øÍ·½áµãµÄµ¥Á´±íLÖвéÕÒµÚi¸öÔªËØ + //ÓÃe·µ»ØLÖеÚi¸öÊý¾ÝÔªËØµÄÖµ + int j; + LinkList p; + p = L->next; + j = 1; //³õʼ»¯£¬pÖ¸ÏòµÚÒ»¸ö½áµã£¬jΪ¼ÆÊýÆ÷ + while (j < i && p) { //˳Á´ÓòÏòºóɨÃ裬ֱµ½pÖ¸ÏòµÚi¸öÔªËØ»òpΪ¿Õ + p = p->next; //pÖ¸ÏòÏÂÒ»¸ö½áµã + ++j; //¼ÆÊýÆ÷jÏàÓ¦¼Ó1 + } + if (!p || j > i) + return ERROR; //iÖµ²»ºÏ·¨i£¾n»òi<=0 + e = p->data; //È¡µÚi¸ö½áµãµÄÊý¾ÝÓò + return OK; +} //GetElem_L + +LNode *LocateElem_L(LinkList L, int e) { //Ëã·¨2.8 °´Öµ²éÕÒ + //ÔÚ´øÍ·½áµãµÄµ¥Á´±íLÖвéÕÒֵΪeµÄÔªËØ + LinkList p; + p = L->next; + while (p && p->data.price != e)//˳Á´ÓòÏòºóɨÃ裬ֱµ½pΪ¿Õ»òpËùÖ¸½áµãµÄÊý¾ÝÓòµÈÓÚe + p = p->next; //pÖ¸ÏòÏÂÒ»¸ö½áµã + return p; //²éÕҳɹ¦·µ»ØÖµÎªeµÄ½áµãµØÖ·p£¬²éÕÒʧ°ÜpΪNULL +} //LocateElem_L + +Status ListInsert_L(LinkList &L, int i, Book &e) { //Ëã·¨2.9 µ¥Á´±íµÄ²åÈë + //ÔÚ´øÍ·½áµãµÄµ¥Á´±íLÖеÚi¸öλÖòåÈëֵΪeµÄнáµã + int j; + LinkList p, s; + p = L; + j = 0; + while (p && j < i - 1) { + p = p->next; + ++j; + }//²éÕÒµÚi?1¸ö½áµã£¬pÖ¸Ïò¸Ã½áµã + if (!p || j > i - 1) + return ERROR; //i£¾n+1»òÕßi£¼1 + s = new LNode; //Éú³Éнáµã*s + s->data = e; //½«½áµã*sµÄÊý¾ÝÓòÖÃΪe + s->next = p->next; //½«½áµã*sµÄÖ¸ÕëÓòÖ¸Ïò½áµãai + p->next = s; //½«½áµã*pµÄÖ¸ÕëÓòÖ¸Ïò½áµã*s + ++length; + return OK; +} //ListInsert_L + +Status ListDelete_L(LinkList &L, int i) { //Ëã·¨2.9 µ¥Á´±íµÄɾ³ý + //ÔÚ´øÍ·½áµãµÄµ¥Á´±íLÖУ¬É¾³ýµÚi¸öλÖà + LinkList p, q; + int j; + p = L; + j = 0; + while ((p->next) && (j < i - 1)) //²éÕÒµÚi?1¸ö½áµã£¬pÖ¸Ïò¸Ã½áµã + { + p = p->next; + ++j; + } + if (!(p->next) || (j > i - 1)) + return ERROR; //µ±i>n»òi<1ʱ£¬É¾³ýλÖò»ºÏÀí + q = p->next; //ÁÙʱ±£´æ±»É¾½áµãµÄµØÖ·ÒÔ±¸ÊÍ·Å + p->next = q->next; //¸Ä±äɾ³ý½áµãǰÇý½áµãµÄÖ¸ÕëÓò + delete q; //ÊÍ·Åɾ³ý½áµãµÄ¿Õ¼ä + --length; + return OK; +} //ListDelete_L + +void CreateList_H(LinkList &L, int n) { //Ëã·¨2.11 ǰ²å·¨´´½¨µ¥Á´±í + //ÄæÎ»ÐòÊäÈën¸öÔªËØµÄÖµ£¬½¨Á¢µ½Í·½áµãµÄµ¥Á´±íL + LinkList p; + L = new LNode; + L->next = NULL; //ÏȽ¨Á¢Ò»¸ö´øÍ·½áµãµÄ¿ÕÁ´±í + length = 0; + fstream file; + file.open("book.txt"); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + file >> head_1 >> head_2 >> head_3; + while (!file.eof()) { + p = new LNode; //Éú³Éнáµã*p + file >> p->data.id >> p->data.name >> p->data.price; //ÊäÈëÔªËØÖµ¸³¸øÐ½áµã*pµÄÊý¾ÝÓò + p->next = L->next; + L->next = p; //½«Ð½áµã*p²åÈ뵽ͷ½áµãÖ®ºó + length++;//ͬʱ¶ÔÁ´±í³¤¶È½øÐÐͳ¼Æ + } + file.close(); +} //CreateList_F + +void CreateList_R(LinkList &L, int n) { //Ëã·¨2.12 ºó²å·¨´´½¨µ¥Á´±í + //ÕýλÐòÊäÈën¸öÔªËØµÄÖµ£¬½¨Á¢´ø±íÍ·½áµãµÄµ¥Á´±íL + LinkList p, r; + L = new LNode; + L->next = NULL; //ÏȽ¨Á¢Ò»¸ö´øÍ·½áµãµÄ¿ÕÁ´±í + r = L; //βָÕërÖ¸ÏòÍ·½áµã + length = 0; + fstream file; //´ò¿ªÎļþ½øÐжÁд²Ù×÷ + file.open("book.txt"); + if (!file) { + cout << "δÕÒµ½Ïà¹ØÎļþ£¬ÎÞ·¨´ò¿ª£¡" << endl; + exit(ERROR); + } + file >> head_1 >> head_2 >> head_3; + while (!file.eof()) { //½«ÎļþÖеÄÐÅÏ¢ÔËÓúó²å·¨²åÈëµ½Á´±íÖÐ + p = new LNode;//Éú³Éнáµã + file >> p->data.id >> p->data.name >> p->data.price;//ÊäÈëÔªËØÖµ¸³¸øÐ½áµã*pµÄÊý¾ÝÓò + p->next = NULL; + r->next = p;//½«Ð½áµã*p²åÈëβ½áµã*rÖ®ºó + r = p;//rÖ¸ÏòеÄβ½áµã*p + length++; //ͬʱ¶ÔÁ´±í³¤¶È½øÐÐͳ¼Æ + } + file.close(); +} //CreateList_L + +int main() { + int a, n, choose; + double price; + Book e; + LinkList L, p; + cout << "1. ½¨Á¢\n"; + cout << "2. ÊäÈë\n"; + cout << "3. ȡֵ\n"; + cout << "4. ²éÕÒ\n"; + cout << "5. ²åÈë\n"; + cout << "6. ɾ³ý\n"; + cout << "7. Êä³ö\n"; + cout << "0. Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1: //½¨Á¢Ò»¸öµ¥Á´±í + if (InitList_L(L)) + cout << "³É¹¦½¨Á¢Á´±í!\n\n"; + break; + case 2: //ʹÓúó²å·¨´´½¨µ¥Á´±í + CreateList_R(L, length); + cout << "ÊäÈë book.txt ÐÅÏ¢Íê±Ï\n\n"; + break; + case 3: //µ¥Á´±íµÄ°´ÐòºÅȡֵ + cout << "ÇëÊäÈëÒ»¸öλÖÃÓÃÀ´È¡Öµ:"; + cin >> a; + if (GetElem_L(L, a, e)) { + cout << "²éÕҳɹ¦\n"; + cout << "µÚ" << a << "±¾Í¼ÊéµÄÐÅÏ¢ÊÇ£º\n"; + cout << left << setw(15) << e.id << "\t" << left << setw(50) + << e.name << "\t" << left << setw(5) << e.price << endl + << endl; + } else + cout << "²éÕÒʧ°Ü\n\n"; + break; + case 4: //µ¥Á´±íµÄ°´Öµ²éÕÒ + cout << "ÇëÊäÈëËùÒª²éÕÒ¼Û¸ñ:"; + cin >> price; + if (LocateElem_L(L, price) != NULL) { + cout << "²éÕҳɹ¦\n"; + cout << "¸Ã¼Û¸ñ¶ÔÓ¦µÄÊéÃûΪ£º" << LocateElem_L(L, price)->data.name + << endl << endl; + } else + cout << "²éÕÒʧ°Ü! ¶¨¼Û" << price << " ûÓÐÕÒµ½\n\n"; + break; + case 5: //µ¥Á´±íµÄ²åÈë + cout << "ÇëÊäÈë²åÈëµÄλÖúÍÊéµÄÐÅÏ¢£¬°üÀ¨£º±àºÅ ÊéÃû ¼Û¸ñ£¨Óÿոñ¸ô¿ª£©:"; + cin >> a; + cin >> e.id >> e.name >> e.price; + if (ListInsert_L(L, a, e)) + cout << "²åÈë³É¹¦.\n\n"; + else + cout << "²åÈëʧ°Ü!\n\n"; + break; + case 6: //µ¥Á´±íµÄɾ³ý + cout << "ÇëÊäÈëËùҪɾ³ýµÄÊé¼®µÄλÖÃ:"; + cin >> a; + if (ListDelete_L(L, a)) + cout << "ɾ³ý³É¹¦!\n\n"; + else + cout << "ɾ³ýʧ°Ü!\n\n"; + break; + case 7: //µ¥Á´±íµÄÊä³ö + cout << "µ±Ç°Í¼ÊéϵͳÐÅÏ¢£¨Á´±í£©¶Á³ö:\n"; + p = L->next; + while (p) { + cout << left << setw(15) << p->data.id << "\t" << left << setw( + 50) << p->data.name << "\t" << left << setw(5) + << p->data.price << endl; + p = p->next; + } + cout << endl; + break; + } + } + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/book.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/book.txt new file mode 100644 index 0000000..3701fc8 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第2ç« /2.6-2.12/book.txt @@ -0,0 +1,17 @@ +ISBN ÊéÃû ¶¨¼Û +9787302257646 ³ÌÐòÉè¼Æ»ù´¡ 25 +9787302219972 µ¥Æ¬»ú¼¼Êõ¼°Ó¦Óà 32 +9787302203513 ±àÒëÔ­Àí 46 +9787811234923 »ã±àÓïÑÔ³ÌÐòÉè¼Æ½Ì³Ì 21 +9787512100831 ¼ÆËã»ú²Ù×÷ϵͳ 17 +9787302265436 ¼ÆËã»úµ¼ÂÛʵÑéÖ¸µ¼ 18 +9787302180630 ʵÓÃÊý¾Ý½á¹¹ 29 +9787302225065 Êý¾Ý½á¹¹£¨CÓïÑ԰棩 38 +9787302171676 C#ÃæÏò¶ÔÏó³ÌÐòÉè¼Æ 39 +9787302250692 CÓïÑÔ³ÌÐòÉè¼Æ 42 +9787302150664 Êý¾Ý¿âÔ­Àí 35 +9787302260806 Java±à³ÌÓëʵ¼ù 56 +9787302252887 Java³ÌÐòÉè¼ÆÓëÓ¦ÓÃ½Ì³Ì 39 +9787302198505 ǶÈëʽ²Ù×÷ϵͳ¼°±à³Ì 25 +9787302169666 Èí¼þ²âÊÔ 24 +9787811231557 Eclipse»ù´¡ÓëÓ¦Óà 35 \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/3.1-3.4.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/3.1-3.4.cpp new file mode 100644 index 0000000..0d2ca92 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/3.1-3.4.cpp @@ -0,0 +1,117 @@ +/***˳ÐòÕ»µÄʵÏÖ***/ + +#include +#include +using namespace std; + +//˳ÐòÕ»¶¨Òå +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +#define MAXSIZE 100//˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +typedef int Status; +typedef char SElemType; + +typedef struct { + SElemType *base;//Õ»µ×Ö¸Õë + SElemType *top;//Õ»¶¥Ö¸Õë + int stacksize;//Õ»¿ÉÓõÄ×î´óÈÝÁ¿ +} SqStack; + +//Ëã·¨3.1¡¡Ë³ÐòÕ»µÄ³õʼ»¯ +Status InitStack(SqStack &S) { + //¹¹ÔìÒ»¸ö¿ÕÕ»S + S.base = new SElemType[MAXSIZE];//Ϊ˳ÐòÕ»¶¯Ì¬·ÖÅäÒ»¸ö×î´óÈÝÁ¿ÎªMAXSIZEµÄÊý×é¿Õ¼ä + if (!S.base) + exit(OVERFLOW); //´æ´¢·ÖÅäʧ°Ü + S.top = S.base; //top³õʼΪbase£¬¿ÕÕ» + S.stacksize = MAXSIZE; //stacksizeÖÃΪջµÄ×î´óÈÝÁ¿MAXSIZE + return OK; +} +//Ëã·¨3.2¡¡Ë³ÐòÕ»µÄÈëÕ» +Status Push(SqStack &S, SElemType e) { + // ²åÈëÔªËØeΪеÄÕ»¶¥ÔªËØ + if (S.top - S.base == S.stacksize) + return ERROR; //Õ»Âú + *(S.top++) = e; //ÔªËØeѹÈëÕ»¶¥£¬Õ»¶¥Ö¸Õë¼Ó1 + return OK; +} +//Ëã·¨3.3¡¡Ë³ÐòÕ»µÄ³öÕ» +Status Pop(SqStack &S, SElemType &e) { + //ɾ³ýSµÄÕ»¶¥ÔªËØ£¬ÓÃe·µ»ØÆäÖµ + if (S.base == S.top) + return ERROR;//Õ»¿Õ + e = *(--S.top); //Õ»¶¥Ö¸Õë¼õ1£¬½«Õ»¶¥ÔªËظ³¸øe + return OK; +} +//Ëã·¨3.4¡¡È¡Ë³ÐòÕ»µÄÕ»¶¥ÔªËØ +char GetTop(SqStack S) {//·µ»ØSµÄÕ»¶¥ÔªËØ£¬²»ÐÞ¸ÄÕ»¶¥Ö¸Õë + if (S.top != S.base) //Õ»·Ç¿Õ + return *(S.top - 1); //·µ»ØÕ»¶¥ÔªËصÄÖµ£¬Õ»¶¥Ö¸Õë²»±ä +} + +int main() { + SqStack s; + int choose, flag = 0; + SElemType j, e, t; + cout << "1.³õʼ»¯\n"; + cout << "2.ÈëÕ»\n"; + cout << "3.¶ÁÕ»¶¥ÔªËØ\n"; + cout << "4.³öÕ»\n"; + cout << "0.Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1://Ëã·¨3.1¡¡Ë³ÐòÕ»µÄ³õʼ»¯ + if (InitStack(s)) { + flag = 1; + cout << "³É¹¦¶ÔÕ»½øÐгõʼ»¯\n\n"; + } else + cout << "³õʼ»¯Õ»Ê§°Ü\n\n"; + break; + case 2: {//Ëã·¨3.2¡¡Ë³ÐòÕ»µÄÈëÕ» + fstream file; + file.open("SqStack.txt");// + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡\n\n" << endl; + exit(ERROR); + } + if (flag) { + flag = 1; + cout << "½øÕ»ÔªËØÒÀ´ÎΪ£º\n"; + while (!file.eof()) { + file >> j; + if (file.fail()) + break; + else { + Push(s, j); + cout << j << " "; + } + } + cout << endl << endl; + } else + cout << "ջ佨Á¢£¬ÇëÖØÐÂÑ¡Ôñ\n\n"; + file.close(); + } + break; + case 3://Ëã·¨3.3¡¡Ë³ÐòÕ»µÄ³öÕ» + if(flag != -1 && flag != 0) + cout << "Õ»¶¥ÔªËØÎª£º\n" << GetTop(s) << endl << endl; + else + cout << "Õ»ÖÐÎÞÔªËØ£¬ÇëÖØÐÂÑ¡Ôñ\n" << endl; + break; + case 4://Ëã·¨3.4¡¡È¡Ë³ÐòÕ»µÄÕ»¶¥ÔªËØ + cout << "ÒÀ´Îµ¯³öµÄÕ»¶¥ÔªËØÎª:\n"; + while (Pop(s, t)){ + flag = -1; + cout << t << " "; + } + cout << endl << endl; + break; + } + } + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/SqStack.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/SqStack.txt new file mode 100644 index 0000000..1f30c63 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.1-3.4/SqStack.txt @@ -0,0 +1,4 @@ +A +B +C +D \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.cpp new file mode 100644 index 0000000..9d3880e --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.cpp @@ -0,0 +1,16 @@ +/***HanoiËþÎÊÌâ***/ + +#include"3.10.h" + +int main() { + int n; + char a, b, c; + a = '1'; + b = '2'; + c = '3'; + cout << "ÇëÊäÈë³õʼµÚÒ»¸öÖù×ÓÉϵÄÔ²Å̸öÊý£º" << endl; + cin >> n; + cout << "½«µÚÒ»¸öÖù×ÓÉϵÄÔ²ÅÌÈ«²¿Òƶ¯µ½µÚÈý¸öÖù×ÓÉϵĹý³ÌΪ£º" << endl; + Hanoi(n, a, b, c); + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.h b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.h new file mode 100644 index 0000000..a8a2692 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.10/3.10.h @@ -0,0 +1,20 @@ +#include +using namespace std; + +int m = 0;//£¨mÊdzõֵΪ0µÄÈ«¾Ö±äÁ¿£¬¶Ô°á¶¯¼ÆÊý£© +void move(char A, int n, char C) // °á¶¯²Ù×÷ +{ + cout << "µÚ" << ++m << "²½," << "½«±àºÅΪ" << n << "µÄÔ²ÅÌ´ÓµÚ" << A << "¸öÖù×ÓÉÏÒÆµ½µÚ" << C + << "¸öÖù×ÓÉÏ" << endl; +} + +//Ëã·¨3.10¡¡HanoiËþÎÊÌâµÄµÝ¹éËã·¨ +void Hanoi(int n, char A, char B, char C) {//½«Ëþ×ùAÉϵÄn¸öÔ²Å̰´¹æÔò°áµ½CÉÏ£¬B×ö¸¨ÖúËþ + if (n == 1) + move(A, 1, C); //½«±àºÅΪ1µÄÔ²ÅÌ´ÓAÒÆµ½C + else { + Hanoi(n - 1, A, C, B); //½«AÉϱàºÅΪ1ÖÁn-1µÄÔ²ÅÌÒÆµ½B£¬C×ö¸¨ÖúËþ + move(A, n, C);//½«±àºÅΪnµÄÔ²ÅÌ´ÓAÒÆµ½C + Hanoi(n - 1, B, A, C); //½«BÉϱàºÅΪ1ÖÁn-1µÄÔ²ÅÌÒÆµ½C£¬A×ö¸¨ÖúËþ + } +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/3.11-3.15.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/3.11-3.15.cpp new file mode 100644 index 0000000..572dc49 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/3.11-3.15.cpp @@ -0,0 +1,123 @@ +/***Ñ­»·¶ÓÁлù±¾²Ù×÷***/ + +#include +#include +using namespace std; + +#define MAXQSIZE 100 +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef char QElemType; +typedef char SElemType; +typedef int Status; + +typedef struct { + QElemType *base;//³õʼ»¯Ê±¶¯Ì¬·ÖÅä´æ´¢¿Õ¼ä + int front;//Í·Ö¸Õë + int rear;//βָÕë +} SqQueue; + +//Ëã·¨3.11¡¡Ñ­»·¶ÓÁеijõʼ»¯ +Status InitQueue(SqQueue &Q) {//¹¹ÔìÒ»¸ö¿Õ¶ÓÁÐQ + Q.base = new QElemType[MAXQSIZE]; //Ϊ¶ÓÁзÖÅäÒ»¸ö×î´óÈÝÁ¿ÎªMAXSIZEµÄÊý×é¿Õ¼ä + if (!Q.base) + exit(OVERFLOW); //´æ´¢·ÖÅäʧ°Ü + Q.front = Q.rear = 0; //Í·Ö¸ÕëºÍβָÕëÖÃΪÁ㣬¶ÓÁÐΪ¿Õ + return OK; +} + +//Ëã·¨3.12¡¡ÇóÑ­»·¶ÓÁеij¤¶È +int QueueLength(SqQueue Q) {//·µ»ØQµÄÔªËØ¸öÊý£¬¼´¶ÓÁеij¤¶È + return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; +} + +//Ëã·¨3.13¡¡Ñ­»·¶ÓÁеÄÈë¶Ó +Status EnQueue(SqQueue &Q, QElemType e) {//²åÈëÔªËØeΪQµÄеĶÓÎ²ÔªËØ + if ((Q.rear + 1) % MAXQSIZE == Q.front) //βָÕëÔÚÑ­»·ÒâÒåÉϼÓ1ºóµÈÓÚÍ·Ö¸Õ룬±íÃ÷¶ÓÂú + return ERROR; + Q.base[Q.rear] = e; //ÐÂÔªËØ²åÈë¶Óβ + Q.rear = (Q.rear + 1) % MAXQSIZE; //¶ÓβָÕë¼Ó1 + return OK; +} + +//Ëã·¨3.14¡¡Ñ­»·¶ÓÁеijö¶Ó +Status DeQueue(SqQueue &Q, QElemType &e) {//ɾ³ýQµÄ¶ÓÍ·ÔªËØ£¬ÓÃe·µ»ØÆäÖµ + if (Q.front == Q.rear) + return ERROR; //¶Ó¿Õ + e = Q.base[Q.front]; //±£´æ¶ÓÍ·ÔªËØ + Q.front = (Q.front + 1) % MAXQSIZE; //¶ÓÍ·Ö¸Õë¼Ó1 + return OK; +} + +//Ëã·¨3.15¡¡È¡Ñ­»·¶ÓÁеĶÓÍ·ÔªËØ +SElemType GetHead(SqQueue Q) {//·µ»ØQµÄ¶ÓÍ·ÔªËØ£¬²»Ð޸ĶÓÍ·Ö¸Õë + if (Q.front != Q.rear) //¶ÓÁÐ·Ç¿Õ + return Q.base[Q.front]; //·µ»Ø¶ÓÍ·ÔªËØµÄÖµ£¬¶ÓÍ·Ö¸Õë²»±ä +} + +int main() { + int choose, flag = 0; + SqQueue Q; + QElemType e, j; + cout << "1.³õʼ»¯\n"; + cout << "2.Èë¶Ó\n"; + cout << "3.¶Á¶ÓÍ·ÔªËØ\n"; + cout << "4.³ö¶Ó\n"; + cout << "0.Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1://Ëã·¨3.16¡¡Á´¶ÓµÄ³õʼ»¯ + if (InitQueue(Q)) { + flag = 1; + cout << "³É¹¦¶Ô¶ÓÁнøÐгõʼ»¯\n\n"; + } else + cout << "³õʼ»¯¶ÓÁÐʧ°Ü\n\n"; + break; + case 2: {//Ëã·¨3.17¡¡Á´¶ÓµÄÈë¶Ó + fstream file; + file.open("QNode.txt"); + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡\n\n" << endl; + exit(ERROR); + } + if (flag) { + flag = 1; + cout << "Èë¶ÓµÄÔªËØÒÀ´ÎΪ£º\n"; + while (!file.eof()) { + file >> j; + if (file.fail()) + break; + else { + EnQueue(Q, j); + cout << j << " "; + } + } + cout << endl << endl; + } else + cout << "¶ÓÁÐ佨Á¢£¬ÇëÖØÐÂÑ¡Ôñ\n\n"; + file.close(); + } + break; + case 3://Ëã·¨3.19¡¡È¡Á´¶ÓµÄ¶ÓÍ·ÔªËØ + if (flag != -1 && flag != 0) + cout << "¶ÓÍ·ÔªËØÎª£º\n" << GetHead(Q) << endl << endl; + else + cout << "¶ÓÁÐÖÐÎÞÔªËØ£¬ÇëÖØÐÂÑ¡Ôñ\n" << endl; + break; + case 4://Ëã·¨3.18¡¡Á´¶ÓµÄ³ö¶Ó + cout << "ÒÀ´Îµ¯³öµÄ¶ÓÍ·ÔªËØÎª:\n"; + while (DeQueue(Q, e)) { + flag = -1; + cout << e << " "; + } + cout << endl << endl; + break; + } + } + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/QNode.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/QNode.txt new file mode 100644 index 0000000..1f30c63 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.11-3.15/QNode.txt @@ -0,0 +1,4 @@ +A +B +C +D \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/3.16-3.19.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/3.16-3.19.cpp new file mode 100644 index 0000000..abb928f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/3.16-3.19.cpp @@ -0,0 +1,126 @@ +/***Á´¶ÓµÄ»ù±¾²Ù×÷***/ + +#include +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef char QElemType; +typedef int Status; +typedef char SElemType; + +//- - - - - ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹- - - - - +typedef struct QNode { + QElemType data; + struct QNode *next; +} QNode, *QueuePtr; +typedef struct { + QueuePtr front; //¶ÓÍ·Ö¸Õë + QueuePtr rear; //¶ÓβָÕë +} LinkQueue; + +//Ëã·¨3.16¡¡Á´¶ÓµÄ³õʼ»¯ +Status InitQueue(LinkQueue &Q) {//¹¹ÔìÒ»¸ö¿Õ¶ÓÁÐQ + Q.front = Q.rear = new QNode; //Éú³Éнáµã×÷Ϊͷ½áµã£¬¶ÓÍ·ºÍ¶ÓβָÕëÖ¸Ïò´Ë½áµã + Q.front->next = NULL; //Í·½áµãµÄÖ¸ÕëÓòÖÃ¿Õ + return OK; +} + +//Ëã·¨3.17¡¡Á´¶ÓµÄÈë¶Ó +Status EnQueue(LinkQueue &Q, QElemType e) {//²åÈëÔªËØeΪQµÄеĶÓÎ²ÔªËØ + QueuePtr p; + p = new QNode; //ΪÈë¶ÓÔªËØ·ÖÅä½áµã¿Õ¼ä£¬ÓÃÖ¸ÕëpÖ¸Ïò + p->data = e; //½«Ð½áµãÊý¾ÝÓòÖÃΪe + p->next = NULL; + Q.rear->next = p; //½«Ð½áµã²åÈëµ½¶Óβ + Q.rear = p; //Ð޸ĶÓβָÕë + return OK; +} + +//Ëã·¨3.18¡¡Á´¶ÓµÄ³ö¶Ó +Status DeQueue(LinkQueue &Q, QElemType &e) {//ɾ³ýQµÄ¶ÓÍ·ÔªËØ£¬ÓÃe·µ»ØÆäÖµ + QueuePtr p; + if (Q.front == Q.rear) + return ERROR; //Èô¶ÓÁпգ¬Ôò·µ»ØERROR + p = Q.front->next; //pÖ¸Ïò¶ÓÍ·ÔªËØ + e = p->data; //e±£´æ¶ÓÍ·ÔªËØµÄÖµ + Q.front->next = p->next; //ÐÞ¸ÄÍ·Ö¸Õë + if (Q.rear == p) + Q.rear = Q.front; //×îºóÒ»¸öÔªËØ±»É¾£¬¶ÓβָÕëÖ¸ÏòÍ·½áµã + delete p; //ÊÍ·ÅÔ­¶ÓÍ·ÔªËØµÄ¿Õ¼ä + return OK; +} + +//Ëã·¨3.19¡¡È¡Á´¶ÓµÄ¶ÓÍ·ÔªËØ +SElemType GetHead(LinkQueue Q) {//·µ»ØQµÄ¶ÓÍ·ÔªËØ£¬²»Ð޸ĶÓÍ·Ö¸Õë + if (Q.front != Q.rear) //¶ÓÁÐ·Ç¿Õ + return Q.front->next->data; //·µ»Ø¶ÓÍ·ÔªËØµÄÖµ£¬¶ÓÍ·Ö¸Õë²»±ä +} + +int main() { + int choose, flag = 0; + LinkQueue Q; + QElemType e, j; + cout << "1.³õʼ»¯\n"; + cout << "2.Èë¶Ó\n"; + cout << "3.¶Á¶ÓÍ·ÔªËØ\n"; + cout << "4.³ö¶Ó\n"; + cout << "0.Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1://Ëã·¨3.16¡¡Á´¶ÓµÄ³õʼ»¯ + if (InitQueue(Q)) { + flag = 1; + cout << "³É¹¦¶Ô¶ÓÁнøÐгõʼ»¯\n\n"; + } else + cout << "³õʼ»¯¶ÓÁÐʧ°Ü\n\n"; + break; + case 2: {//Ëã·¨3.17¡¡Á´¶ÓµÄÈë¶Ó + fstream file; + file.open("QNode.txt"); + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡\n\n" << endl; + exit(ERROR); + } + if (flag) { + flag = 1; + cout << "Èë¶ÓµÄÔªËØÒÀ´ÎΪ£º\n"; + while (!file.eof()) { + file >> j; + if (file.fail()) + break; + else { + EnQueue(Q, j); + cout << j << " "; + } + } + cout << endl << endl; + } else + cout << "¶ÓÁÐ佨Á¢£¬ÇëÖØÐÂÑ¡Ôñ\n\n"; + file.close(); + } + break; + case 3://Ëã·¨3.19¡¡È¡Á´¶ÓµÄ¶ÓÍ·ÔªËØ + if (flag != -1 && flag != 0) + cout << "¶ÓÍ·ÔªËØÎª£º\n" << GetHead(Q) << endl << endl; + else + cout << "¶ÓÁÐÖÐÎÞÔªËØ£¬ÇëÖØÐÂÑ¡Ôñ\n" << endl; + break; + case 4://Ëã·¨3.18¡¡Á´¶ÓµÄ³ö¶Ó + cout << "ÒÀ´Îµ¯³öµÄ¶ÓÍ·ÔªËØÎª:\n"; + while (DeQueue(Q, e)) { + flag = -1; + cout << e << " "; + } + cout << endl << endl; + break; + } + } + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/QNode.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/QNode.txt new file mode 100644 index 0000000..1f30c63 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.16-3.19/QNode.txt @@ -0,0 +1,4 @@ +A +B +C +D \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.20/3.20.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.20/3.20.cpp new file mode 100644 index 0000000..e89215f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.20/3.20.cpp @@ -0,0 +1,69 @@ +/***Á´Õ»ÊµÏÖÊýÖÆµÄת»»***/ + +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 + +typedef int Status; +typedef struct SNode { + int data; + struct SNode *next; +} SNode, *LinkStack; + +Status InitStack(LinkStack &S) { + S = NULL; + return OK; +} +bool StackEmpty(LinkStack S) { + if (!S) + return true; + return false; +} +Status Push(LinkStack &S, int e) { + LinkStack p; + p = new SNode; + if (!p) { + return OVERFLOW; + } + p->data = e; + p->next = S; + S = p; + return OK; +} +Status Pop(LinkStack &S, int &e) { + LinkStack p; + if (!S) + return ERROR; + e = S->data; + p = S; + S = S->next; + delete p; + return OK; +} +//Ëã·¨3.20¡¡ÊýÖÆµÄת»»(Á´Õ»ÊµÏÖ) +void conversion(int N) {//¶ÔÓÚÈÎÒâÒ»¸ö·Ç¸ºÊ®½øÖÆÊý£¬´òÓ¡Êä³öÓëÆäµÈÖµµÄ°Ë½øÖÆÊý + int e; + LinkStack S; + InitStack(S); //³õʼ»¯¿ÕÕ»S + while (N) //µ±N·ÇÁãʱ,Ñ­»· + { + Push(S, N % 8); //°ÑNÓë8ÇóÓàµÃµ½µÄ°Ë½øÖÆÊýѹÈëÕ»S + N = N / 8; //N¸üÐÂΪNÓë8µÄÉÌ + } + while (!StackEmpty(S)) //µ±Õ»S·Ç¿Õʱ£¬Ñ­»· + { + Pop(S, e); //µ¯³öÕ»¶¥ÔªËØe + cout << e; //Êä³öe + } +} +int main() {//¶ÔÓÚÊäÈëµÄÈÎÒâÒ»¸ö·Ç¸ºÊ®½øÖÆÊý£¬´òÓ¡Êä³öÓëÆäµÈÖµµÄ°Ë½øÖÆÊý + int n, e; + cout << "ÊäÈëÒ»¸ö·Ç¸ºÊ®½øÖÆÊý:" << endl; + cin >> n; + + conversion(n); + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.21/3.21.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.21/3.21.cpp new file mode 100644 index 0000000..abbc702 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.21/3.21.cpp @@ -0,0 +1,96 @@ +/***Á´Õ»ÊµÏÖÀ¨ºÅÆ¥Åä***/ + +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef char SElemType; +typedef int Status; +typedef struct SNode { + int data; + struct SNode *next; +} SNode, *LinkStack; + +Status InitStack(LinkStack &S) { + S = NULL; + return OK; +} +bool StackEmpty(LinkStack S) { + if (!S) + return true; + return false; +} +Status Push(LinkStack &S, SElemType e) { + SNode *p = new SNode; + if (!p) { + return OVERFLOW; + } + p->data = e; + p->next = S; + S = p; + return OK; +} +Status Pop(LinkStack &S, SElemType &e) { + SNode *p; + if (!S) + return ERROR; + e = S->data; + p = S; + S = S->next; + delete p; + return OK; +} +Status GetTop(LinkStack &S) { + if (!S) + return ERROR; + return S->data; +} + +//Ëã·¨3.21¡¡À¨ºÅµÄÆ¥Åä +Status Matching() {//¼ìÑé±í´ïʽÖÐËùº¬À¨ºÅÊÇ·ñÕýÈ·Æ¥Å䣬Èç¹ûÆ¥Å䣬Ôò·µ»Øtrue£¬·ñÔò·µ»Øfalse + //±í´ïʽÒÔ¡°#¡±½áÊø + char ch; + SElemType x; + LinkStack S; + InitStack(S); //³õʼ»¯¿ÕÕ» + int flag = 1; //±ê¼ÇÆ¥Åä½á¹ûÒÔ¿ØÖÆÑ­»·¼°·µ»Ø½á¹û + cin >> ch; //¶ÁÈëµÚÒ»¸ö×Ö·û + while (ch != '#' && flag) //¼ÙÉè±í´ïʽÒÔ¡°#¡±½áβ + { + switch (ch) { + case '[' : + case '(': //ÈôÊÇ×óÀ¨ºÅ£¬Ôò½«ÆäѹÈëÕ» + Push(S, ch); + break; + case ')': //ÈôÊÇ¡°)¡±£¬Ôò¸ù¾Ýµ±Ç°Õ»¶¥ÔªËصÄÖµ·ÖÇé¿ö¿¼ÂÇ + if (!StackEmpty(S) && GetTop(S) == '(') + Pop(S, x); //ÈôÕ»·Ç¿ÕÇÒÕ»¶¥ÔªËØÊÇ¡°(¡±£¬ÔòÕýÈ·Æ¥Åä + else + flag = 0; //ÈôÕ»¿Õ»òÕ»¶¥ÔªËز»ÊÇ¡°(¡±£¬Ôò´íÎóʧ°Ü + break; + case ']': //ÈôÊÇ¡°]¡±£¬Ôò¸ù¾Ýµ±Ç°Õ»¶¥ÔªËصÄÖµ·ÖÇé¿ö¿¼ÂÇ + if (!StackEmpty(S) && GetTop(S) == '[') + Pop(S, x); //ÈôÕ»·Ç¿ÕÇÒÕ»¶¥ÔªËØÊÇ¡°[¡±£¬ÔòÕýÈ·Æ¥Åä + else + flag = 0; //ÈôÕ»¿Õ»òÕ»¶¥ÔªËز»ÊÇ¡°[¡±£¬Ôò´íÎóÆ¥Åä + break; + } //switch + cin >> ch; //¼ÌÐø¶ÁÈëÏÂÒ»¸ö×Ö·û + } //while + if (StackEmpty(S) && flag) + return true; //Æ¥Åä³É¹¦ + else + return false; //Æ¥Åäʧ°Ü +} +int main() { + LinkStack S; + cout << "ÇëÊäÈë´ýÆ¥ÅäµÄ±í´ïʽ£¬ÒÔ¡°#¡±½áÊø£º" << endl; + int flag = (int) Matching(); + if (flag) + cout << "À¨ºÅÆ¥Åä³É¹¦£¡" << endl; + else + cout << "À¨ºÅÆ¥Åäʧ°Ü£¡" << endl; + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.cpp new file mode 100644 index 0000000..7f1635b --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.cpp @@ -0,0 +1,29 @@ +#include"3.22.h" + +int menu() { + int c; + cout << "0-9ÒÔÄڵĶàÏîʽ¼ÆËã" << endl; + cout << "1.¼ÆËã" << endl; + cout << "0.Í˳ö\n" << endl; + cout << "Ñ¡Ôñ£º"; + cin >> c; + return c; +} + +void main() { + while (1) { + switch (menu()) { + case 1: { + cout << "ÇëÊäÈëÒª¼ÆËãµÄ±í´ïʽ£¨²Ù×÷ÊýºÍ½á¹û¶¼ÔÚ0-9µÄ·¶Î§ÄÚ£¬ÒÔ#½áÊø£©£º" << endl; + char res = EvaluateExpression();//Ëã·¨3.22¡¡±í´ïʽÇóÖµ + cout << "¼ÆËã½á¹ûΪ" << res - 48 << endl << endl; + } + break; + case 0: + cout << "Í˳ö³É¹¦\n" << endl; + exit(0); + default: + break; + } + } +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.h b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.h new file mode 100644 index 0000000..d21e0f4 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.22/3.22.h @@ -0,0 +1,117 @@ +/***Á´Õ»ÊµÏÖ±í´ïʽÇóÖµ***/ + +#include +using namespace std; + +const char oper[7] = { '+', '-', '*', '/', '(', ')', '#' }; +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef char SElemType; +typedef int Status; +typedef struct SNode { + int data; + struct SNode *next; +} SNode, *LinkStack; + +Status InitStack(LinkStack &S) { + S = NULL; + return OK; +} +bool StackEmpty(LinkStack S) { + if (!S) + return true; + return false; +} +Status Push(LinkStack &S, SElemType e) { + SNode *p = new SNode; + if (!p) { + return OVERFLOW; + } + p->data = e; + p->next = S; + S = p; + return OK; +} +Status Pop(LinkStack &S, SElemType &e) { + SNode *p; + if (!S) + return ERROR; + e = S->data; + p = S; + S = S->next; + delete p; + return OK; +} +Status GetTop(LinkStack &S) { + if (!S) + return ERROR; + + return S->data; +} +bool In(char ch) {//ÅжÏchÊÇ·ñΪÔËËã·û + for (int i = 0; i < 7; i++) { + if (ch == oper[i]) { + return true; + } + } + return false; +} +char Precede(char theta1, char theta2) {//ÅжÏÔËËã·ûÓÅÏȼ¶ + if ((theta1 == '(' && theta2 == ')') || (theta1 == '#' && theta2 == '#')) { + return '='; + } else if (theta1 == '(' || theta1 == '#' || theta2 == '(' || (theta1 + == '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) { + return '<'; + } else + return '>'; +} +char Operate(char first, char theta, char second) {//¼ÆËãÁ½ÊýÔËËã½á¹û + switch (theta) { + case '+': + return (first - '0') + (second - '0') + 48; + case '-': + return (first - '0') - (second - '0') + 48; + case '*': + return (first - '0') * (second - '0') + 48; + case '/': + return (first - '0') / (second - '0') + 48; + } + return 0; +} + +//Ëã·¨3.22¡¡±í´ïʽÇóÖµ +char EvaluateExpression() {//ËãÊõ±í´ïʽÇóÖµµÄËã·ûÓÅÏÈËã·¨£¬ÉèOPTRºÍOPND·Ö±ðΪÔËËã·ûÕ»ºÍ²Ù×÷ÊýÕ» + LinkStack OPTR, OPND; + char ch, theta, a, b, x, top; + InitStack(OPND); //³õʼ»¯OPNDÕ» + InitStack(OPTR); //³õʼ»¯OPTRÕ» + Push(OPTR, '#'); //½«±í´ïʽÆðʼ·û¡°#¡±Ñ¹ÈëOPTRÕ» + cin >> ch; + while (ch != '#' || (GetTop(OPTR) != '#')) //±í´ïʽûÓÐɨÃèÍê±Ï»òOPTRµÄÕ»¶¥ÔªËز»Îª¡°#¡± + { + if (!In(ch)) { + Push(OPND, ch); + cin >> ch; + } //ch²»ÊÇÔËËã·ûÔò½øOPNDÕ» + else + switch (Precede(GetTop(OPTR), ch)) //±È½ÏOPTRµÄÕ»¶¥ÔªËغÍchµÄÓÅÏȼ¶ + { + case '<': + Push(OPTR, ch); + cin >> ch; //µ±Ç°×Ö·ûchѹÈëOPTRÕ»£¬¶ÁÈëÏÂÒ»×Ö·ûch + break; + case '>': + Pop(OPTR, theta); //µ¯³öOPTRÕ»¶¥µÄÔËËã·û + Pop(OPND, b); + Pop(OPND, a); //µ¯³öOPNDÕ»¶¥µÄÁ½¸öÔËËãÊý + Push(OPND, Operate(a, theta, b)); //½«ÔËËã½á¹ûѹÈëOPNDÕ» + break; + case '=': //OPTRµÄÕ»¶¥ÔªËØÊÇ¡°(¡±ÇÒchÊÇ¡°)¡± + Pop(OPTR, x); + cin >> ch; //µ¯³öOPTRÕ»¶¥µÄ¡°(¡±£¬¶ÁÈëÏÂÒ»×Ö·ûch + break; + } //switch + } //while + return GetTop(OPND); //OPNDÕ»¶¥ÔªËؼ´Îª±í´ïʽÇóÖµ½á¹û +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.cpp new file mode 100644 index 0000000..b7edff7 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.cpp @@ -0,0 +1,18 @@ +#include"3.23.h" + +Person dancer[MAXQSIZE]; +int main() { + int i = 0; + fstream file; + file.open("DancePartner.txt"); + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡\n\n" << endl; + exit( ERROR); + } + while (!file.eof()) { + file >> dancer[i].name >> dancer[i].sex; + i++; + } + DancePartner(dancer, i + 1); + return 0; +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.h b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.h new file mode 100644 index 0000000..fb2721d --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/3.23.h @@ -0,0 +1,89 @@ +#include +#include +#include +#define MAXQSIZE 100//¶ÓÁпÉÄÜ´ïµ½µÄ×î´ó³¤¶È +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +using namespace std; + +typedef struct { + char name[20]; //ÐÕÃû + char sex; //ÐÔ±ð£¬'F'±íʾŮÐÔ£¬'M'±íʾÄÐÐÔ +} Person; + +//- - - - - ¶ÓÁеÄ˳Ðò´æ´¢½á¹¹- - - - - +typedef struct { + Person *base; //¶ÓÁÐÖÐÊý¾ÝÔªËØÀàÐÍΪPerson + int front; //Í·Ö¸Õë + int rear; //βָÕë +} SqQueue; + +SqQueue Mdancers, Fdancers; //·Ö±ð´æ·ÅÄÐÊ¿ºÍŮʿÈë¶ÓÕß¶ÓÁÐ + +int InitQueue(SqQueue &Q) {//¹¹ÔìÒ»¸ö¿Õ¶ÓÁÐQ + Q.base = new Person[MAXQSIZE]; //Ϊ¶ÓÁзÖÅäÒ»¸ö×î´óÈÝÁ¿ÎªMAXSIZEµÄÊý×é¿Õ¼ä + if (!Q.base) + exit( OVERFLOW); //´æ´¢·ÖÅäʧ°Ü + Q.front = Q.rear = 0; //Í·Ö¸ÕëºÍβָÕëÖÃΪÁ㣬¶ÓÁÐΪ¿Õ + return OK; +} + +int EnQueue(SqQueue &Q, Person e) {//²åÈëÔªËØeΪQµÄеĶÓÎ²ÔªËØ + if ((Q.rear + 1) % MAXQSIZE == Q.front) //βָÕëÔÚÑ­»·ÒâÒåÉϼÓ1ºóµÈÓÚÍ·Ö¸Õ룬±íÃ÷¶ÓÂú + return ERROR; + Q.base[Q.rear] = e; //ÐÂÔªËØ²åÈë¶Óβ + Q.rear = (Q.rear + 1) % MAXQSIZE; //¶ÓβָÕë¼Ó1 + return OK; +} + +int QueueEmpty(SqQueue &Q) { + if (Q.front == Q.rear) //¶Ó¿Õ + return OK; + else + return ERROR; +} + +int DeQueue(SqQueue &Q, Person &e)//ɾ³ýQµÄ¶ÓÍ·ÔªËØ£¬ÓÃe·µ»ØÆäÖµ +{ + if (Q.front == Q.rear) + return ERROR; //¶Ó¿Õ + e = Q.base[Q.front]; //±£´æ¶ÓÍ·ÔªËØ + Q.front = (Q.front + 1) % MAXQSIZE; //¶ÓÍ·Ö¸Õë¼Ó1 + return OK; +} + +Person GetHead(SqQueue Q) {//·µ»ØQµÄ¶ÓÍ·ÔªËØ£¬²»Ð޸ĶÓÍ·Ö¸Õë + if (Q.front != Q.rear) //¶ÓÁÐ·Ç¿Õ + return Q.base[Q.front]; //·µ»Ø¶ÓÍ·ÔªËØµÄÖµ£¬¶ÓÍ·Ö¸Õë²»±ä +} + +//Ëã·¨3.23¡¡Îè°éÎÊÌâ +void DancePartner(Person dancer[], int num) {//½á¹¹Êý×édancerÖдæ·ÅÌøÎèµÄÄÐÅ®£¬numÊÇÌøÎèµÄÈËÊý¡£ + InitQueue(Mdancers); //ÄÐÊ¿¶ÓÁгõʼ»¯ + InitQueue(Fdancers); //Ůʿ¶ÓÁгõʼ»¯ + Person p; + for (int i = 0; i < num; i++) //ÒÀ´Î½«ÌøÎèÕ߸ù¾ÝÆäÐÔ±ðÈë¶Ó + { + p = dancer[i]; + if (p.sex == 'F') + EnQueue(Fdancers, p); //²åÈëÅ®¶Ó + else + EnQueue(Mdancers, p); //²åÈëÄÐ¶Ó + } + cout << "The dancing partners are:" << endl; + while (!QueueEmpty(Fdancers) && !QueueEmpty(Mdancers)) {//ÒÀ´ÎÊä³öÄÐÅ®Îè°éµÄÐÕÃû + DeQueue(Fdancers, p); //Ůʿ³ö¶Ó + cout << p.name << " "; //Êä³ö³ö¶ÓŮʿÐÕÃû + DeQueue(Mdancers, p); //ÄÐÊ¿³ö¶Ó + cout << p.name << endl; //Êä³ö³ö¶ÓÄÐÊ¿ÐÕÃû + } + if (!QueueEmpty(Fdancers)) { //Ůʿ¶ÓÁзǿգ¬Êä³ö¶ÓͷŮʿµÄÐÕÃû + p = GetHead(Fdancers); //ȡŮʿ¶ÓÍ· + cout << "The first man to get a partner is: " << endl; + cout << p.name << endl; + } else if (!QueueEmpty(Mdancers)) { //ÄÐÊ¿¶ÓÁзǿգ¬Êä³ö¶ÓÍ·ÄÐÊ¿µÄÐÕÃû + p = GetHead(Mdancers); //È¡ÄÐÊ¿¶ÓÍ· + cout << "The first woman to get a partner is: " << p.name << endl; + } +} \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/DancePartner.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/DancePartner.txt new file mode 100644 index 0000000..2f9b4ec --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.23/DancePartner.txt @@ -0,0 +1,18 @@ +۳ѩÀâ F +¸ßÐÀÑÅ F +ÕÅÌðÔ´ F +Ðíµ¤µ¤ F +ȽСϪ F +ÖÜÈçÒâ F +ºú˼ç÷ F +½¯ÑÅç÷ F +½ð³ÇÎä M +ÎâÑå׿ M +Íõ˼´Ï M +¹ÅÌìÀÖ M +ÖܽÜÂ× M +ÀîÃôºÆ M +ÀîÖÓ˶ M +ÂíÐ¡ÔÆ M +ÕÅÖÇÁØ M +ÍõÁ¦ºê M \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/3.5-3.8.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/3.5-3.8.cpp new file mode 100644 index 0000000..4eef629 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/3.5-3.8.cpp @@ -0,0 +1,115 @@ +/***Á´Õ»µÄʵÏÖ***/ +#include +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; +typedef char SElemType; + +typedef struct StackNode { + SElemType data; + struct StackNode *next; +} StackNode, *LinkStack; + +//Ëã·¨3.5¡¡Á´Õ»µÄ³õʼ»¯ +Status InitStack(LinkStack &S) { // ¹¹ÔìÒ»¸ö¿ÕÕ» S£¬Õ»¶¥Ö¸ÕëÖÃ¿Õ + S = NULL; + return OK; +} + +//Ëã·¨3.6¡¡Á´Õ»µÄÈëÕ» +Status Push(LinkStack &S, SElemType e) {//ÔÚÕ»¶¥²åÈëÔªËØe + LinkStack p; + p = new StackNode; //Éú³Éнáµã + p->data = e; //½«Ð½áµãÊý¾ÝÓòÖÃΪe + p->next = S; //½«Ð½áµã²åÈëÕ»¶¥ + S = p; //ÐÞ¸ÄÕ»¶¥Ö¸ÕëΪp + return OK; +} + +//Ëã·¨3.7¡¡Á´Õ»µÄ³öÕ» +Status Pop(LinkStack &S, SElemType &e) {//ɾ³ýSµÄÕ»¶¥ÔªËØ£¬ÓÃe·µ»ØÆäÖµ + LinkStack p; + if (S == NULL) + return ERROR; //Õ»¿Õ + e = S->data; //½«Õ»¶¥ÔªËظ³¸øe + p = S; //ÓÃpÁÙʱ±£´æÕ»¶¥ÔªËؿռ䣬ÒÔ±¸ÊÍ·Å + S = S->next; //ÐÞ¸ÄÕ»¶¥Ö¸Õë + delete p; //ÊÍ·ÅÔ­Õ»¶¥ÔªËصĿռä + return OK; +} +//Ëã·¨3.8¡¡È¡Á´Õ»µÄÕ»¶¥ÔªËØ +SElemType GetTop(LinkStack S) {//·µ»ØSµÄÕ»¶¥ÔªËØ£¬²»ÐÞ¸ÄÕ»¶¥Ö¸Õë + if (S != NULL) //Õ»·Ç¿Õ + return S->data; //·µ»ØÕ»¶¥ÔªËصÄÖµ£¬Õ»¶¥Ö¸Õë²»±ä +} + +int main() { + LinkStack s; + int choose, flag = 0; + SElemType j, t; + cout << "1.³õʼ»¯\n"; + cout << "2.ÈëÕ»\n"; + cout << "3.¶ÁÕ»¶¥ÔªËØ\n"; + cout << "4.³öÕ»\n"; + cout << "0.Í˳ö\n\n"; + + choose = -1; + while (choose != 0) { + cout << "ÇëÑ¡Ôñ:"; + cin >> choose; + switch (choose) { + case 1://Ëã·¨3.5¡¡Á´Õ»µÄ³õʼ»¯ + if (InitStack(s)) { + flag = 1; + cout << "³É¹¦¶ÔÕ»½øÐгõʼ»¯\n\n"; + } else + cout << "³õʼ»¯Õ»Ê§°Ü\n\n"; + break; + case 2: {//Ëã·¨3.6¡¡Á´Õ»µÄÈëÕ» + fstream file; + file.open("SqStack.txt"); + if (!file) { + cout << "´íÎó£¡Î´ÕÒµ½Îļþ£¡\n\n" << endl; + exit(ERROR); + } + if (flag) { + flag = 1; + cout << "½øÕ»ÔªËØÒÀ´ÎΪ£º\n"; + while (!file.eof()) { + file >> j; + if (file.fail()) + break; + else { + Push(s, j); + cout << j << " "; + } + } + cout << endl << endl; + } else + cout << "ջ佨Á¢£¬ÇëÖØÐÂÑ¡Ôñ\n\n"; + file.close(); + } + break; + case 3://Ëã·¨3.8¡¡È¡Á´Õ»µÄÕ»¶¥ÔªËØ + if (flag != -1 && flag != 0) + cout << "Õ»¶¥ÔªËØÎª£º\n" << GetTop(s) << endl << endl; + else + cout << "Õ»ÖÐÎÞÔªËØ£¬ÇëÖØÐÂÑ¡Ôñ\n" << endl; + break; + case 4://Ëã·¨3.7¡¡Á´Õ»µÄ³öÕ» + if (flag) { + cout << "ÒÀ´Îµ¯³öµÄÕ»¶¥ÔªËØÎª:\n"; + while (Pop(s, t)) + cout << t << " "; + cout << endl << endl; + } else + cout << "ջ佨Á¢£¬ÇëÖØÐÂÑ¡Ôñ\n\n"; + break; + } + } + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/SqStack.txt b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/SqStack.txt new file mode 100644 index 0000000..1f30c63 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.5-3.8/SqStack.txt @@ -0,0 +1,4 @@ +A +B +C +D \ No newline at end of file diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.9/3.9.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.9/3.9.cpp new file mode 100644 index 0000000..9dad058 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第3ç« /3.9/3.9.cpp @@ -0,0 +1,53 @@ +/***ÒÀ´ÎÊä³öÁ´±íÖеĸ÷¸ö½áµã***/ + +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; +typedef char ElemType; +typedef struct LNode { + ElemType data; //½áµãµÄÊý¾ÝÓò + LNode *next; //½áµãµÄÖ¸ÕëÓò +} LNode, *LinkList;//Í·Ö¸Õë + +//ºó²å·¨´´½¨Á´±íËã·¨ +void CreateList_L(LinkList &L, int n) { + L = new LNode; + L->next = NULL; + LNode *p, *r; + r = L; + for (int i = 0; i < n; i++) { + p = new LNode; + cin >> p->data; + p->next = NULL; + r->next = p; + r = p; + } +} + +//Ëã·¨3.9¡¡±éÀúÊä³öÁ´±íÖи÷¸ö½áµãµÄµÝ¹éËã·¨ +void TraverseList(LinkList p) { + if (p == NULL) + return; //µÝ¹éÖÕÖ¹ + else { + cout << p->data << endl; //Êä³öµ±Ç°½áµãµÄÊý¾ÝÓò + TraverseList(p->next); //pÖ¸Ïòºó¼ÌÖ¸µã¼ÌÐøµÝ¹é + } +} + +int main() { + int n; + LinkList L; + //InitList(L); + cout << "ÇëÊäÈëÔªËØ¸öÊý£º" << endl; + cin >> n; + cout << "ÇëÊäÈëÁ´±íÔªËØ(ÒÔ¿Õ¸ñ¸ô¿ª£¬°´»Ø³µ½áÊø)£º" << endl; + CreateList_L(L, n); //ºó²å·¨´´½¨Á´±íËã·¨ + cout << "Á´±íÖеÄÔªËØÒÀ´ÎΪ£º" << endl; + TraverseList(L->next); + cout << endl; + return 0; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第4ç« /4.1.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第4ç« /4.1.cpp new file mode 100644 index 0000000..330d34b --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第4ç« /4.1.cpp @@ -0,0 +1,60 @@ +/***×Ö·û´®Æ¥ÅäËã·¨***/ +#include +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; +#define MAXSTRLEN 255 //Óû§¿ÉÔÚ255ÒÔÄÚ¶¨Òå×´®³¤ +typedef char SString[MAXSTRLEN+1]; //0ºÅµ¥Ôª´æ·Å´®µÄ³¤¶È + +Status StrAssign(SString T, char *chars) { //Éú³ÉÒ»¸öÆäÖµµÈÓÚcharsµÄ´®T + int i; + if (strlen(chars) > MAXSTRLEN) + return ERROR; + else { + T[0] = strlen(chars); + for (i = 1; i <= T[0]; i++) + T[i] = *(chars + i - 1); + return OK; + } +} + +//Ëã·¨4.1¡¡BFËã·¨ +int Index(SString S, SString T, int pos) +{ + //·µ»ØÄ£Ê½TÔÚÖ÷´®SÖеÚpos¸ö×Ö·ûÖ®ºóµÚsÒ»´Î³öÏÖµÄλÖá£Èô²»´æÔÚ£¬Ôò·µ»ØÖµÎª0 + //ÆäÖУ¬T·Ç¿Õ£¬1¡Üpos¡ÜStrLength(S) + int i = pos; + int j = 1; + while(i <= S[0]&&j <= T[0]) + { + if(S[i]==T[j]) + { + ++i; + ++j; + } //¼ÌÐø±È½Ïºó¼Ì×Ö·û + else + { + i=i-j+2; + j=1; + } //Ö¸ÕëºóÍËÖØÐ¿ªÊ¼Æ¥Åä + } + if (j > T[0]) + return i - T[0]; + else + return 0; + return 0; +}//Index + +int main() +{ + SString S; + StrAssign(S,"bbaaabbaba") ; + SString T; + StrAssign(T,"abb") ; + cout<<"Ö÷´®ºÍ×Ó´®ÔÚµÚ"< +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; +#define MAXSTRLEN 255 //Óû§¿ÉÔÚ255ÒÔÄÚ¶¨Òå×´®³¤ +typedef char SString[MAXSTRLEN+1]; //0ºÅµ¥Ôª´æ·Å´®µÄ³¤¶È + +Status StrAssign(SString T, char *chars) { //Éú³ÉÒ»¸öÆäÖµµÈÓÚcharsµÄ´®T + int i; + if (strlen(chars) > MAXSTRLEN) + return ERROR; + else { + T[0] = strlen(chars); + for (i = 1; i <= T[0]; i++) + T[i] = *(chars + i - 1); + return OK; + } +} +//Ëã·¨4.3¡¡¼ÆËãnextº¯ÊýÖµ +void get_next(SString T, int next[]) +{ //Çóģʽ´®TµÄnextº¯ÊýÖµ²¢´æÈëÊý×énext + int i = 1, j = 0; + next[1] = 0; + while (i < T[0]) + if (j == 0 || T[i] == T[j]) + { + ++i; + ++j; + next[i] = j; + } + else + j = next[j]; +}//get_next + +//Ëã·¨4.2¡¡KMPËã·¨ +int Index_KMP(SString S, SString T, int pos, int next[]) +{ // ÀûÓÃģʽ´®TµÄnextº¯ÊýÇóTÔÚÖ÷´®SÖеÚpos¸ö×Ö·ûÖ®ºóµÄλÖõÄKMPËã·¨ + //ÆäÖУ¬T·Ç¿Õ£¬1¡Üpos¡ÜStrLength(S) + int i = pos, j = 1; + while (i <= S[0] && j <= T[0]) + if (j == 0 || S[i] == T[j]) // ¼ÌÐø±È½Ïºó¼Ì×Ö + { + ++i; + ++j; + } + else + j = next[j]; // ģʽ´®ÏòÓÒÒÆ¶¯ + if (j > T[0]) // Æ¥Åä³É¹¦ + return i - T[0]; + else + return 0; +}//Index_KMP + +int main() +{ + SString S; + StrAssign(S,"aaabbaba") ; + SString T; + StrAssign(T,"abb") ; + int *p = new int[T[0]+1]; // Éú³ÉTµÄnextÊý×é + get_next(T,p); + cout<<"Ö÷´®ºÍ×Ó´®ÔÚµÚ"< +#include +using namespace std; + +#define OK 1 +#define ERROR 0 +#define OVERFLOW -2 +typedef int Status; +#define MAXSTRLEN 255 //Óû§¿ÉÔÚ255ÒÔÄÚ¶¨Òå×´®³¤ +typedef char SString[MAXSTRLEN+1]; //0ºÅµ¥Ôª´æ·Å´®µÄ³¤¶È + +Status StrAssign(SString T, char *chars) { //Éú³ÉÒ»¸öÆäÖµµÈÓÚcharsµÄ´®T + int i; + if (strlen(chars) > MAXSTRLEN) + return ERROR; + else { + T[0] = strlen(chars); + for (i = 1; i <= T[0]; i++) + T[i] = *(chars + i - 1); + return OK; + } +} + +//Ëã·¨4.4¡¡¼ÆËãnextº¯ÊýÐÞÕýÖµ +void get_nextval(SString T, int nextval[]) +{ // Çóģʽ´®TµÄnextº¯ÊýÐÞÕýÖµ²¢´æÈëÊý×énextval + int i = 1, j = 0; + nextval[1] = 0; + while (i < T[0]) + if (j == 0 || T[i] == T[j]) + { + ++i; + ++j; + if (T[i] != T[j]) + nextval[i] = j; + else + nextval[i] = nextval[j]; + } else + j = nextval[j]; +}//get_nextval + +//Ëã·¨4.2¡¡KMPËã·¨ +int Index_KMP(SString S, SString T, int pos, int next[]) +{ // ÀûÓÃģʽ´®TµÄnextº¯ÊýÇóTÔÚÖ÷´®SÖеÚpos¸ö×Ö·ûÖ®ºóµÄλÖõÄKMPËã·¨ + //ÆäÖУ¬T·Ç¿Õ£¬1¡Üpos¡ÜStrLength(S) + int i = pos, j = 1; + while (i <= S[0] && j <= T[0]) + if (j == 0 || S[i] == T[j]) // ¼ÌÐø±È½Ïºó¼Ì×Ö + { + ++i; + ++j; + } + else + j = next[j]; // ģʽ´®ÏòÓÒÒÆ¶¯ + if (j > T[0]) // Æ¥Åä³É¹¦ + return i - T[0]; + else + return 0; +}//Index_KMP + +int main() +{ + SString S; + StrAssign(S,"babaaaabbaba") ; + SString T; + StrAssign(T,"abb") ; + int *p = new int[T[0]+1]; // Éú³ÉTµÄnextÊý×é + get_nextval(T,p); + cout<<"Ö÷´®ºÍ×Ó´®ÔÚµÚ"< +#include +#include +using namespace std; + +typedef struct{ + char ch[600]; //ÈôÊǷǿմ®£¬Ôò°´´®³¤·ÖÅä´æ´¢Çø£¬·ñÔòchΪNULL + int len; //´®³¤¶È +}HString; + + +int Index_BF(HString S,HString T,int pos) +{//·µ»ØÄ£Ê½TÔÚÖ÷´®SÖеÚpos¸ö×Ö·û¿ªÊ¼µÚÒ»´Î³öÏÖµÄλÖá£Èô²»´æÔÚ£¬Ôò·µ»ØÖµÎª0 + //ÆäÖУ¬T·Ç¿Õ£¬1¡Üpos¡ÜStrLength(S) + int i,j; + i=pos; j=1; + while(i<=S.len&&j<=T.len) + { + if(S.ch[i]==T.ch[j]){++i;++j;} //¼ÌÐø±È½Ïºó¼Ì×Ö·û + else{i=i-j+2;j=1;} //Ö¸ÕëºóÍËÖØÐ¿ªÊ¼Æ¥Åä + } + if(j>T.len) return i-T.len; + else return 0; +} + +void Virus_detection() +{ + int num,m,flag,i,j; char Vir[600]; + HString Virus,Person,temp; + ifstream inFile("²¡¶¾¸ÐȾ¼ì²âÊäÈëÊý¾Ý.txt"); + ofstream outFile("²¡¶¾¸ÐȾ¼ì²âÊä³ö½á¹û.txt"); + inFile>>num;//¶ÁÈ¡´ý¼ì²âµÄÈÎÎñÊý + while(num--) //ÒÀ´Î¼ì²âÿ¶Ô²¡¶¾DNAºÍÈ˵ÄDNAÊÇ·ñÆ¥Åä + { + inFile>>Virus.ch+1;//¶ÁÈ¡²¡¶¾DNAÐòÁÐ + inFile>>Person.ch+1;//¶ÁÈ¡È˵ÄDNAÐòÁÐ + strcpy(Vir,Virus.ch); + Virus.len=strlen(Virus.ch)-1; + Person.len=strlen(Person.ch)-1; + flag=0;//ÓÃÀ´±êʶÊÇ·ñÆ¥Å䣬³õʼΪ0£¬Æ¥ÅäºóΪ·Ç0 + m=Virus.len; + for(i=m+1,j=1;j<=m;j++) Virus.ch[i++]=Virus.ch[j]; + //Òò²¡¶¾Îª»·×´£¬¹Ê½«²¡¶¾µÄ³¤¶ÈÀ©´ó2±¶ + //¼´¿ÉÏßÐÔÈ¡µ½ËùÓ㤶ÈΪVirus.lenµÄ×Ö·û´® + Virus.ch[2*m+1]='\0'; //Ìí¼Ó½áÊø·ûºÅ + for(i=0;i +using namespace std; +typedef struct BiNode{ //¶þ²æÁ´±í¶¨Òå + char data; + struct BiNode *lchild,*rchild; +}BiTNode,*BiTree; + +//ÓÃËã·¨5.3 ÏÈÐò±éÀúµÄ˳Ðò½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiTree &T){ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +void InOrderTraverse(BiTree T){ + //ÖÐÐò±éÀú¶þ²æÊ÷TµÄµÝ¹éËã·¨ + if(T){ + InOrderTraverse(T->lchild); + cout << T->data; + InOrderTraverse(T->rchild); + } +} + +void main(){ + BiTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + cout<<"ÖÐÐò±éÀúµÄ½á¹ûΪ£º\n"; + InOrderTraverse(tree); + cout< +using namespace std; +typedef struct +{ + int weight; + int parent,lchild,rchild; +}HTNode,*HuffmanTree; + +void Select(HuffmanTree HT,int len,int &s1,int &s2) +{ + int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f;//Ïȸ³Óè×î´óÖµ + for(i=1;i<=len;i++) + { + if(HT[i].weight>HT[i].weight; + /*¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D³õʼ»¯¹¤×÷½áÊø£¬ÏÂÃæ¿ªÊ¼´´½¨ºÕ·òÂüÊ÷¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D*/ + for(i=n+1;i<=m;++i) + { //ͨ¹ýn-1´ÎµÄÑ¡Ôñ¡¢É¾³ý¡¢ºÏ²¢À´´´½¨ºÕ·òÂüÊ÷ + Select(HT,i-1,s1,s2); + //ÔÚHT[k](1¡Ük¡Üi-1)ÖÐÑ¡ÔñÁ½¸öÆäË«Ç×ÓòΪ0ÇÒȨֵ×îСµÄ½áµã, + // ²¢·µ»ØËüÃÇÔÚHTÖеÄÐòºÅs1ºÍs2 + HT[s1].parent=i; + HT[s2].parent=i; + //µÃµ½Ð½áµãi£¬´ÓÉ­ÁÖÖÐɾ³ýs1£¬s2£¬½«s1ºÍs2µÄË«Ç×ÓòÓÉ0¸ÄΪi + HT[i].lchild=s1; + HT[i].rchild=s2 ; //s1,s2·Ö±ð×÷ΪiµÄ×óÓÒº¢×Ó + HT[i].weight=HT[s1].weight+HT[s2].weight; //i µÄȨֵΪ×óÓÒº¢×ÓȨֵ֮ºÍ + } //for + } // CreatHuffmanTree + +void main() +{ + HuffmanTree HT; + int n; + cout<<"ÇëÊäÈëÒ¶×Ó½áµãµÄ¸öÊý£º\n"; + cin>>n; + CreatHuffmanTree(HT,n); + cout<<"¹þ·òÂüÊ÷½¨Á¢Íê±Ï£¡\n"; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.11.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.11.cpp new file mode 100644 index 0000000..e48a92f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.11.cpp @@ -0,0 +1,105 @@ +//Ëã·¨5.11 ¸ù¾ÝºÕ·òÂüÊ÷ÇóºÕ·òÂü±àÂë +#include +using namespace std; +typedef struct +{ + int weight; + int parent,lchild,rchild; +}HTNode,*HuffmanTree; +typedef char **HuffmanCode; + +void Select(HuffmanTree HT,int len,int &s1,int &s2) +{ + int i,min1=0x3f3f3f3f,min2=0x3f3f3f3f;//Ïȸ³Óè×î´óÖµ + for(i=1;i<=len;i++) + { + if(HT[i].weight>HT[i].weight; + /*¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D³õʼ»¯¹¤×÷½áÊø£¬ÏÂÃæ¿ªÊ¼´´½¨ºÕ·òÂüÊ÷¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D*/ + for(i=n+1;i<=m;++i) + { //ͨ¹ýn-1´ÎµÄÑ¡Ôñ¡¢É¾³ý¡¢ºÏ²¢À´´´½¨ºÕ·òÂüÊ÷ + Select(HT,i-1,s1,s2); + //ÔÚHT[k](1¡Ük¡Üi-1)ÖÐÑ¡ÔñÁ½¸öÆäË«Ç×ÓòΪ0ÇÒȨֵ×îСµÄ½áµã, + // ²¢·µ»ØËüÃÇÔÚHTÖеÄÐòºÅs1ºÍs2 + HT[s1].parent=i; + HT[s2].parent=i; + //µÃµ½Ð½áµãi£¬´ÓÉ­ÁÖÖÐɾ³ýs1£¬s2£¬½«s1ºÍs2µÄË«Ç×ÓòÓÉ0¸ÄΪi + HT[i].lchild=s1; + HT[i].rchild=s2 ; //s1,s2·Ö±ð×÷ΪiµÄ×óÓÒº¢×Ó + HT[i].weight=HT[s1].weight+HT[s2].weight; //i µÄȨֵΪ×óÓÒº¢×ÓȨֵ֮ºÍ + } //for +} + // CreatHuffmanTree +void CreatHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n) +{ + //´ÓÒ¶×Óµ½¸ùÄæÏòÇóÿ¸ö×Ö·ûµÄºÕ·òÂü±àÂ룬´æ´¢ÔÚ±àÂë±íHCÖÐ + int i,start,c,f; + HC=new char*[n+1]; //·ÖÅän¸ö×Ö·û±àÂëµÄÍ·Ö¸ÕëʸÁ¿ + char *cd=new char[n]; //·ÖÅäÁÙʱ´æ·Å±àÂëµÄ¶¯Ì¬Êý×é¿Õ¼ä + cd[n-1]='\0'; //±àÂë½áÊø·û + for(i=1;i<=n;++i) + { //Öð¸ö×Ö·ûÇóºÕ·òÂü±àÂë + start=n-1; //start¿ªÊ¼Ê±Ö¸Ïò×îºó£¬¼´±àÂë½áÊø·ûλÖà + c=i; + f=HT[i].parent; //fÖ¸Ïò½áµãcµÄË«Ç×½áµã + while(f!=0) + { //´ÓÒ¶×Ó½áµã¿ªÊ¼ÏòÉÏ»ØËÝ£¬Ö±µ½¸ù½áµã + --start; //»ØËÝÒ»´ÎstartÏòǰָһ¸öλÖà + if(HT[f].lchild==c) + cd[start]='0'; //½áµãcÊÇfµÄ×óº¢×Ó£¬ÔòÉú³É´úÂë0 + else + cd[start]='1'; //½áµãcÊÇfµÄÓÒº¢×Ó£¬ÔòÉú³É´úÂë1 + c=f; + f=HT[f].parent; //¼ÌÐøÏòÉÏ»ØËÝ + } //Çó³öµÚi¸ö×Ö·ûµÄ±àÂë + HC[i]=new char[n-start]; // ΪµÚi ¸ö×Ö·û±àÂë·ÖÅä¿Õ¼ä + strcpy(HC[i], &cd[start]); //½«ÇóµÃµÄ±àÂë´ÓÁÙʱ¿Õ¼äcd¸´ÖƵ½HCµÄµ±Ç°ÐÐÖÐ + } + delete cd; //ÊÍ·ÅÁÙʱ¿Õ¼ä +} // CreatHuffanCode +void show(HuffmanTree HT,HuffmanCode HC) +{ + for(int i=1;i<=sizeof(HC)+1;i++) + cout<>n; //ÊäÈëºÕ·òÂüÊ÷µÄÒ¶×Ó½áµã¸öÊý + CreatHuffmanTree(HT,n); + CreatHuffmanCode(HT,HC,n); + show(HT,HC); +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.12-5.13.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.12-5.13.cpp new file mode 100644 index 0000000..63cdde9 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.12-5.13.cpp @@ -0,0 +1,201 @@ +#include +#include +#define ERROR -1 +#define MAXSIZE 100 +using namespace std; + +typedef struct BiTNode{ //¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ + char data; + struct BiTNode *lchild,*rchild; +}BiTNode,*BiTree; + +typedef struct{ // ×Ö·ûÕ»¶¨Òå + char *base; + char *top; + int stacksize; +}SqStack; + +typedef struct{ //Ê÷Õ»¶¨Òå + BiTree *base; + BiTree *top; + int stacksize; +}BiTreeStack; + + +void InitStack(SqStack &S){ //×Ö·ûÕ»³õʼ»¯ + S.base=new char[MAXSIZE]; + if(!S.base) exit(-1); + S.top=S.base; + S.stacksize=MAXSIZE; +} + + +void InitBiTreeStack(BiTreeStack &S){ //Ê÷Õ»³õʼ»¯ + S.base=new BiTree[MAXSIZE]; + if(!S.base) exit(-1); + S.top=S.base; + S.stacksize=MAXSIZE; +} + + +void Push(SqStack &S,char e) //×Ö·ûÕ»ÈëÕ» +{ + if(S.top-S.base==S.stacksize) return ; + *S.top=e; + S.top++; + +} +void PushBiTree(BiTreeStack &S,BiTree e) //Ê÷Õ»ÈëÕ» +{ + if(S.top-S.base==S.stacksize) return ; + *S.top=e; + S.top++; + +} +void Pop(SqStack &S,char &e) //×Ö·ûÕ»³öÕ» +{ + if(S.top==S.base) return; + e=*--S.top; + +} + +void PopBiTree(BiTreeStack &S,BiTree &e) //Ê÷Õ»³öÕ» +{ + if(S.top==S.base) return; + e=*--S.top; + +} + + +char GetTop(SqStack &S) //×Ö·ûÕ»µÃµ½Õ»¶¥º¯Êý +{ + if(S.top==S.base) exit(1); + return *(S.top-1); +} + +char Precede(char t1,char t2) + { /* ¸ù¾Ý½Ì¿ÆÊé±í3.1£¬ÅжÏÁ½·ûºÅµÄÓÅÏȹØÏµ */ + char f; + switch(t2) + { + case '+':if(t1=='('||t1=='#') + f='<'; + else + f='>'; + break; + case '-':if(t1=='('||t1=='#') + f='<'; + else + f='>'; + break; + case '*':if(t1=='*'||t1=='/'||t1==')') + f='>'; + else + f='<'; + break; + case '/':if(t1=='*'||t1=='/'||t1==')') + f='>'; + else + f='<'; + break; + case '(':if(t1!=')') + f='<'; + break; + case')':if(t1=='(') + f='='; + else + f='>'; + break; + case'#':if(t1=='#') + f='='; + else + f='>'; + } + + return f; + } +int In(char c) + { /* ÅжÏcÊÇ·ñΪÔËËã·û */ + switch(c) + { + case '+': + case'-': + case'*': + case '/': + case'#': + case '(': + case')':return 1;break; + default:return 0; + } + } +int GetValue(char theta,int a,int b) //½øÐÐÔËËãµÄº¯Êý + { + int c; + switch(theta) + { + case '+':c=a+b;break; + case'-':c=a-b;break; + case'*':c=a*b;break; + case'/':c=a/b;break; + default: + break; + } + return c; + } + +void CreateExpTree(BiTree &T,BiTree a,BiTree b,char ch){ //¼òµ¥¶þ²æÊ÷µÄ´´½¨ + T=new BiTNode; + T->data=ch; + T->lchild=a; + T->rchild=b; +} + + + void InitExpTree(BiTree &T) //Ëã·¨5.12 ±í´ïʽÊ÷µÄ´´½¨ + { + SqStack OPTR; + BiTreeStack EXPT; + char ch,theta,x; + BiTree a,b; + InitStack(OPTR);Push(OPTR,'#'); + InitBiTreeStack(EXPT);cin>>ch; + while(ch!='#'||GetTop(OPTR)!='#'){ + if(!In(ch)){CreateExpTree(T,NULL,NULL,ch);PushBiTree(EXPT,T);cin>>ch;}//*q + else + switch(Precede(GetTop(OPTR),ch)){ + case'<': + Push(OPTR,ch);cin>>ch; + break; + case'>': + Pop(OPTR,theta); + PopBiTree(EXPT,b);PopBiTree(EXPT,a); + CreateExpTree(T,a,b,theta); //* + PushBiTree(EXPT,T); + break; + case'=': + Pop(OPTR,x);cin>>ch; + break; + } + } + } + + int EvaluateExTree(BiTree T){ //Ëã·¨5.13 ±í´ïʽÊ÷µÄÇóÖµ + int lvalue,rvalue; + lvalue=rvalue=0; + if(T->lchild==NULL&&T->rchild==NULL) + return T->data-'0'; + else{ + lvalue=EvaluateExTree(T->lchild); + rvalue=EvaluateExTree(T->rchild); + return GetValue(T->data,lvalue,rvalue); //ÔËË㺯Êý + } + } + + void main() + { + cout<<"ÇëÊäÈëËãÊõ±í´ïʽ,²¢ÒÔ#½áÊø,ÖÐ¼ä¼ÆËã¹ý³ÌÒªÊǸöλÊý."< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ +typedef struct BiNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BiTNode,*BiTree; + +//Á´Õ»µÄ¶¨Òå +typedef struct StackNode +{ + BiTNode data; + struct StackNode *next; +}StackNode,*LinkStack; + +//ÓÃËã·¨5.3 ÏÈÐò±éÀúµÄ˳Ðò½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +void InitStack(LinkStack &S) +{ + //¹¹ÔìÒ»¸ö¿ÕÕ»S£¬Õ»¶¥Ö¸ÕëÖÃ¿Õ + S=NULL; +} + +bool StackEmpty(LinkStack S) +{ + if(!S) + return true; + return false; +} + +void Push(LinkStack &S,BiTree e) +{ + //ÔÚÕ»¶¥²åÈëÔªËØ*e + StackNode *p=new StackNode; + p->data=*e; + p->next=S; + S=p; +} + +void Pop(LinkStack &S,BiTree e) +{ + if(S!=NULL)//Ô­ÊéÉÏдµÄÊÇif(S==NULL)return ERROR; + { + *e=S->data; + StackNode *p=S; + S=S->next; + delete p; + } +} + +void InOrderTraverse1(BiTree T) +{ + // ÖÐÐò±éÀú¶þ²æÊ÷TµÄ·ÇµÝ¹éËã·¨ + LinkStack S; BiTree p; + BiTree q=new BiTNode; + InitStack(S); p=T; + while(p||!StackEmpty(S)) + { + if(p) + { + Push(S,p); //p·Ç¿Õ¸ùÖ¸Õë½øÕ»£¬±éÀú×ó×ÓÊ÷ + p=p->lchild; + } + else + { + Pop(S,q); //pΪ¿Õ¸ùÖ¸ÕëÍËÕ»£¬·ÃÎʸù½áµã£¬±éÀúÓÒ×ÓÊ÷ + cout<data; + p=q->rchild; + } + } // while +} // InOrderTraverse + +void main() +{ + BiTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + cout<<"ÖÐÐò±éÀúµÄ½á¹ûΪ£º\n"; + InOrderTraverse1(tree); + cout< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ +typedef struct BiNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BiTNode,*BiTree; + +void CreateBiTree(BiTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +//ÓÃËã·¨5.1 ÖÐÐò±éÀúµÄµÝ¹éËã·¨ +void InOrderTraverse(BiTree T) +{ + //ÖÐÐò±éÀú¶þ²æÊ÷TµÄµÝ¹éËã·¨ + if(T){ + InOrderTraverse(T->lchild); + cout << T->data; + InOrderTraverse(T->rchild); + } +} +void main() +{ + BiTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + cout<<"Ëù½¨Á¢µÄ¶þ²æÁ´±íÖÐÐòÐòÁУº\n"; + InOrderTraverse(tree); + cout< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ +typedef struct BiNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BiTNode,*BiTree; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +void Copy(BiTree T, BiTree &NewT) +{ + if(T==NULL ) + { //Èç¹ûÊÇ¿ÕÊ÷£¬µÝ¹é½áÊø + NewT=NULL; + return; + } + else + { + NewT=new BiTNode; + NewT->data= T->data; //¸´ÖƸù½áµã + Copy(T->lchild, NewT->lchild); //µÝ¹é¸´ÖÆ×ó×ÓÊ÷ + Copy(T->rchild, NewT->rchild); //µÝ¹é¸´ÖÆÓÒ×ÓÊ÷ + } //else +} //CopyBiTree + +//ÓÃËã·¨5.1 ÖÐÐò±éÀúµÄµÝ¹éËã·¨ +void InOrderTraverse(BiTree T) +{ + //ÖÐÐò±éÀú¶þ²æÊ÷TµÄµÝ¹éËã·¨ + if(T){ + InOrderTraverse(T->lchild); + cout << T->data; + InOrderTraverse(T->rchild); + } +} +void main() +{ + BiTree tree,new_tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÊ÷µÄÐòÁУº\n"; + CreateBiTree(tree); + Copy(tree,new_tree); + cout<<"¸´ÖƵõ½µÄÐÂÊ÷µÄÖÐÐòÐòÁУº\n"; + InOrderTraverse(new_tree); + cout< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ +typedef struct BiNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BiTNode,*BiTree; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +int Depth(BiTree T) +{ + int m,n; + if(T == NULL ) return 0; //Èç¹ûÊÇ¿ÕÊ÷£¬Éî¶ÈΪ0£¬µÝ¹é½áÊø + else + { + m=Depth(T->lchild); //µÝ¹é¼ÆËã×ó×ÓÊ÷µÄÉî¶È¼ÇΪm + n=Depth(T->rchild); //µÝ¹é¼ÆËãÓÒ×ÓÊ÷µÄÉî¶È¼ÇΪn + if(m>n) return(m+1); //¶þ²æÊ÷µÄÉî¶ÈΪm ÓënµÄ½Ï´óÕß¼Ó1 + else return (n+1); + } +} + +void main() +{ + BiTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + cout<<"ÊýµÄÉî¶ÈΪ£º"< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢±íʾ +typedef struct BiNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BiTNode,*BiTree; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else{ + T=new BiTNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +int NodeCount(BiTree T) +{ + if(T==NULL) return 0; // Èç¹ûÊÇ¿ÕÊ÷£¬Ôò½áµã¸öÊýΪ0£¬µÝ¹é½áÊø + else return NodeCount(T->lchild)+ NodeCount(T->rchild) +1; + //·ñÔò½áµã¸öÊýΪ×ó×ÓÊ÷µÄ½áµã¸öÊý+ÓÒ×ÓÊ÷µÄ½áµã¸öÊý+1 +} + +void main() +{ + BiTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + cout<<"½áµã¸öÊýΪ£º"< +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÏßË÷ÀàÐÍ´æ´¢±íʾ +typedef struct BiThrNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiThrNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë + int LTag,RTag; +}BiThrNode,*BiThrTree; + +//È«¾Ö±äÁ¿pre +BiThrNode *pre=new BiThrNode; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiThrTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else + { + T=new BiThrNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +void InThreading(BiThrTree p) +{ + //preÊÇÈ«¾Ö±äÁ¿£¬³õʼ»¯Ê±ÆäÓÒº¢×ÓÖ¸ÕëΪ¿Õ£¬±ãÓÚÔÚÊ÷µÄ×î×óµã¿ªÊ¼½¨ÏßË÷ + if(p) + { + InThreading(p->lchild); //×ó×ÓÊ÷µÝ¹éÏßË÷»¯ + if(!p->lchild) + { //pµÄ×óº¢×ÓΪ¿Õ + p->LTag=1; //¸øp¼ÓÉÏ×óÏßË÷ + p->lchild=pre; //pµÄ×óº¢×ÓÖ¸ÕëÖ¸Ïòpre£¨Ç°Çý£© + } + else + p->LTag=0; + if(!pre->rchild) + { //preµÄÓÒº¢×ÓΪ¿Õ + pre->RTag=1; //¸øpre¼ÓÉÏÓÒÏßË÷ + pre->rchild=p; //preµÄÓÒº¢×ÓÖ¸ÕëÖ¸Ïòp£¨ºó¼Ì£© + } + else + pre->RTag=0; + pre=p; //±£³ÖpreÖ¸ÏòpµÄǰÇý + InThreading(p->rchild); //ÓÒ×ÓÊ÷µÝ¹éÏßË÷»¯ + } +}//InThreading + +void main() +{ + pre->RTag=1; + pre->rchild=NULL; + BiThrTree tree; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + InThreading(tree); + cout<<"ÏßË÷»¯Íê±Ï£¡\n"; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.8.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.8.cpp new file mode 100644 index 0000000..ceaade5 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.8.cpp @@ -0,0 +1,85 @@ +//Ëã·¨5.8 ´øÍ·½áµãµÄÖÐÐòÏßË÷»¯ +#include +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÏßË÷ÀàÐÍ´æ´¢±íʾ +typedef struct BiThrNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiThrNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë + int LTag,RTag; +}BiThrNode,*BiThrTree; + +//È«¾Ö±äÁ¿pre +BiThrNode *pre=new BiThrNode; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiThrTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else + { + T=new BiThrNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +//ÓÃËã·¨5.7 ÒÔ½áµãPΪ¸ùµÄ×ÓÊ÷ÖÐÐòÏßË÷»¯ +void InThreading(BiThrTree p) +{ + //preÊÇÈ«¾Ö±äÁ¿£¬³õʼ»¯Ê±ÆäÓÒº¢×ÓÖ¸ÕëΪ¿Õ£¬±ãÓÚÔÚÊ÷µÄ×î×óµã¿ªÊ¼½¨ÏßË÷ + if(p) + { + InThreading(p->lchild); //×ó×ÓÊ÷µÝ¹éÏßË÷»¯ + if(!p->lchild) + { //pµÄ×óº¢×ÓΪ¿Õ + p->LTag=1; //¸øp¼ÓÉÏ×óÏßË÷ + p->lchild=pre; //pµÄ×óº¢×ÓÖ¸ÕëÖ¸Ïòpre£¨Ç°Çý£© + } + else + p->LTag=0; + if(!pre->rchild) + { //preµÄÓÒº¢×ÓΪ¿Õ + pre->RTag=1; //¸øpre¼ÓÉÏÓÒÏßË÷ + pre->rchild=p; //preµÄÓÒº¢×ÓÖ¸ÕëÖ¸Ïòp£¨ºó¼Ì£© + } + else + pre->RTag=0; + pre=p; //±£³ÖpreÖ¸ÏòpµÄǰÇý + InThreading(p->rchild); //ÓÒ×ÓÊ÷µÝ¹éÏßË÷»¯ + } +}//InThreading + +void InOrderThreading (BiThrTree &Thrt,BiThrTree T) +{ + //ÖÐÐò±éÀú¶þ²æÊ÷T£¬²¢½«ÆäÖÐÐòÏßË÷»¯£¬ThrtÖ¸ÏòÍ·½áµã + Thrt=new BiThrNode; //½¨Í·½áµã + Thrt->LTag=0; //Í·½áµãÓÐ×óº¢×Ó£¬ÈôÊ÷·Ç¿Õ£¬ÔòÆä×óº¢×ÓΪÊ÷¸ù + Thrt->RTag=1; //Í·½áµãµÄÓÒº¢×ÓÖ¸ÕëΪÓÒÏßË÷ + Thrt->rchild=Thrt; //³õʼ»¯Ê±ÓÒÖ¸ÕëÖ¸Ïò×Ô¼º + if(!T) Thrt->lchild=Thrt; //ÈôÊ÷Ϊ¿Õ£¬Ôò×óÖ¸ÕëÒ²Ö¸Ïò×Ô¼º + else + { + Thrt->lchild=T; pre=Thrt; //Í·½áµãµÄ×óº¢×ÓÖ¸Ïò¸ù£¬pre³õÖµÖ¸ÏòÍ·½áµã + InThreading(T); //µ÷ÓÃËã·¨5.7£¬¶ÔÒÔTΪ¸ùµÄ¶þ²æÊ÷½øÐÐÖÐÐòÏßË÷»¯ + pre->rchild=Thrt; //Ëã·¨5.7½áÊøºó£¬preΪ×îÓÒ½áµã£¬preµÄÓÒÏßË÷Ö¸ÏòÍ·½áµã + pre->RTag=1; + Thrt->rchild=pre; //Í·½áµãµÄÓÒÏßË÷Ö¸Ïòpre + } +} //InOrderThreading + +void main() +{ + pre->RTag=1; + pre->rchild=NULL; + BiThrTree tree,Thrt; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + InOrderThreading(Thrt,tree); + cout<<"ÏßË÷»¯Íê±Ï!\n"; +} diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.9.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.9.cpp new file mode 100644 index 0000000..9453d81 --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第5ç« /5.9.cpp @@ -0,0 +1,108 @@ +//Ëã·¨5.9 ±éÀúÖÐÐòÏßË÷¶þ²æÊ÷ +#include +using namespace std; + +//¶þ²æÊ÷µÄ¶þ²æÏßË÷ÀàÐÍ´æ´¢±íʾ +typedef struct BiThrNode +{ + char data; //½áµãÊý¾ÝÓò + struct BiThrNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë + int LTag,RTag; +}BiThrNode,*BiThrTree; + +//È«¾Ö±äÁ¿pre +BiThrNode *pre=new BiThrNode; + +//ÓÃËã·¨5.3½¨Á¢¶þ²æÁ´±í +void CreateBiTree(BiThrTree &T) +{ + //°´ÏÈÐò´ÎÐòÊäÈë¶þ²æÊ÷ÖнáµãµÄÖµ£¨Ò»¸ö×Ö·û£©£¬´´½¨¶þ²æÁ´±í±íʾµÄ¶þ²æÊ÷T + char ch; + cin >> ch; + if(ch=='#') T=NULL; //µÝ¹é½áÊø£¬½¨¿ÕÊ÷ + else + { + T=new BiThrNode; + T->data=ch; //Éú³É¸ù½áµã + CreateBiTree(T->lchild); //µÝ¹é´´½¨×ó×ÓÊ÷ + CreateBiTree(T->rchild); //µÝ¹é´´½¨ÓÒ×ÓÊ÷ + } //else +} //CreateBiTree + +//ÓÃËã·¨5.7ÒÔ½áµãPΪ¸ùµÄ×ÓÊ÷ÖÐÐòÏßË÷»¯ +void InThreading(BiThrTree p) +{ + //preÊÇÈ«¾Ö±äÁ¿£¬³õʼ»¯Ê±ÆäÓÒº¢×ÓÖ¸ÕëΪ¿Õ£¬±ãÓÚÔÚÊ÷µÄ×î×óµã¿ªÊ¼½¨ÏßË÷ + if(p) + { + InThreading(p->lchild); //×ó×ÓÊ÷µÝ¹éÏßË÷»¯ + if(!p->lchild) + { //pµÄ×óº¢×ÓΪ¿Õ + p->LTag=1; //¸øp¼ÓÉÏ×óÏßË÷ + p->lchild=pre; //pµÄ×óº¢×ÓÖ¸ÕëÖ¸Ïòpre£¨Ç°Çý£© + } + else + p->LTag=0; + if(!pre->rchild) + { //preµÄÓÒº¢×ÓΪ¿Õ + pre->RTag=1; //¸øpre¼ÓÉÏÓÒÏßË÷ + pre->rchild=p; //preµÄÓÒº¢×ÓÖ¸ÕëÖ¸Ïòp£¨ºó¼Ì£© + } + else + pre->RTag=0; + pre=p; //±£³ÖpreÖ¸ÏòpµÄǰÇý + InThreading(p->rchild); //ÓÒ×ÓÊ÷µÝ¹éÏßË÷»¯ + } +}//InThreading + +//ÓÃËã·¨5.8´øÍ·½áµãµÄÖÐÐòÏßË÷»¯ +void InOrderThreading (BiThrTree &Thrt,BiThrTree T) +{ + //ÖÐÐò±éÀú¶þ²æÊ÷T£¬²¢½«ÆäÖÐÐòÏßË÷»¯£¬ThrtÖ¸ÏòÍ·½áµã + Thrt=new BiThrNode; //½¨Í·½áµã + Thrt->LTag=0; //Í·½áµãÓÐ×óº¢×Ó£¬ÈôÊ÷·Ç¿Õ£¬ÔòÆä×óº¢×ÓΪÊ÷¸ù + Thrt->RTag=1; //Í·½áµãµÄÓÒº¢×ÓÖ¸ÕëΪÓÒÏßË÷ + Thrt->rchild=Thrt; //³õʼ»¯Ê±ÓÒÖ¸ÕëÖ¸Ïò×Ô¼º + if(!T) Thrt->lchild=Thrt; //ÈôÊ÷Ϊ¿Õ£¬Ôò×óÖ¸ÕëÒ²Ö¸Ïò×Ô¼º + else + { + Thrt->lchild=T; pre=Thrt; //Í·½áµãµÄ×óº¢×ÓÖ¸Ïò¸ù£¬pre³õÖµÖ¸ÏòÍ·½áµã + InThreading(T); //µ÷ÓÃËã·¨5.7£¬¶ÔÒÔTΪ¸ùµÄ¶þ²æÊ÷½øÐÐÖÐÐòÏßË÷»¯ + pre->rchild=Thrt; //Ëã·¨5.7½áÊøºó£¬preΪ×îÓÒ½áµã£¬preµÄÓÒÏßË÷Ö¸ÏòÍ·½áµã + pre->RTag=1; + Thrt->rchild=pre; //Í·½áµãµÄÓÒÏßË÷Ö¸Ïòpre + } +} //InOrderThreading + +void InOrderTraverse_Thr(BiThrTree T) +{ + //TÖ¸ÏòÍ·½áµã£¬Í·½áµãµÄ×óÁ´lchildÖ¸Ïò¸ù½áµã£¬¿É²Î¼ûÏßË÷»¯Ëã·¨5.8¡£ + //ÖÐÐò±éÀú¶þ²æÏßË÷Ê÷TµÄ·ÇµÝ¹éËã·¨£¬¶Ôÿ¸öÊý¾ÝÔªËØÖ±½ÓÊä³ö + BiThrTree p; + p=T->lchild; //pÖ¸Ïò¸ù½áµã + while(p!=T) //¿ÕÊ÷»ò±éÀú½áÊøÊ±£¬p==T + { + while(p->LTag==0) //ÑØ×óº¢×ÓÏòÏ + p=p->lchild; //·ÃÎÊÆä×ó×ÓÊ÷Ϊ¿ÕµÄ½áµã + cout<data; + while(p->RTag==1&&p->rchild!=T) + { + p=p->rchild; //ÑØÓÒÏßË÷·ÃÎʺó¼Ì½áµã + cout<data; + } + p=p->rchild; + } +} //InOrderTraverse_Thr + +void main() +{ + pre->RTag=1; + pre->rchild=NULL; + BiThrTree tree,Thrt; + cout<<"ÇëÊäÈ뽨Á¢¶þ²æÁ´±íµÄÐòÁУº\n"; + CreateBiTree(tree); + InOrderThreading(Thrt,tree); + cout<<"ÖÐÐò±éÀúÏßË÷¶þ²æÊ÷µÄ½á¹ûΪ£º\n"; + InOrderTraverse_Thr(Thrt); + cout< +using namespace std; + +#define MaxInt 32767 //±íʾ¼«´óÖµ£¬¼´¡Þ +#define MVNum 100 //×î´ó¶¥µãÊý +#define OK 1 + +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +//- - - - -ͼµÄÁÚ½Ó¾ØÕó´æ´¢±íʾ- - - - - +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}AMGraph; + +int LocateVex(AMGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +int CreateUDN(AMGraph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª£º"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = MaxInt; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ£¬Èç a b 5" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + ArcType w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = w; //±ßµÄȨֵÖÃΪw + G.arcs[j][i] = G.arcs[i][j]; //ÖõĶԳƱߵÄȨֵΪw + }//for + return OK; +}//CreateUDN + +int main(){ + cout << "************Ëã·¨6.1¡¡²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨´´½¨ÎÞÏòÍø**************" << endl << endl; + AMGraph G; int i , j; + CreateUDN(G); + + cout < +using namespace std; + +#define MaxInt 32767 //±íʾ¼«´óÖµ£¬¼´¡Þ +#define MVNum 100 //×î´ó¶¥µãÊý +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +int *D=new int[MVNum]; //ÓÃÓڼǼ×î¶Ì·µÄ³¤¶È +bool *S=new bool[MVNum]; //±ê¼Ç¶¥µãÊÇ·ñ½øÈëS¼¯ºÏ +int *Path=new int[MVNum]; //ÓÃÓڼǼ×î¶Ì·¶¥µãµÄǰÇý + +//------------ͼµÄÁÚ½Ó¾ØÕó----------------- +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}AMGraph; + +int LocateVex(AMGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(AMGraph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ:£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = MaxInt; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ£¬Èça b 7" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + ArcType w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = w; //±ßµÄȨֵÖÃΪw + G.arcs[j][i] = G.arcs[i][j]; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +void ShortestPath_DIJ(AMGraph G, int v0){ + //ÓÃDijkstraËã·¨ÇóÓÐÏòÍøGµÄv0¶¥µãµ½ÆäÓà¶¥µãµÄ×î¶Ì·¾¶ + int v , i , w , min; + int n = G.vexnum; //nΪGÖж¥µãµÄ¸öÊý + + for(v = 0; v < n; ++v){ //n¸ö¶¥µãÒÀ´Î³õʼ»¯ + S[v] = false; //S³õʼΪ¿Õ¼¯ + D[v] = G.arcs[v0][v]; //½«v0µ½¸÷¸öÖÕµãµÄ×î¶Ì·¾¶³¤¶È³õʼ»¯Îª»¡ÉϵÄȨֵ + if(D[v] < MaxInt) Path [v] = v0; //Èç¹ûv0ºÍvÖ®¼äÓл¡£¬Ôò½«vµÄǰÇýÖÃΪv0 + else Path [v] = -1; //Èç¹ûv0ºÍvÖ®¼äÎÞ»¡£¬Ôò½«vµÄǰÇýÖÃΪ-1 + }//for + + S[v0]=true; //½«v0¼ÓÈëS + D[v0]=0; //Ô´µãµ½Ô´µãµÄ¾àÀëΪ0 + + /*¨D³õʼ»¯½áÊø£¬¿ªÊ¼Ö÷Ñ­»·£¬Ã¿´ÎÇóµÃv0µ½Ä³¸ö¶¥µãvµÄ×î¶Ì·¾¶£¬½«v¼Óµ½S¼¯¨D*/ + for(i = 1;i < n; ++i){ //¶ÔÆäÓàn-1¸ö¶¥µã£¬ÒÀ´Î½øÐмÆËã + min= MaxInt; + for(w = 0; w < n; ++w) + if(!S[w] && D[w] < min){ //Ñ¡ÔñÒ»Ìõµ±Ç°µÄ×î¶Ì·¾¶£¬ÖÕµãΪv + v = w; + min = D[w]; + }//if + S[v]=true; //½«v¼ÓÈëS + for(w = 0;w < n; ++w) //¸üдÓv0³ö·¢µ½¼¯ºÏV?SÉÏËùÓж¥µãµÄ×î¶Ì·¾¶³¤¶È + if(!S[w] && (D[v] + G.arcs[v][w] < D[w])){ + D[w] = D[v] + G.arcs[v][w]; //¸üÐÂD[w] + Path [w] = v; //¸ü¸ÄwµÄǰÇýΪv + }//if + }//for +}//ShortestPath_DIJ + +void DisplayPath(AMGraph G , int begin ,int temp ){ + //ÏÔʾ×î¶Ì· + if(Path[temp] != -1){ + DisplayPath(G , begin ,Path[temp]); + cout << G.vexs[Path[temp]] << "-->"; + } +}//DisplayPath + +void main() +{ + cout << "************Ëã·¨6.10¡¡µÏ½ÜË¹ÌØÀ­Ëã·¨**************" << endl << endl; + AMGraph G; + int i , j ,num_start , num_destination; + VerTexType start , destination; + CreateUDN(G); + cout <> start >> destination; + num_start = LocateVex(G , start); + num_destination = LocateVex(G , destination); + ShortestPath_DIJ(G , num_start); + cout << endl <<"×î¶Ì·¾¶Îª£º"; + DisplayPath(G , num_start , num_destination); + cout << G.vexs[num_destination]< +using namespace std; + +#define MaxInt 32767 //±íʾ¼«´óÖµ£¬¼´¡Þ +#define MVNum 100 //×î´ó¶¥µãÊý + +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +int Path[MVNum][MVNum]; //×î¶Ì·¾¶É϶¥µãvjµÄǰһ¶¥µãµÄÐòºÅ +int D[MVNum][MVNum]; //¼Ç¼¶¥µãviºÍvjÖ®¼äµÄ×î¶Ì·¾¶³¤¶È + +//------------ͼµÄÁÚ½Ó¾ØÕó--------------- +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}AMGraph; + +int LocateVex(AMGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(AMGraph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÓÐÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i){ //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j){ + if(j != i) + G.arcs[i][j] = MaxInt; + else + G.arcs[i][j] = 0; + }//for + }//for + + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ£¬Èça b 3" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + ArcType w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = w; //±ßµÄȨֵÖÃΪw + }//for +}//CreateUDN + +void ShortestPath_Floyed(AMGraph G){ + //ÓÃFloydËã·¨ÇóÓÐÏòÍøGÖи÷¶Ô¶¥µãiºÍjÖ®¼äµÄ×î¶Ì·¾¶ + int i , j , k ; + for (i = 0; i < G.vexnum; ++i) //¸÷¶Ô½áµãÖ®¼ä³õʼÒÑ֪·¾¶¼°¾àÀë + for(j = 0; j < G.vexnum; ++j){ + D[i][j] = G.arcs[i][j]; + if(D[i][j] < MaxInt && i != j) Path[i][j]=i; //Èç¹ûiºÍjÖ®¼äÓл¡£¬Ôò½«jµÄǰÇýÖÃΪi + else Path [i][j] = -1; //Èç¹ûiºÍjÖ®¼äÎÞ»¡£¬Ôò½«jµÄǰÇýÖÃΪ-1 + }//for + for(k = 0; k < G.vexnum; ++k) + for(i = 0; i < G.vexnum; ++i) + for(j = 0; j < G.vexnum; ++j) + if(D[i][k] + D[k][j] < D[i][j]){ //´Ói¾­kµ½jµÄÒ»Ìõ·¾¶¸ü¶Ì + D[i][j] = D[i][k]+D[k][j]; //¸üÐÂD[i][j] + Path[i][j] = Path[k][j]; //¸ü¸ÄjµÄǰÇýΪk + }//if +}//ShortestPath_Floyed + +void DisplayPath(AMGraph G , int begin ,int temp ){ + //ÏÔʾ×î¶Ì·¾¶ + if(Path[begin][temp] != -1){ + DisplayPath(G , begin ,Path[begin][temp]); + cout << G.vexs[Path[begin][temp]] << "-->"; + } +}//DisplayPath + +void main(){ + cout << "************Ëã·¨6.11¡¡¸¥ÂåÒÁµÂËã·¨**************" << endl << endl; + AMGraph G; + char start , destination; + int num_start , num_destination; + + CreateUDN(G); + + cout <> start >> destination; + num_start = LocateVex(G , start); + num_destination = LocateVex(G , destination); + + DisplayPath(G , num_start , num_destination); + cout << G.vexs[num_destination] << endl; + cout << "×î¶Ì·¾¶µÄ³¤¶ÈΪ£º" << D[num_start][num_destination] << endl; + cout < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +#define OK 1 +#define ERROR 0 + +typedef char VerTexType; + +//- - - - -ͼµÄÁÚ½Ó±í´æ´¢±íʾ- - - - - +typedef struct ArcNode{ //±ß½áµã + int adjvex; //¸Ã±ßËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode *nextarc; //Ö¸ÏòÏÂÒ»Ìõ±ßµÄÖ¸Õë +}ArcNode; + +typedef struct VNode{ + VerTexType data; //¶¥µãÐÅÏ¢ + ArcNode *firstarc; //Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +}VNode, AdjList[MVNum]; //AdjList±íʾÁÚ½Ó±íÀàÐÍ + +typedef struct{ + AdjList vertices; //ÁÚ½Ó±í + AdjList converse_vertices; //ÄæÁÚ½Ó±í + int vexnum, arcnum; //ͼµÄµ±Ç°¶¥µãÊýºÍ±ßÊý +}ALGraph; +//- - - - - - - - - - - - - - - - + +//- - - - -˳ÐòÕ»µÄ¶¨Òå- - - - - +typedef struct{ + int *base; + int *top; + int stacksize; +}spStack; +//- - - - - - - - - - - - - - - - + +int indegree[MVNum]; //Êý×éindegree´æ·Å¸ö¶¥µãµÄÈë¶È +spStack S; + +//------------Õ»µÄÏà¹Ø²Ù×÷---------------------- +void InitStack(spStack &S){ + //³õʼ»¯Õ» + S.base = new int[MVNum]; + if(!S.base) + exit(1); + S.top = S.base; + S.stacksize = MVNum; +}//InitStack + +void Push(spStack &S , int i){ + //½øÕ» + if(S.top - S.base == S.stacksize) + return; + *S.top++ = i; +}//Push + +void Pop(spStack &S , int &i){ + //³öÕ» + if(S.top == S.base) + return; + i = *--S.top; +}//Pop + +bool StackEmpty(spStack S){ + //ÅжÏÕ»ÊÇ·ñΪ¿Õ + if(S.top == S.base) + return true; + return false; +}//StackEmpty +//------------------------------------------------- + +int LocateVex(ALGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vertices[i].data == v) + return i; + return -1; +}//LocateVex + +int CreateUDG(ALGraph &G){ + //´´½¨ÓÐÏòͼGµÄÁÚ½Ó±í¡¢ÄæÁÚ½Ó±í + int i , k; + + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ //ÊäÈë¸÷µã£¬¹¹Ôì±íÍ·½áµã±í + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vertices[i].data; //ÊäÈë¶¥µãÖµ + G.converse_vertices[i].data = G.vertices[i].data; + //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + G.vertices[i].firstarc=NULL; + G.converse_vertices[i].firstarc=NULL; + }//for + cout << endl; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬Èça b" << endl; + for(k = 0; k < G.arcnum;++k){ //ÊäÈë¸÷±ß£¬¹¹ÔìÁÚ½Ó±í + VerTexType v1 , v2; + int i , j; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄÁ½¸ö¶¥µã + i = LocateVex(G, v1); j = LocateVex(G, v2); + //È·¶¨v1ºÍv2ÔÚGÖÐλÖ㬼´¶¥µãÔÚG.verticesÖеÄÐòºÅ + + ArcNode *p1=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p1->adjvex=j; //ÁÚ½ÓµãÐòºÅΪj + p1->nextarc = G.vertices[i].firstarc; G.vertices[i].firstarc=p1; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + + ArcNode *p2=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p2->adjvex=i; //ÄæÁÚ½ÓµãÐòºÅΪi + p2->nextarc = G.converse_vertices[j].firstarc; G.converse_vertices[j].firstarc=p2; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + }//for + return OK; +}//CreateUDG + +void FindInDegree(ALGraph G){ + //Çó³ö¸÷¶¥µãµÄÈë¶È´æÈëÊý×éindegreeÖÐ + int i , count; + + for(i = 0 ; i < G.vexnum ; i++){ + count = 0; + ArcNode *p = G.converse_vertices[i].firstarc; + if(p){ + while(p){ + p = p->nextarc; + count++; + } + } + indegree[i] = count; + } +}//FindInDegree + +int TopologicalSort(ALGraph G , int topo[]){ + //ÓÐÏòͼG²ÉÓÃÁÚ½Ó±í´æ´¢½á¹¹ + //ÈôGÎÞ»ØÂ·£¬ÔòÉú³ÉGµÄÒ»¸öÍØÆËÐòÁÐtopo[]²¢·µ»ØOK£¬·ñÔòERROR + int i , m; + FindInDegree(G); //Çó³ö¸÷¶¥µãµÄÈë¶È´æÈëÊý×éindegreeÖÐ + InitStack(S); //Õ»S³õʼ»¯Îª¿Õ + for(i = 0; i < G.vexnum; ++i) + if(!indegree[i]) Push(S, i); //Èë¶ÈΪ0Õß½øÕ» + m = 0; //¶ÔÊä³ö¶¥µã¼ÆÊý£¬³õʼΪ0 + while(!StackEmpty(S)){ //Õ»S·Ç¿Õ + Pop(S, i); //½«Õ»¶¥¶¥µãvi³öÕ» + topo[m]=i; //½«vi±£´æÔÚÍØÆËÐòÁÐÊý×étopoÖÐ + ++m; //¶ÔÊä³ö¶¥µã¼ÆÊý + ArcNode *p = G.vertices[i].firstarc; //pÖ¸ÏòviµÄµÚÒ»¸öÁÚ½Óµã + while(p){ + int k = p->adjvex; //vkΪviµÄÁÚ½Óµã + --indegree[k]; //viµÄÿ¸öÁÚ½ÓµãµÄÈë¶È¼õ1 + if(indegree[k] ==0) Push(S, k); //ÈôÈë¶È¼õΪ0£¬ÔòÈëÕ» + p = p->nextarc; //pÖ¸Ïò¶¥µãviÏÂÒ»¸öÁÚ½Ó½áµã + }//while + }//while + + if(m < G.vexnum) return ERROR; //¸ÃÓÐÏòͼÓлØÂ· + else return OK; +}//TopologicalSort + +int main(){ + cout << "************Ëã·¨6.12¡¡ÍØÆËÅÅÐò**************" << endl << endl; + ALGraph G; + CreateUDG(G); + int *topo = new int [G.vexnum]; + + cout << endl; + cout << "ÓÐÏòͼµÄÁÚ½Ó±í¡¢ÄæÁÚ½Ó±í´´½¨Íê³É!" << endl << endl; + + if(TopologicalSort(G , topo)){ + cout << "¸ÃÓÐÏòͼµÄÍØÆËÓÐÐòÐòÁÐΪ£º"; + for(int j = 0 ; j < G.vexnum; j++){ + if(j != G.vexnum - 1) + cout << G.vertices[topo[j]].data << " , "; + else + cout << G.vertices[topo[j]].data << endl << endl; + }//for + } + else + cout << "ÍøÖдæÔÚ»·£¬ÎÞ·¨½øÐÐÍØÆËÅÅÐò£¡" < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +#define BDNum MVNum * (MVNum - 1) //×î´ó±ßÊý +#define OK 1 +#define ERROR 0 + +typedef char VerTexType; + +//- - - - -ͼµÄÁÚ½Ó±í´æ´¢±íʾ- - - - - +typedef struct ArcNode{ //±ß½áµã + int adjvex; //¸Ã±ßËùÖ¸ÏòµÄ¶¥µãµÄλÖà + int weight; //Ȩֵ + struct ArcNode *nextarc; //Ö¸ÏòÏÂÒ»Ìõ±ßµÄÖ¸Õë +}ArcNode; + +typedef struct VNode{ + VerTexType data; //¶¥µãÐÅÏ¢ + ArcNode *firstarc; //Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +}VNode, AdjList[MVNum]; //AdjList±íʾÁÚ½Ó±íÀàÐÍ + +typedef struct{ + AdjList vertices; //ÁÚ½Ó±í + AdjList converse_vertices; //ÄæÁÚ½Ó±í + int vexnum, arcnum; //ͼµÄµ±Ç°¶¥µãÊýºÍ±ßÊý +}ALGraph; +//- - - - - - - - - - - - - - - - + +//- - - - -˳ÐòÕ»µÄ¶¨Òå- - - - - +typedef struct{ + int *base; + int *top; + int stacksize; +}spStack; +//- - - - - - - - - - - - - - - - + +int indegree[MVNum]; //Êý×éindegree´æ·Å¸ö¶¥µãµÄÈë¶È +int ve[BDNum]; //ʼþviµÄ×îÔç·¢Éúʱ¼ä +int vl[BDNum]; //ʼþviµÄ×î³Ù·¢Éúʱ¼ä +int topo[MVNum]; //¼ÇÂ¼ÍØÆËÐòÁеĶ¥µãÐòºÅ +spStack S; + +//----------------Õ»µÄ²Ù×÷-------------------- +void InitStack(spStack &S){ + //Õ»µÄ³õʼ»¯ + S.base = new int[MVNum]; + if(!S.base) + exit(1); + S.top = S.base; + S.stacksize = MVNum; +}//InitStack + +void Push(spStack &S , int i){ + //ÈëÕ» + if(S.top - S.base == S.stacksize) + return; + *S.top++ = i; +}//Push + +void Pop(spStack &S , int &i){ + //³öÕ» + if(S.top == S.base) + return; + i = *--S.top; +}//Pop + +bool StackEmpty(spStack S){ + //ÅжÏÕ»ÊÇ·ñΪ¿Õ + if(S.top == S.base) + return true; + return false; +}//StackEmpty +//--------------------------------------- + +int LocateVex(ALGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vertices[i].data == v) + return i; + return -1; +}//LocateVex + +int CreateUDG(ALGraph &G){ + //´´½¨ÓÐÏòͼGµÄÁÚ½Ó±í¡¢ÄæÁÚ½Ó±í + int i , k; + + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ //ÊäÈë¸÷µã£¬¹¹Ôì±íÍ·½áµã±í + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vertices[i].data; //ÊäÈë¶¥µãÖµ + G.converse_vertices[i].data = G.vertices[i].data; + //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + G.vertices[i].firstarc=NULL; + G.converse_vertices[i].firstarc=NULL; + }//for + cout << endl; + + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°ÆäȨֵ£¬Èça b 3" << endl; + + for(k = 0; k < G.arcnum;++k){ //ÊäÈë¸÷±ß£¬¹¹ÔìÁÚ½Ó±í + VerTexType v1 , v2; + int i , j , w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°ÆäȨֵ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄÁ½¸ö¶¥µã + i = LocateVex(G, v1); j = LocateVex(G, v2); + //È·¶¨v1ºÍv2ÔÚGÖÐλÖ㬼´¶¥µãÔÚG.verticesÖеÄÐòºÅ + + ArcNode *p1=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p1->adjvex=j; //ÁÚ½ÓµãÐòºÅΪj + p1->nextarc = G.vertices[i].firstarc; G.vertices[i].firstarc=p1; + p1->weight = w; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + + ArcNode *p2=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p2->adjvex=i; //ÄæÁÚ½ÓµãÐòºÅΪi + p2->nextarc = G.converse_vertices[j].firstarc; G.converse_vertices[j].firstarc=p2; + p2->weight = w; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + }//for + return OK; +}//CreateUDG + +void FindInDegree(ALGraph G){ + //Çó³ö¸÷¶¥µãµÄÈë¶È´æÈëÊý×éindegreeÖÐ + int i , count; + + for(i = 0 ; i < G.vexnum ; i++){ + count = 0; + ArcNode *p = G.converse_vertices[i].firstarc; + if(p){ + while(p){ + p = p->nextarc; + count++; + } + }//if + indegree[i] = count; + }//for +}//FindInDegree + +int TopologicalOrder(ALGraph G , int topo[]){ + //ÓÐÏòͼG²ÉÓÃÁÚ½Ó±í´æ´¢½á¹¹ + //ÈôGÎÞ»ØÂ·£¬ÔòÉú³ÉGµÄÒ»¸öÍØÆËÐòÁÐtopo[]²¢·µ»ØOK£¬·ñÔòERROR + int i , m; + FindInDegree(G); //Çó³ö¸÷¶¥µãµÄÈë¶È´æÈëÊý×éindegreeÖÐ + InitStack(S); //Õ»S³õʼ»¯Îª¿Õ + for(i = 0; i < G.vexnum; ++i) + if(!indegree[i]) Push(S, i); //Èë¶ÈΪ0Õß½øÕ» + m = 0; //¶ÔÊä³ö¶¥µã¼ÆÊý£¬³õʼΪ0 + while(!StackEmpty(S)){ //Õ»S·Ç¿Õ + Pop(S, i); //½«Õ»¶¥¶¥µãvi³öÕ» + topo[m]=i; //½«vi±£´æÔÚÍØÆËÐòÁÐÊý×étopoÖÐ + ++m; //¶ÔÊä³ö¶¥µã¼ÆÊý + ArcNode *p = G.vertices[i].firstarc; //pÖ¸ÏòviµÄµÚÒ»¸öÁÚ½Óµã + while(p){ + int k = p->adjvex; //vkΪviµÄÁÚ½Óµã + --indegree[k]; //viµÄÿ¸öÁÚ½ÓµãµÄÈë¶È¼õ1 + if(indegree[k] ==0) Push(S, k); //ÈôÈë¶È¼õΪ0£¬ÔòÈëÕ» + p = p->nextarc; //pÖ¸Ïò¶¥µãviÏÂÒ»¸öÁÚ½Ó½áµã + }//while + }//while + + if(m < G.vexnum) return ERROR; //¸ÃÓÐÏòͼÓлØÂ· + else return OK; +}//TopologicalOrder + +int CriticalPath(ALGraph G){ + //GΪÁÚ½Ó±í´æ´¢µÄÓÐÏòÍø£¬Êä³öGµÄ¸÷Ïî¹Ø¼ü»î¶¯ + int n , i , k , j , e , l; + if (!TopologicalOrder(G, topo)) return ERROR; + //µ÷ÓÃÍØÆËÅÅÐòËã·¨£¬Ê¹ÍØÆËÐòÁб£´æÔÚtopoÖУ¬Èôµ÷ÓÃʧ°Ü£¬Ôò´æÔÚÓÐÏò»·£¬·µ»ØERROR + n = G.vexnum; //nΪ¶¥µã¸öÊý + for(i = 0; i < n; i++) //¸øÃ¿¸öʼþµÄ×îÔç·¢Éúʱ¼äÖóõÖµ0 + ve[i] = 0; + + + /*¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D°´ÍØÆË´ÎÐòÇóÿ¸öʼþµÄ×îÔç·¢Éúʱ¼ä£­¨D¨D¨D¨D£­¨D¨D¨D¨D¨D*/ + for(i = 0;i < n; i++){ + k = topo[i]; //È¡µÃÍØÆËÐòÁÐÖеĶ¥µãÐòºÅk + ArcNode *p = G.vertices[k].firstarc; //pÖ¸ÏòkµÄµÚÒ»¸öÁÚ½Ó¶¥µã + while(p != NULL){ //ÒÀ´Î¸üÐÂkµÄËùÓÐÁÚ½Ó¶¥µãµÄ×îÔç·¢Éúʱ¼ä + j = p->adjvex; //jΪÁÚ½Ó¶¥µãµÄÐòºÅ + if(ve[j] < ve[k] + p->weight) //¸üж¥µãjµÄ×îÔç·¢Éúʱ¼äve[j] + ve[j] = ve[k] + p->weight; + p = p->nextarc; //pÖ¸ÏòkµÄÏÂÒ»¸öÁÚ½Ó¶¥µã + } //while + } //for + + for(i=0;i= 0; i--){ + k = topo[i]; //È¡µÃÍØÆËÐòÁÐÖеĶ¥µãÐòºÅk + ArcNode *p = G.vertices[k].firstarc; //pÖ¸ÏòkµÄµÚÒ»¸öÁÚ½Ó¶¥µã + while(p != NULL){ //¸ù¾ÝkµÄÁڽӵ㣬¸üÐÂkµÄ×î³Ù·¢Éúʱ¼ä + j = p->adjvex; //jΪÁÚ½Ó¶¥µãµÄÐòºÅ + if(vl[k] > vl[j] - p->weight) //¸üж¥µãkµÄ×î³Ù·¢Éúʱ¼ävl[k] + vl[k] = vl[j] - p->weight; + p = p->nextarc; //pÖ¸ÏòkµÄÏÂÒ»¸öÁÚ½Ó¶¥µã + }//while + }//for + + /*¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D¨DÅжÏÿһ»î¶¯ÊÇ·ñΪ¹Ø¼ü»î¶¯£­¨D¨D¨D¨D¨D¨D£­¨D¨D¨D¨D¨D*/ + cout << endl; + cout << "¹Ø¼ü»î¶¯Â·¾¶Îª:"; + for(i = 0;i < n; i++){ //ÿ´ÎÑ­»·Õë¶ÔviΪ»î¶¯¿ªÊ¼µãµÄËùÓл + ArcNode *p = G.vertices[i].firstarc; //pÖ¸ÏòiµÄµÚÒ»¸öÁÚ½Ó¶¥µã + while(p != NULL) { + j = p->adjvex; //jΪiµÄÁÚ½Ó¶¥µãµÄÐòºÅ + e = ve[i]; //¼ÆËã»î¶¯µÄ×îÔ翪ʼʱ¼ä + l = vl[j] - p->weight; //¼ÆËã»î¶¯µÄ×î³Ù¿ªÊ¼Ê±¼ä + if(e == l) //ÈôΪ¹Ø¼ü»î¶¯£¬ÔòÊä³ö + cout << G.vertices[i].data << "-->" << G.vertices[j].data << " "; + p = p->nextarc; //pÖ¸ÏòiµÄÏÂÒ»¸öÁÚ½Ó¶¥µã + } //while + } //for + return OK; +}//CriticalPath + +int main(){ + cout << "************Ëã·¨6.13¡¡¹Ø¼ü·¾¶Ëã·¨**************" << endl << endl; + ALGraph G; + CreateUDG(G); + int *topo = new int [G.vexnum]; + + cout << endl; + cout << "ÓÐÏòͼ´´½¨Íê³É!" << endl << endl; + + if(!CriticalPath(G)) + cout << "ÍøÖдæÔÚ»·£¬ÎÞ·¨½øÐÐÍØÆËÅÅÐò£¡" < +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#define ONLINE_JUDGE +#define eps 1e-8 +#define INF 0x7fffffff +#define FOR(i,a) for((i)=0;i<(a);(i)++) +#define MEM(a) (memset((a),0,sizeof(a))) +#define sfs(a) scanf("%s",a) +#define sf(a) scanf("%d",&a) +#define sfI(a) scanf("%I64d",&a) +#define pf(a) printf("%d\n",a) +#define pfI(a) printf("%I64d\n",a) +#define pfs(a) printf("%s\n",a) +#define sfd(a,b) scanf("%d%d",&a,&b) +#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c) +#define for1(i,a,b) for(int i=(a);i=a;i--) +#define MEM1(a) memset(a,0,sizeof(a)) +#define MEM2(a) memset(a,-1,sizeof(a)) +const double PI=acos(-1.0); +template T gcd(T a,T b){return b?gcd(b,a%b):a;} +template T lcm(T a,T b){return a/gcd(a,b)*b;} +template inline T Min(T a,T b){return a inline T Max(T a,T b){return a>b?a:b;} +using namespace std; +#define ll __int64 +int n,m; +#define Mod 10 +#define N 10010 +#define M 1000010 +struct Edge{ //´æ´¢±ßµÄ½á¹¹Ìå + int to; + int next; +}; +struct Node{ //´æ´¢µãµÄ½á¹¹Ìå + int id; + int step; +}; +struct sqQueue{ //¶ÓÁеĽṹÌå + Node *base; + int front; + int rear; +}; +Edge edge[N]; // +int head[N]; +int vis[N]; +int cnt; +sqQueue Q; +void Init(){ + memset(head,-1,sizeof head); + cnt=0; +} +void addEdge(int u,int v){ //Ìí¼Ó±ß + edge[cnt].to = v; + edge[cnt].next = head[u]; + head[u] = cnt++; +} +void InitQueue(sqQueue &Q){ //³õʼ»¯¶ÓÁÐ + Q.base = new Node[M]; + if(!Q.base) + exit(OVERFLOW); + Q.front = Q.rear = 0; + return; +} +int QueueLength(sqQueue Q){ //Çó¶ÓÁеij¤¶È + return(Q.rear-Q.front+M)%M; +} +int EnQueue(sqQueue &Q,Node e){ //Èë¶Ó + if((Q.rear+1)%M == Q.front) + return 0; + Q.base[Q.rear] = e; + Q.rear = (Q.rear+1)%M; + return 1; +} +int DeQueue(sqQueue &Q){ //³ö¶Ó + if(Q.front == Q.rear) + return 0; + Q.front = (Q.front+1)%M; + return 1; +} +Node getHead(sqQueue Q){ //µÃµ½¶ÓÁÐÍ·²¿µÄÔªËØ + return Q.base[Q.front]; +} +void bfs(){ //ÓÃbfsÀ´ËÑË÷Óë³õʼµã¾àÀë²»³¬¹ý7µÄµãµÄ¸öÊýÕ¼×ÜÊýµÄ°Ù·Ö±È + memset(vis,0,sizeof vis); + InitQueue(Q); + Node cur,next; + cur.id = 0; + cur.step = 0; + EnQueue(Q,cur); + vis[0] = 1; + int num = 0; + while(QueueLength(Q)){ + cur = getHead(Q); + DeQueue(Q); + if(cur.step>7){ + break; + } + num++; + int s = cur.id; + for(int p = head[s];p!=-1;p=edge[p].next){ + int v = edge[p].to; + if(!vis[v]){ + next.id = v; + next.step = cur.step + 1; + vis[v] = 1; + EnQueue(Q,next); + } + } + } + printf("%.4f\n",num*1.0/n); +} +int main(){ +#ifndef ONLINE_JUDGE + freopen("in.txt","r",stdin); +// freopen("out.txt","w",stdout); +#endif + while(sfd(n,m)!=EOF){ //nΪ¶¥µãµÄÊýÁ¿£¬mΪ±ßµÄÊýÁ¿,µãµÄ±àºÅ´Ó0-n-1 + Init(); //³õʼ»¯ + int u,v; + for(int i=0;i +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +#define OK 1 + +typedef char VerTexType; //¶¥µãÐÅÏ¢ +typedef int OtherInfo; //ºÍ±ßÏà¹ØµÄÐÅÏ¢ + +//- - - - -ͼµÄÁÚ½Ó±í´æ´¢±íʾ- - - - - +typedef struct ArcNode{ //±ß½áµã + int adjvex; //¸Ã±ßËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode *nextarc; //Ö¸ÏòÏÂÒ»Ìõ±ßµÄÖ¸Õë + OtherInfo info; //ºÍ±ßÏà¹ØµÄÐÅÏ¢ +}ArcNode; + +typedef struct VNode{ + VerTexType data; //¶¥µãÐÅÏ¢ + ArcNode *firstarc; //Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +}VNode, AdjList[MVNum]; //AdjList±íʾÁÚ½Ó±íÀàÐÍ + +typedef struct{ + AdjList vertices; //ÁÚ½Ó±í + int vexnum, arcnum; //ͼµÄµ±Ç°¶¥µãÊýºÍ±ßÊý +}ALGraph; + + +int LocateVex(ALGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vertices[i].data == v) + return i; + return -1; +}//LocateVex + +int CreateUDG(ALGraph &G){ + //²ÉÓÃÁÚ½Ó±í±íʾ·¨£¬´´½¨ÎÞÏòͼG + int i , k; + + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊýÖмäÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èç a " <> G.vertices[i].data; //ÊäÈë¶¥µãÖµ + G.vertices[i].firstarc=NULL; //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + }//for + cout << endl; + + cout << "ÇëÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã,Èç a b" << endl; + for(k = 0; k < G.arcnum;++k){ //ÊäÈë¸÷±ß£¬¹¹ÔìÁÚ½Ó±í + VerTexType v1 , v2; + int i , j; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄÁ½¸ö¶¥µã + i = LocateVex(G, v1); j = LocateVex(G, v2); + //È·¶¨v1ºÍv2ÔÚGÖÐλÖ㬼´¶¥µãÔÚG.verticesÖеÄÐòºÅ + + ArcNode *p1=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p1->adjvex=j; //ÁÚ½ÓµãÐòºÅΪj + p1->nextarc= G.vertices[i].firstarc; G.vertices[i].firstarc=p1; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + + ArcNode *p2=new ArcNode; //Éú³ÉÁíÒ»¸ö¶Ô³ÆµÄеı߽áµã*p2 + p2->adjvex=i; //ÁÚ½ÓµãÐòºÅΪi + p2->nextarc= G.vertices[j].firstarc; G.vertices[j].firstarc=p2; + //½«Ð½áµã*p2²åÈë¶¥µãvjµÄ±ß±íÍ·²¿ + }//for + return OK; +}//CreateUDG + +int main(){ + cout << "************Ëã·¨6.2¡¡²ÉÓÃÁÚ½Ó±í±íʾ·¨´´½¨ÎÞÏòͼ**************" << endl << endl; + ALGraph G; + CreateUDG(G); + int i; + + cout << endl; + cout << "*****ÁÚ½Ó±í±íʾ·¨´´½¨µÄÎÞÏòͼ*****" << endl; + + for(i = 0 ; i < G.vexnum ; ++i){ + VNode temp = G.vertices[i]; + ArcNode *p = temp.firstarc; + if(p == NULL){ + cout << G.vertices[i].data; + cout << endl; + } + else{ + cout << temp.data; + while(p){ + cout << "->"; + cout << p->adjvex; + p = p->nextarc; + } + } + cout << endl; + } + return 0; +}//main diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第6ç« /6.3.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第6ç« /6.3.cpp new file mode 100644 index 0000000..65cda6f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第6ç« /6.3.cpp @@ -0,0 +1,114 @@ +//Ëã·¨6.3¡¡Éî¶ÈÓÅÏÈËÑË÷±éÀúÁ¬Í¨Í¼µÄµÝ¹éËã·¨ + +#include +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}Graph; + +bool visited[MVNum]; //·ÃÎʱêÖ¾Êý×飬Æä³õֵΪ"false" +int FirstAdjVex(Graph G , int v); //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã +int NextAdjVex(Graph G , int v , int w); //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + +int LocateVex(Graph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(Graph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý , ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èç a£º" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = 0; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬È磺a b" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[j][i] = G.arcs[i][j] = 1; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +void DFS(Graph G, int v){ //´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + cout << G.vexs[v] << " "; visited[v] = true; //·ÃÎʵÚv¸ö¶¥µã£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + int w; + for(w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) + //ÒÀ´Î¼ì²évµÄËùÓÐÁÚ½Óµãw £¬FirstAdjVex(G, v)±íʾvµÄµÚÒ»¸öÁÚ½Óµã + //NextAdjVex(G, v, w)±íʾvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁڽӵ㣬w¡Ý0±íʾ´æÔÚÁÚ½Óµã + if(!visited[w]) DFS(G, w); //¶ÔvµÄÉÐδ·ÃÎʵÄÁÚ½Ó¶¥µãwµÝ¹éµ÷ÓÃDFS +}//DFS + +int FirstAdjVex(Graph G , int v){ + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//FirstAdjVex + +int NextAdjVex(Graph G , int v , int w){ + int i; + for(i = w ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//NextAdjVex + +int main(){ + cout << "************Ëã·¨6.3¡¡Éî¶ÈÓÅÏÈËÑË÷±éÀúÁ¬Í¨Í¼µÄµÝ¹éËã·¨**************" << endl << endl; + Graph G; + CreateUDN(G); + cout << endl; + cout << "ÎÞÏòÁ¬Í¨Í¼G´´½¨Íê³É£¡" << endl << endl; + + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + VerTexType c; + cin >> c; + + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + cout << endl; + while(i >= G.vexnum){ + cout << "¸Ãµã²»´æÔÚ£¬ÇëÖØÐÂÊäÈ룡" << endl; + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + cin >> c; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + } + cout << "Éî¶ÈÓÅÏÈËÑË÷±éÀúÁ¬Í¨Í¼½á¹û£º" << endl; + DFS(G , i); + + cout < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +//-------------ͼµÄÁÚ½Ó¾ØÕó----------------- +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}Graph; + +bool visited[MVNum]; //·ÃÎʱêÖ¾Êý×飬Æä³õֵΪ"false" +int FirstAdjVex(Graph G , int v); //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã +int NextAdjVex(Graph G , int v , int w); //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + +int LocateVex(Graph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(Graph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = 0; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬Èça b" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[j][i] = G.arcs[i][j] = 1; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +void DFS(Graph G, int v){ + //´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + cout << G.vexs[v] << " "; visited[v] = true; //·ÃÎʵÚv¸ö¶¥µã£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + int w; + for(w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) + //ÒÀ´Î¼ì²évµÄËùÓÐÁÚ½Óµãw £¬FirstAdjVex(G, v)±íʾvµÄµÚÒ»¸öÁÚ½Óµã + //NextAdjVex(G, v, w)±íʾvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁڽӵ㣬w¡Ý0±íʾ´æÔÚÁÚ½Óµã + if(!visited[w]) DFS(G, w); //¶ÔvµÄÉÐδ·ÃÎʵÄÁÚ½Ó¶¥µãwµÝ¹éµ÷ÓÃDFS +}//DFS + +void DFSTraverse(Graph G){ + //¶Ô·ÇÁ¬Í¨Í¼G×öÉî¶ÈÓÅÏȱéÀú + int v; + for(v = 0; v < G.vexnum; ++v) visited[v] = false; //·ÃÎʱêÖ¾Êý×é³õʼ»¯ + for(v = 0; v < G.vexnum; ++v) //Ñ­»·µ÷ÓÃËã·¨6.3 + if(!visited[v]) DFS(G, v); //¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS +}//DFSTraverse + +int FirstAdjVex(Graph G , int v){ + //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//FirstAdjVex + +int NextAdjVex(Graph G , int v , int w){ + //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + int i; + for(i = w ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//NextAdjVex + +int main(){ + cout << "************Ëã·¨6.4¡¡Éî¶ÈÓÅÏÈËÑË÷±éÀú·ÇÁ¬Í¨Í¼**************" << endl << endl; + Graph G; + CreateUDN(G); + cout << endl; + cout << "ÎÞÏòͼG´´½¨Íê³É£¡" << endl << endl; + + cout << "Éî¶ÈÓÅÏÈËÑË÷±éÀú·ÇÁ¬Í¨Í¼½á¹û£º" << endl; + DFSTraverse(G); + + cout < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ + +//------------ͼµÄÁÚ½Ó¾ØÕó------------------ +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}Graph; + +bool visited[MVNum]; //·ÃÎʱêÖ¾Êý×飬Æä³õֵΪ"false" +int FirstAdjVex(Graph G , int v); //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã +int NextAdjVex(Graph G , int v , int w); //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + +int LocateVex(Graph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(Graph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" <> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = 0; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬Èça b" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[j][i] = G.arcs[i][j] = 1; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +void DFS(Graph G, int v){ + //ͼGΪÁÚ½Ó¾ØÕóÀàÐÍ + int w; + cout << G.vexs[v] << " "; visited[v] = true; //·ÃÎʵÚv¸ö¶¥µã£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + for(w = 0; w < G.vexnum; w++) //ÒÀ´Î¼ì²éÁÚ½Ó¾ØÕóvËùÔÚµÄÐÐ + if((G.arcs[v][w] != 0)&& (!visited[w])) DFS(G, w); //G.arcs[v][w]!=0±íʾwÊÇvµÄÁڽӵ㣬Èç¹ûwδ·ÃÎÊ£¬ÔòµÝ¹éµ÷ÓÃDFS +}//DFS + +int FirstAdjVex(Graph G , int v){ + //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//FirstAdjVex + +int NextAdjVex(Graph G , int v , int w){ + //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + int i; + for(i = w ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//NextAdjVex + +int main(){ + cout << "************Ëã·¨6.5¡¡²ÉÓÃÁÚ½Ó¾ØÕó±íʾͼµÄÉî¶ÈÓÅÏÈËÑË÷±éÀú**************" << endl << endl; + Graph G; + CreateUDN(G); + cout << endl; + cout << "ÎÞÏòͼG´´½¨Íê³É£¡" << endl << endl; + + cout << "ÇëÊäÈë±éÀúÎÞÏòͼGµÄÆðʼµã£º"; + VerTexType c; + cin >> c; + + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + cout << endl; + while(i >= G.vexnum){ + cout << "¸Ãµã²»´æÔÚ£¬ÇëÖØÐÂÊäÈ룡" << endl; + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + cin >> c; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + } + cout << "Éî¶ÈÓÅÏÈËÑË÷±éÀúÎÞÏòͼG½á¹û£º" << endl; + DFS(G , i); + + cout < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ + +//-------------ͼµÄÁÚ½Ó±í--------------------- +typedef struct ArcNode{ //±ß½áµã + int adjvex; //¸Ã±ßËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode *nextarc; //Ö¸ÏòÏÂÒ»Ìõ±ßµÄÖ¸Õë +}ArcNode; + +typedef struct VNode{ + VerTexType data; //¶¥µãÐÅÏ¢ + ArcNode *firstarc; //Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +}VNode, AdjList[MVNum]; //AdjList±íʾÁÚ½Ó±íÀàÐÍ + +typedef struct{ + AdjList vertices; //ÁÚ½Ó±í + int vexnum, arcnum; //ͼµÄµ±Ç°¶¥µãÊýºÍ±ßÊý +}ALGraph; + +bool visited[MVNum]; //·ÃÎʱêÖ¾Êý×飬Æä³õֵΪ"false" + +int LocateVex(ALGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vertices[i].data == v) + return i; + return -1; +}//LocateVex + +void CreateUDG(ALGraph &G){ + //²ÉÓÃÁÚ½Ó±í±íʾ·¨£¬´´½¨ÎÞÏòͼG + int i , k; + + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ //ÊäÈë¸÷µã£¬¹¹Ôì±íÍ·½áµã±í + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vertices[i].data; //ÊäÈë¶¥µãÖµ + G.vertices[i].firstarc=NULL; //³õʼ»¯±íÍ·½áµãµÄÖ¸ÕëÓòΪNULL + }//for + cout << endl; + + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬Èça b" << endl; + + for(k = 0; k < G.arcnum;++k){ //ÊäÈë¸÷±ß£¬¹¹ÔìÁÚ½Ó±í + VerTexType v1 , v2; + int i , j; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄÁ½¸ö¶¥µã + i = LocateVex(G, v1); j = LocateVex(G, v2); + //È·¶¨v1ºÍv2ÔÚGÖÐλÖ㬼´¶¥µãÔÚG.verticesÖеÄÐòºÅ + + ArcNode *p1=new ArcNode; //Éú³ÉÒ»¸öеı߽áµã*p1 + p1->adjvex=j; //ÁÚ½ÓµãÐòºÅΪj + p1->nextarc= G.vertices[i].firstarc; G.vertices[i].firstarc=p1; + //½«Ð½áµã*p1²åÈë¶¥µãviµÄ±ß±íÍ·²¿ + + ArcNode *p2=new ArcNode; //Éú³ÉÁíÒ»¸ö¶Ô³ÆµÄеı߽áµã*p2 + p2->adjvex=i; //ÁÚ½ÓµãÐòºÅΪi + p2->nextarc= G.vertices[j].firstarc; G.vertices[j].firstarc=p2; + //½«Ð½áµã*p2²åÈë¶¥µãvjµÄ±ß±íÍ·²¿ + }//for +}//CreateUDG + +void DFS(ALGraph G, int v){ //ͼGΪÁÚ½Ó±íÀàÐÍ + cout << G.vertices[v].data << " "; + visited[v] = true; //·ÃÎʵÚv¸ö¶¥µã£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + ArcNode *p = G.vertices[v].firstarc; //pÖ¸ÏòvµÄ±ßÁ´±íµÄµÚÒ»¸ö±ß½áµã + while(p != NULL){ //±ß½áµã·Ç¿Õ + int w = p->adjvex; //±íʾwÊÇvµÄÁÚ½Óµã + if(!visited[w]) DFS(G, w); //Èç¹ûwδ·ÃÎÊ£¬ÔòµÝ¹éµ÷ÓÃDFS + p = p->nextarc; //pÖ¸ÏòÏÂÒ»¸ö±ß½áµã + } +}//DFS + +int main(){ + cout << "************Ëã·¨6.6¡¡²ÉÓÃÁÚ½Ó±í±íʾͼµÄÉî¶ÈÓÅÏÈËÑË÷±éÀú**************" << endl << endl; + ALGraph G; + CreateUDG(G); + cout << endl; + cout << "ÎÞÏòÁ¬Í¨Í¼G´´½¨Íê³É£¡" << endl << endl; + + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + VerTexType c; + cin >> c; + + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vertices[i].data) + break; + } + cout << endl; + while(i >= G.vexnum){ + cout << "¸Ãµã²»´æÔÚ£¬ÇëÖØÐÂÊäÈ룡" << endl; + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + cin >> c; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vertices[i].data) + break; + } + } + + cout << "Éî¶ÈÓÅÏÈËÑË÷±éÀúͼ½á¹û£º" << endl; + DFS(G , i); + + cout < +using namespace std; + +#define MVNum 100 //×î´ó¶¥µãÊý +#define MAXQSIZE 100 //×î´ó¶ÓÁг¤¶È + +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ +bool visited[MVNum]; //·ÃÎʱêÖ¾Êý×飬Æä³õֵΪ"false" + +//-----ͼµÄÁÚ½Ó¾ØÕó´æ´¢±íʾ----- +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}Graph; + +//----¶ÓÁе͍Òå¼°²Ù×÷-------- +typedef struct{ + ArcType *base; //³õʼ»¯µÄ¶¯Ì¬·ÖÅä´æ´¢¿Õ¼ä + int front; //Í·Ö¸Õ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÍ·ÔªËØ + int rear; //βָÕ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÎ²ÔªËØµÄÏÂÒ»¸öλÖà +}sqQueue; + +void InitQueue(sqQueue &Q){ + //¹¹ÔìÒ»¸ö¿Õ¶ÓÁÐQ + Q.base = new ArcType[MAXQSIZE]; + if(!Q.base) exit(1); //´æ´¢·ÖÅäʧ°Ü + Q.front = Q.rear = 0; +}//InitQueue + +void EnQueue(sqQueue &Q, ArcType e){ + //²åÈëÔªËØeΪQµÄеĶÓÎ²ÔªËØ + if((Q.rear + 1) % MAXQSIZE == Q.front) + return; + Q.base[Q.rear] = e; + Q.rear = (Q.rear + 1) % MAXQSIZE; +}//EnQueue + +bool QueueEmpty(sqQueue Q){ + //ÅжÏÊÇ·ñΪ¿Õ¶Ó + if(Q.rear == Q.front) + return true; + return false; +}//QueueEmpty + +void DeQueue(sqQueue &Q, ArcType &u){ + //¶ÓÍ·ÔªËØ³ö¶Ó²¢ÖÃΪu + u = Q.base[Q.front]; + Q.front = (Q.front + 1) % MAXQSIZE; +}//DeQueue +//-------------------------------------------------- + +int LocateVex(Graph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(Graph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = 0; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã£¬Èça b" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã:"; + cin >> v1 >> v2; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = 1; //±ßµÄȨֵÖÃΪw + G.arcs[j][i] = G.arcs[i][j]; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +int FirstAdjVex(Graph G , int v){ + //·µ»ØvµÄµÚÒ»¸öÁÚ½Óµã + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(G.arcs[v][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//FirstAdjVex + +int NextAdjVex(Graph G , int u , int w){ + //·µ»ØvÏà¶ÔÓÚwµÄÏÂÒ»¸öÁÚ½Óµã + int i; + for(i = w ; i < G.vexnum ; ++i){ + if(G.arcs[u][i] == 1 && visited[i] == false) + return i; + } + return -1; +}//NextAdjVex + +void BFS (Graph G, int v){ + //°´¹ã¶ÈÓÅÏȷǵݹé±éÀúÁ¬Í¨Í¼G + sqQueue Q; + ArcType u; + ArcType w; + + cout << G.vexs[v] << " "; visited[v] = true; //·ÃÎʵÚv¸ö¶¥µã£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + InitQueue(Q); //¸¨Öú¶ÓÁÐQ³õʼ»¯£¬ÖÃ¿Õ + EnQueue(Q, v); //v½ø¶Ó + while(!QueueEmpty(Q)){ //¶ÓÁÐ·Ç¿Õ + DeQueue(Q, u); //¶ÓÍ·ÔªËØ³ö¶Ó²¢ÖÃΪu + for(w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w)){ + //ÒÀ´Î¼ì²éuµÄËùÓÐÁÚ½Óµãw £¬FirstAdjVex(G, u)±íʾuµÄµÚÒ»¸öÁÚ½Óµã + //NextAdjVex(G, u, w)±íʾuÏà¶ÔÓÚwµÄÏÂÒ»¸öÁڽӵ㣬w¡Ý0±íʾ´æÔÚÁÚ½Óµã + if(!visited[w]){ //wΪuµÄÉÐδ·ÃÎʵÄÁÚ½Ó¶¥µã + cout << G.vexs[w] << " "; visited[w] = true; //·ÃÎÊw£¬²¢Ö÷ÃÎʱêÖ¾Êý×éÏàÓ¦·ÖÁ¿ÖµÎªtrue + EnQueue(Q, w); //w½ø¶Ó + }//if + }//for + }//while +}//BFS + +int main(){ + cout << "************Ëã·¨6.7¡¡¹ã¶ÈÓÅÏÈËÑË÷±éÀúÁ¬Í¨Í¼**************" << endl << endl; + Graph G; + CreateUDN(G); + cout << endl; + cout << "ÎÞÏòÁ¬Í¨Í¼G´´½¨Íê³É£¡" << endl << endl; + + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + VerTexType c; + cin >> c; + + int i; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + cout << endl; + while(i >= G.vexnum){ + cout << "¸Ãµã²»´æÔÚ£¬ÇëÖØÐÂÊäÈ룡" << endl; + cout << "ÇëÊäÈë±éÀúÁ¬Í¨Í¼µÄÆðʼµã£º"; + cin >> c; + for(i = 0 ; i < G.vexnum ; ++i){ + if(c == G.vexs[i]) + break; + } + } + cout << "Éî¶ÈÓÅÏÈËÑË÷±éÀúÁ¬Í¨Í¼½á¹û£º" << endl; + BFS(G , i); + + cout < +using namespace std; + +typedef char VerTexType; +typedef int ArcType; +#define MVNum 100 +#define MaxInt 32767 //±íʾ¼«´óÖµ£¬¼´¡Þ + +//¸¨ÖúÊý×éµÄ¶¨Ò壬ÓÃÀ´¼Ç¼´Ó¶¥µã¼¯Uµ½V-UµÄȨֵ×îСµÄ±ß +struct{ + VerTexType adjvex; //×îС±ßÔÚUÖеÄÄǸö¶¥µã + ArcType lowcost; //×îС±ßÉϵÄȨֵ +}closedge[MVNum]; + +//- - - - -ͼµÄÁÚ½Ó±í´æ´¢±íʾ- - - - - +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; //¼ÙÉè±ßµÄȨֵÀàÐÍΪÕûÐÍ +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}AMGraph; + +int LocateVex(AMGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(AMGraph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = MaxInt; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ£¬Èça b 5" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + ArcType w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = w; //±ßµÄȨֵÖÃΪw + G.arcs[j][i] = G.arcs[i][j]; //ÖõĶԳƱߵÄȨֵΪw + }//for +}//CreateUDN + +int Min(AMGraph G){ + //·µ»ØÈ¨Öµ×îСµÄµã + int i; + int index = -1; + int min = MaxInt; + for(i = 0 ; i < G.vexnum ; ++i){ + if(min > closedge[i].lowcost && closedge[i].lowcost != 0){ + min = closedge[i].lowcost; + index = i; + } + }//for + return index; +}//Min + +void MiniSpanTree_Prim(AMGraph G, VerTexType u){ + //ÎÞÏòÍøGÒÔÁÚ½Ó¾ØÕóÐÎʽ´æ´¢£¬´Ó¶¥µãu³ö·¢¹¹ÔìGµÄ×îСÉú³ÉÊ÷T£¬Êä³öTµÄ¸÷Ìõ±ß + int k , j , i; + VerTexType u0 , v0; + k =LocateVex(G, u); //kΪ¶¥µãuµÄϱê + for(j = 0; j < G.vexnum; ++j){ //¶ÔV-UµÄÿһ¸ö¶¥µãvi£¬³õʼ»¯closedge[i] + if(j != k){ + closedge[j].adjvex = u; + closedge[j].lowcost = G.arcs[k][j]; //{adjvex, lowcost} + }//if + }//for + closedge[k].lowcost = 0; //³õʼ£¬U = {u} + for(i = 1; i < G.vexnum; ++i){ //Ñ¡ÔñÆäÓàn-1¸ö¶¥µã£¬Éú³Én-1Ìõ±ß(n= G.vexnum) + k = Min(G); + //Çó³öTµÄÏÂÒ»¸ö½áµã£ºµÚk¸ö¶¥µã£¬closedge[k]ÖдæÓе±Ç°×îС±ß + u0 = closedge[k].adjvex; //u0Ϊ×îС±ßµÄÒ»¸ö¶¥µã£¬u0¡ÊU + v0 = G.vexs[k]; //v0Ϊ×îС±ßµÄÁíÒ»¸ö¶¥µã£¬v0¡ÊV-U + cout << "±ß " <" << v0 << endl; //Êä³öµ±Ç°µÄ×îС±ß(u0, v0) + closedge[k].lowcost = 0; //µÚk¸ö¶¥µã²¢ÈëU¼¯ + for(j = 0; j < G.vexnum; ++j) + if(G.arcs[k][j] < closedge[j].lowcost){ //ж¥µã²¢ÈëUºóÖØÐÂÑ¡Ôñ×îС±ß + closedge[j].adjvex = G.vexs[k]; + closedge[j].lowcost = G.arcs[k][j]; + }//if + }//for +}//MiniSpanTree_Prim + +int main(){ + cout << "************Ëã·¨6.8¡¡ÆÕÀïÄ·Ëã·¨**************" << endl << endl; + AMGraph G; + CreateUDN(G); + cout << endl; + cout << "ÎÞÏòͼG´´½¨Íê³É£¡" << endl; + cout < +using namespace std; + +typedef char VerTexType; //¼ÙÉè¶¥µãµÄÊý¾ÝÀàÐÍΪ×Ö·ûÐÍ +typedef int ArcType; +#define MVNum 100 //×î´ó¶¥µãÊý +#define MaxInt 32767 //±íʾ¼«´óÖµ£¬¼´¡Þ + +//----------------ͼµÄÁÚ½Ó¾ØÕó--------------------- +typedef struct{ + VerTexType vexs[MVNum]; //¶¥µã±í + ArcType arcs[MVNum][MVNum]; //ÁÚ½Ó¾ØÕó + int vexnum,arcnum; //ͼµÄµ±Ç°µãÊýºÍ±ßÊý +}AMGraph; + +//¸¨ÖúÊý×éEdgesµÄ¶¨Òå +struct{ + VerTexType Head; //±ßµÄʼµã + VerTexType Tail; //±ßµÄÖÕµã + ArcType lowcost; //±ßÉϵÄȨֵ +}Edge[(MVNum * (MVNum - 1)) / 2]; + +int Vexset[MVNum]; //¸¨ÖúÊý×éVexsetµÄ¶¨Òå + +int LocateVex(AMGraph G , VerTexType v){ + //È·¶¨µãvÔÚGÖеÄλÖà + for(int i = 0; i < G.vexnum; ++i) + if(G.vexs[i] == v) + return i; + return -1; +}//LocateVex + +void CreateUDN(AMGraph &G){ + //²ÉÓÃÁÚ½Ó¾ØÕó±íʾ·¨£¬´´½¨ÎÞÏòÍøG + int i , j , k; + cout <<"ÇëÊäÈë×ܶ¥µãÊý£¬×ܱßÊý£¬ÒÔ¿Õ¸ñ¸ô¿ª:"; + cin >> G.vexnum >> G.arcnum; //ÊäÈë×ܶ¥µãÊý£¬×ܱßÊý + cout << endl; + + cout << "ÊäÈëµãµÄÃû³Æ£¬Èça" << endl; + + for(i = 0; i < G.vexnum; ++i){ + cout << "ÇëÊäÈëµÚ" << (i+1) << "¸öµãµÄÃû³Æ:"; + cin >> G.vexs[i]; //ÒÀ´ÎÊäÈëµãµÄÐÅÏ¢ + } + cout << endl; + for(i = 0; i < G.vexnum; ++i) //³õʼ»¯ÁÚ½Ó¾ØÕ󣬱ߵÄȨֵ¾ùÖÃΪ¼«´óÖµMaxInt + for(j = 0; j < G.vexnum; ++j) + G.arcs[i][j] = MaxInt; + cout << "ÊäÈë±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ£¬Èça b 6" << endl; + for(k = 0; k < G.arcnum;++k){ //¹¹ÔìÁÚ½Ó¾ØÕó + VerTexType v1 , v2; + ArcType w; + cout << "ÇëÊäÈëµÚ" << (k + 1) << "Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ:"; + cin >> v1 >> v2 >> w; //ÊäÈëÒ»Ìõ±ßÒÀ¸½µÄ¶¥µã¼°È¨Öµ + i = LocateVex(G, v1); j = LocateVex(G, v2); //È·¶¨v1ºÍv2ÔÚGÖеÄλÖ㬼´¶¥µãÊý×éµÄϱê + G.arcs[i][j] = w; //±ßµÄȨֵÖÃΪw + G.arcs[j][i] = G.arcs[i][j]; //ÖõĶԳƱߵÄȨֵΪw + Edge[k].lowcost = w; + Edge[k].Head = v1; + Edge[k].Tail = v2; + }//for +}//CreateUDN + +//----------ðÅÝÅÅÐò------------------- +void Sort(AMGraph G){ + int m = G.arcnum - 2; + int flag = 1; + while((m > 0) && flag == 1){ + flag = 0; + for(int j = 0 ; j <= m ; j++){ + if(Edge[j].lowcost > Edge[j+ 1].lowcost){ + flag = 1; + + VerTexType temp_Head = Edge[j].Head; + Edge[j].Head = Edge[j+ 1].Head; + Edge[j + 1].Head = temp_Head; + + + VerTexType temp_Tail = Edge[j].Tail; + Edge[j].Tail = Edge[j+ 1].Tail; + Edge[j + 1].Tail = temp_Tail; + + ArcType temp_lowcost = Edge[j].lowcost; + Edge[j].lowcost = Edge[j+ 1].lowcost; + Edge[j + 1].lowcost = temp_lowcost; + }//if + }//for + --m; + }//while +}//Sort + +void MiniSpanTree_Kruskal(AMGraph G){ + //ÎÞÏòÍøGÒÔÁÚ½Ó¾ØÕóÐÎʽ´æ´¢£¬¹¹ÔìGµÄ×îСÉú³ÉÊ÷T£¬Êä³öTµÄ¸÷Ìõ±ß + int i , j , v1 , v2 , vs1 , vs2; + Sort(G); //½«Êý×éEdgeÖеÄÔªËØ°´È¨Öµ´ÓСµ½´óÅÅÐò + for(i = 0; i < G.vexnum; ++i) //¸¨ÖúÊý×飬±íʾ¸÷¶¥µã×Ô³ÉÒ»¸öÁ¬Í¨·ÖÁ¿ + Vexset[i] = i; + for(i = 0; i < G.arcnum; ++i){ + //ÒÀ´Î²é¿´ÅźÃÐòµÄÊý×éEdgeÖеıßÊÇ·ñÔÚͬһÁ¬Í¨·ÖÁ¿ÉÏ + v1 =LocateVex(G, Edge[i].Head); //v1Ϊ±ßµÄʼµãHeadµÄϱê + v2 =LocateVex(G, Edge[i].Tail); //v2Ϊ±ßµÄÖÕµãTailµÄϱê + vs1 = Vexset[v1]; //»ñÈ¡±ßEdge[i]µÄʼµãËùÔÚµÄÁ¬Í¨·ÖÁ¿vs1 + vs2 = Vexset[v2]; //»ñÈ¡±ßEdge[i]µÄÖÕµãËùÔÚµÄÁ¬Í¨·ÖÁ¿vs2 + if(vs1 != vs2){ //±ßµÄÁ½¸ö¶¥µã·ÖÊô²»Í¬µÄÁ¬Í¨·ÖÁ¿ + cout << Edge[i].Head << "-->" << Edge[i].Tail << endl; //Êä³ö´Ë±ß + for(j = 0; j < G.vexnum; ++j) //ºÏ²¢vs1ºÍvs2Á½¸ö·ÖÁ¿£¬¼´Á½¸ö¼¯ºÏͳһ±àºÅ + if(Vexset[j] == vs2) Vexset[j] = vs1; //¼¯ºÏ±àºÅΪvs2µÄ¶¼¸ÄΪvs1 + }//if + }//for +}//MiniSpanTree_Kruskal + +void main(){ + cout << "************Ëã·¨6.9¡¡¿Ë³˹¿¨¶ûËã·¨**************" << endl << endl; + AMGraph G; + CreateUDN(G); + + cout < +using namespace std; +#define MAXSIZE 100 +#define OK 1; + +typedef struct{ + int key;//¹Ø¼ü×ÖÓò +}ElemType; + +typedef struct{ + ElemType *R; + int length; +}SSTable; + +int InitList_SSTable(SSTable &L) +{ + L.R=new ElemType[MAXSIZE]; + if (!L.R) + { + cout<<"³õʼ»¯´íÎó"; + return 0; + } + L.length=0; + return OK; +} + +int Insert_SSTable(SSTable &L) +{ + int j=0; + for(int i=0;i=1; --i) + if (ST.R[i].key==key) return i; //´ÓºóÍùǰÕÒ + return 0; + }// Search_Seq + +void Show_End(int result,int testkey) +{ + if(result==0) + cout<<"δÕÒµ½"< +using namespace std; + +//Ëã·¨7.10¡¡¹þÏ£±íµÄ²éÕÒ +//- - - - -¿ª·ÅµØÖ··¨¹þÏ£±íµÄ´æ´¢±íʾ- - - - - +#define m 16 //¹þÏ£±íµÄ±í³¤ +#define NULLKEY 0 //µ¥ÔªÎª¿ÕµÄ±ê¼Ç + +struct HashTable{ + int key; //¹Ø¼ü×ÖÏî +// InfoType otherinfo; //ÆäËûÊý¾ÝÏî +}; + +// Ëã·¨7.10Ϊ¹þÏ£±í²éÕÒµÄËã·¨£¬²ÉÓÃÏßÐÔ̽²â·¨´¦Àí³åÍ»¡£ +// ¡¾Ë㷨ʵÏÖ¡¿ + +int H(int key) +{ + int result; + result=key%13; + return result; +} + +int SearchHash(HashTable HT[],int key){ + //ÔÚ¹þÏ£±íHTÖвéÕҹؼü×ÖΪkeyµÄÔªËØ£¬Èô²éÕҳɹ¦£¬·µ»Ø¹þÏ£±íµÄµ¥Ôª±êºÅ£¬·ñÔò·µ»Ø-1 + int H0=H(key); //¸ù¾Ý¹þÏ£º¯ÊýH£¨key£©¼ÆËã¹þÏ£µØÖ· + int Hi; + if (HT[H0].key==NULLKEY) return -1; //Èôµ¥ÔªH0Ϊ¿Õ£¬ÔòËù²éÔªËØ²»´æÔÚ + else if (HT[H0].key==key) return H0; //Èôµ¥ÔªH0ÖÐÔªËØµÄ¹Ø¼ü×ÖΪkey£¬Ôò²éÕҳɹ¦ + else{ + for(int i=1;i +using namespace std; +#define MAXSIZE 100 +#define OK 1; + +typedef struct{ + int key;//¹Ø¼ü×ÖÓò +}ElemType; + +typedef struct{ + ElemType *R; + int length; +}SSTable; + +int InitList_SSTable(SSTable &L) +{ + L.R=new ElemType[MAXSIZE]; + if (!L.R) + { + cout<<"³õʼ»¯´íÎó"; + return 0; + } + L.length=0; + return OK; +} + +int Insert_SSTable(SSTable &L) +{ + int j=1;//¿Õ³öST.R[0]µÄλÖà + for(int i=1;i +using namespace std; +#define MAXSIZE 100 +#define OK 1; + +typedef struct{ + int key;//¹Ø¼ü×ÖÓò +}ElemType; + +typedef struct{ + ElemType *R; + int length; +}SSTable; + +int InitList_SSTable(SSTable &L) +{ + L.R=new ElemType[MAXSIZE]; + if (!L.R) + { + cout<<"³õʼ»¯´íÎó"; + return 0; + } + L.length=0; + return OK; +} + +int Insert_SSTable(SSTable &L) +{ + int j=1; + for(int i=1;i +using namespace std; +#define ENDFLAG '#' +//char a[10]={'5','6','7','2','1','9','8','10','3','4','#'};//È«¾Ö±äÁ¿ +typedef struct ElemType{ + char key; +}ElemType; + +typedef struct BSTNode{ + ElemType data; //½áµãÊý¾ÝÓò + BSTNode *lchild,*rchild; //×óÓÒº¢×ÓÖ¸Õë +}BSTNode,*BSTree; + + +//Ëã·¨7.4¡¡¶þ²æÅÅÐòÊ÷µÄµÝ¹é²éÕÒ +BSTree SearchBST(BSTree T,char key) { + //ÔÚ¸ùÖ¸ÕëTËùÖ¸¶þ²æÅÅÐòÊ÷ÖÐµÝ¹éµØ²éÕÒij¹Ø¼ü×ÖµÈÓÚkeyµÄÊý¾ÝÔªËØ + //Èô²éÕҳɹ¦£¬Ôò·µ»ØÖ¸Ïò¸ÃÊý¾ÝÔªËØ½áµãµÄÖ¸Õ룬·ñÔò·µ»Ø¿ÕÖ¸Õë + if((!T)|| key==T->data.key) return T; //²éÕÒ½áÊø + else if (keydata.key) return SearchBST(T->lchild,key); //ÔÚ×ó×ÓÊ÷ÖмÌÐø²éÕÒ + else return SearchBST(T->rchild,key); //ÔÚÓÒ×ÓÊ÷ÖмÌÐø²éÕÒ +} // SearchBST + + + +//Ëã·¨7.5¡¡¶þ²æÅÅÐòÊ÷µÄ²åÈë +void InsertBST(BSTree &T,ElemType e ) { + //µ±¶þ²æÅÅÐòÊ÷TÖв»´æÔڹؼü×ÖµÈÓÚe.keyµÄÊý¾ÝÔªËØÊ±£¬Ôò²åÈë¸ÃÔªËØ + if(!T) { //ÕÒµ½²åÈëλÖ㬵ݹé½áÊø + BSTree S = new BSTNode; //Éú³Éнáµã*S + S->data = e; //нáµã*SµÄÊý¾ÝÓòÖÃΪe + S->lchild = S->rchild = NULL; //нáµã*S×÷ΪҶ×Ó½áµã + T =S; //°Ñнáµã*SÁ´½Óµ½ÒÑÕÒµ½µÄ²åÈëλÖà + } + else if (e.key< T->data.key) + InsertBST(T->lchild, e ); //½«*S²åÈë×ó×ÓÊ÷ + else if (e.key> T->data.key) + InsertBST(T->rchild, e); //½«*S²åÈëÓÒ×ÓÊ÷ +}// InsertBST + + + +//Ëã·¨7.6¡¡¶þ²æÅÅÐòÊ÷µÄ´´½¨ +void CreateBST(BSTree &T ) { + //ÒÀ´Î¶ÁÈëÒ»¸ö¹Ø¼ü×ÖΪkeyµÄ½áµã£¬½«´Ë½áµã²åÈë¶þ²æÅÅÐòÊ÷TÖÐ + T=NULL; + ElemType e; + cin>>e.key; //??? + while(e.key!=ENDFLAG){ //ENDFLAGΪ×Ô¶¨Òå³£Á¿£¬×÷ΪÊäÈë½áÊø±êÖ¾ + InsertBST(T, e); //½«´Ë½áµã²åÈë¶þ²æÅÅÐòÊ÷TÖÐ + cin>>e.key; //??? + }//while +}//CreatBST + +void DeleteBST(BSTree &T,char key) { + //´Ó¶þ²æÅÅÐòÊ÷TÖÐɾ³ý¹Ø¼ü×ÖµÈÓÚkeyµÄ½áµã + BSTree p=T;BSTree f=NULL; //³õʼ»¯ + BSTree q; + BSTree s; + /*------------ÏÂÃæµÄwhileÑ­»·´Ó¸ù¿ªÊ¼²éÕҹؼü×ÖµÈÓÚkeyµÄ½áµã*p-------------*/ + while(p){ + if (p->data.key == key) break; //ÕÒµ½¹Ø¼ü×ÖµÈÓÚkeyµÄ½áµã*p£¬½áÊøÑ­»· + f=p; //*fΪ*pµÄË«Ç×½áµã + if (p->data.key> key) p=p->lchild; //ÔÚ*pµÄ×ó×ÓÊ÷ÖмÌÐø²éÕÒ + else p=p->rchild; //ÔÚ*pµÄÓÒ×ÓÊ÷ÖмÌÐø²éÕÒ + }//while +if(!p) return; //ÕÒ²»µ½±»É¾½áµãÔò·µ»Ø +/*¨D¿¼ÂÇÈýÖÖÇé¿öʵÏÖpËùÖ¸×ÓÊ÷ÄÚ²¿µÄ´¦Àí£º*p×óÓÒ×ÓÊ÷¾ù²»¿Õ¡¢ÎÞÓÒ×ÓÊ÷¡¢ÎÞ×ó×ÓÊ÷¨D*/ +if ((p->lchild)&& (p->rchild)) { //±»É¾½áµã*p×óÓÒ×ÓÊ÷¾ù²»¿Õ + q = p; + s = p->lchild; + while (s->rchild) //ÔÚ*pµÄ×ó×ÓÊ÷ÖмÌÐø²éÕÒÆäǰÇý½áµã£¬¼´×îÓÒϽáµã + {q = s; s = s->rchild;} //ÏòÓÒµ½¾¡Í· + p->data = s->data; //sÖ¸Ïò±»É¾½áµãµÄ¡°Ç°Çý¡± + if(q!=p){ + q->rchild = s->lchild; //ÖØ½Ó*qµÄÓÒ×ÓÊ÷ + } + else q->lchild = s->lchild; //ÖØ½Ó*qµÄ×ó×ÓÊ÷ + delete s; + }//if +else{ + if(!p->rchild) { //±»É¾½áµã*pÎÞÓÒ×ÓÊ÷£¬Ö»ÐèÖØ½ÓÆä×ó×ÓÊ÷ + q = p; p = p->lchild; + }//else if + else if(!p->lchild) { //±»É¾½áµã*pÎÞ×ó×ÓÊ÷£¬Ö»ÐèÖØ½ÓÆäÓÒ×ÓÊ÷ + q = p; p = p->rchild; + }//else if + /*¨D¨D¨D¨D¨D¨D¨D¨D¨D¨D½«pËùÖ¸µÄ×ÓÊ÷¹Ò½Óµ½ÆäË«Ç×½áµã*fÏàÓ¦µÄλÖèD¨D¨D¨D¨D¨D¨D¨D*/ + if(!f) T=p; //±»É¾½áµãΪ¸ù½áµã + else if (q==f->lchild) f->lchild = p; //¹Ò½Óµ½*fµÄ×ó×ÓÊ÷λÖà + else f->rchild = p; //¹Ò½Óµ½*fµÄÓÒ×ÓÊ÷λÖà + delete q; + } +}//DeleteBST + +//Ëã·¨ 7.7¡¡¶þ²æÅÅÐòÊ÷µÄɾ³ý + +//ÖÐÐò±éÀú +void InOrderTraverse(BSTree &T) +{ + if(T) + { + InOrderTraverse(T->lchild); + cout<data.key; + InOrderTraverse(T->rchild); + } +} + +void main() +{ + BSTree T; + cout<<"ÇëÊäÈëÈô¸É×Ö·û£¬ÓûسµÇø·Ö£¬ÒÔ#½áÊøÊäÈë"<>key; + BSTree result=SearchBST(T,key); + if(result) + {cout<<"ÕÒµ½×Ö·û"<>key; + DeleteBST(T,key); + cout<<"µ±Ç°ÓÐÐò¶þ²æÊ÷ÖÐÐò±éÀú½á¹ûΪ"< +using namespace std; +#define FALSE 0 +#define TRUE 1 +#define OK 1 +#define m 3 //B-Ê÷µÄ½×£¬ÔÝÉèΪ3 +typedef struct BTNode{ + int keynum; //½áµãÖйؼü×ֵĸöÊý£¬¼´½áµãµÄ´óС + BTNode *parent; //Ö¸ÏòË«Ç×½áµã + int key[m+1]; //¹Ø¼ü×ÖʸÁ¿£¬0ºÅµ¥ÔªÎ´Óà + BTNode *ptr[m+1]; //×ÓÊ÷Ö¸ÕëʸÁ¿ +}BTNode,*BTree; + +//- - - - - B-Ê÷µÄ²éÕÒ½á¹ûÀàÐͶ¨Òå- - - - - +struct Result{ + BTNode *pt; //Ö¸ÏòÕÒµ½µÄ½áµã + int i; //1..m£¬ÔÚ½áµãÖеĹؼü×ÖÐòºÅ + int tag; //1£º²éÕҳɹ¦£¬0£º²éÕÒʧ°Ü +}; + + +int Search(BTree T,int key) +{ + BTree p=T; + int endnum; + if(p) //Ê÷²»Îª¿Õʱ + { + endnum=p->keynum; //»ñµÃÊ×½Úµã°üº¬µÄ¼Ç¼¸öÊý + } + else + { + return 0; //·µ»ØÃ»ÕÒµ½ + } + int i=0; + if(endnum==0) + { + return i; //Ê÷´æÔÚ£¬µ«½öÓÐÒ»¸öΪ¿Õ¸ù½Úµã + } + else if(key>=p->key[endnum])//½Úµã²»Îª¿Õ£¬µ«µ±Ç°Öµ±È×î´óµÄkey»¹´ó + { + i=endnum; + return i; + } + else if(key<=p->key[1]) //½Úµã²»Îª¿Õ£¬µ«µ±Ç°Öµ±È×îСµÄkey»¹Ð¡ + { + return i;} + else + { + for(i=1;ikey[i]<=key && keykey[i+1]) + return i; + } + } +} + +void Insert(BTree &q,int i,int x,BTree &ap) +{//½«x²åÈëq½áµãµÄi+1λÖÃÖÐ + int j; + for(j=m-1;j>i;j--) + { + //½«²åÈëλÖÃÖ®ºóµÄkeyÈ«²¿ºóÒÆÒ»Î» + q->key[j+1]=q->key[j]; + } + for(j=m;j>i;j--) + { + //ÏàÓ¦µØÒ²Òƶ¯ÆäºóptrµÄλÖà + q->ptr[j]=q->ptr[j-1]; + } + q->key[i+1]=x;//²åÈëxµ½¸ÃλÖà + q->ptr[i+1]=ap; + q->keynum++; +} + +void split(BTree &q,int s,BTree &ap) +{ //½«q->key[s+1,..,m], q->ptr[s+1,..,m]ÒÆÈëнáµã*ap×÷ΪÓÒ½áµã + //Ô­½áµã×÷ΪеÄ×ó²à½áµã + //ÖмäÖµ±»±£´æÔÚap[0]->keyÖУ¬µÈ´ýÕÒµ½Ìø×ª»ØInsertBTree£¨£©Ñ°ÕÒµ½µ½ºÏÊʵIJåÈëλÖòåÈë + int i; + ap=new BTNode; + for(i=s+1;i<=m;i++) + { //½«q->key[s+1,..,m]±£´æµ½ap->key[0,..,m-s+1]ÖÐ + //½«q->ptr[s+1,..,m]±£´æµ½ap->ptr[0,..,m-s+1]ÖÐ + ap->key[i-s-1]=q->key[i]; + ap->ptr[i-s-1]=q->ptr[i]; + } + if(ap->ptr[0]) + { + //µ±apÓÐ×ÓÊ÷µÄʱºò + for(i=0;i<=1;i++) + { + //½«apµÄ×ÓÊ÷µÄ¸¸Ç׸ÄΪap×Ô¼º + ap->ptr[i]->parent=ap; + } + } + ap->keynum=(m-s)-1; + ap->parent=q->parent;//½«apµÄ¸¸Ç׸ÄΪqµÄ¸¸Ç× + + q->keynum=q->keynum-(m-s);//ÐÞ¸ÄqµÄ¼Ç¼¸öÊý +} + +void NewRoot(BTree &T,BTree q,int x,BTree &ap)//Éú³Éº¬ÐÅÏ¢£¨T, x, ap£©µÄеĸù½áµã*T£¬Ô­TºÍapΪ×ÓÊ÷Ö¸Õë +{ + BTree newT=new BTNode;//н¨Ò»¸ö½áµã×÷Ϊеĸù + + newT->key[1]=x;//дÈëиùµÄkey[1] + newT->ptr[0]=T;//½«Ô­À´µÄÊ÷¸ù×÷ΪиùµÄ×ó×ÓÊ÷ + newT->ptr[1]=ap;//ap×÷ΪиùµÄÓÒ×ÓÊ÷ + newT->keynum=1; + newT->parent=NULL;//иùµÄ¸¸Ç×Ϊ¿Õ + + ap->parent=newT;//apµÄ¸¸Ç×Ϊиù + T->parent=newT;//TµÄ¸¸Ç×Ϊиù + + T=newT;//Ê÷¸Ä³ÉиùÒýµ¼µÄ +} + +//Ëã·¨7.9¡¡B-Ê÷µÄ²åÈë +int InsertBTree(BTree &T,int K,BTree q,int i){ + int x=K; + BTree ap=NULL; + int finished=FALSE;//x±íʾвåÈëµÄ¹Ø¼ü×Ö£¬apΪһ¸ö¿ÕÖ¸Õë + while(q&&!finished){ + Insert(q,i,x,ap); //½«xºÍap·Ö±ð²åÈëµ½q->key[i+1]ºÍq->ptr[i+1] + if (q->keynumkey[0];// x=q->key[s]; + //½«q->key[s+1..m], q->ptr[s..m]ºÍq->recptr[s+1..m] ÒÆÈëнáµã*ap + q=q->parent; + if(q) + { + i=Search(q,x); + } //ÔÚË«Ç×½áµã*qÖвéÕÒxµÄ²åÈëλÖà + } //else + } //while + if(!finished) //TÊÇ¿ÕÊ÷£¨²ÎÊýq³õֵΪNULL£©»òÕ߸ù½áµãÒÑ·ÖÁÑΪ½áµã*qºÍ*ap + NewRoot(T,q,x,ap); //Éú³Éº¬ÐÅÏ¢£¨T, x, ap£©µÄеĸù½áµã*T£¬Ô­TºÍapΪ×ÓÊ÷Ö¸Õë + return OK; +} //InsertBTree //InsertBTree + +//Ëã·¨7.8¡¡B-Ê÷µÄ²éÕÒ +Result SearchBTree(BTree &T, int key){ + /*ÔÚm½×B-Ê÷TÉϲéÕҹؼü×Ökey£¬·µ»Ø½á¹û(pt,i,tag)¡£Èô²éÕҳɹ¦£¬ÔòÌØÕ÷Öµtag=1£¬Ö¸ÕëptËùÖ¸½áµãÖеÚi¸ö¹Ø¼ü×ÖµÈÓÚkey£»·ñÔòÌØÕ÷Öµtag=0£¬µÈÓÚkeyµÄ¹Ø¼ü×ÖÓ¦²åÈëÔÚÖ¸ÕëptËùÖ¸½áµãÖеÚiºÍµÚi+1¸ö¹Ø¼ü×ÖÖ®¼ä*/ + BTree p=T; + BTree q=NULL; + int found=FALSE; + int i=0; //³õʼ»¯£¬pÖ¸Ïò´ý²é½áµã£¬qÖ¸ÏòpµÄË«Ç× +while(p&&!found){ + i=Search(p,key); + //ÔÚp-£¾key[1..keynum]ÖвéÕÒi£¬Ê¹µÃ£ºp-£¾key[i]£¼=key£¼p-£¾key[i+1] + if(i>0&&p->key[i]==key) + found=TRUE; //ÕÒµ½´ý²é¹Ø¼ü×Ö + else + { + q=p; + p=p->ptr[i]; + } + } + Result result; +if(found) +{ + result.pt=p; + result.i=i; + result.tag=1; + return result; +} //²éÕҳɹ¦ +else +{ + result.pt=q; + result.i=i; + result.tag=0; + return result; +} //²éÕÒ²»³É¹¦£¬·µ»ØKµÄ²åÈëλÖÃÐÅÏ¢ +}//SearchBTree + +void InitialBTree(BTree &T) +{ + //³õʼ»¯Ò»¸ö¿ÕµÄ¸ù + T->keynum=0; + T->parent=NULL; + for(int i=0;iptr[i]=NULL; + } +} + + + +void main() +{ + BTree T=new BTNode; + InitialBTree(T); + //ÏÈÓÃSearchBTree()ÕÒµ½Òª²åÈëµÄλÖ㬵õ½Ò»¸öResult½á¹¹Ìå + //ÔÙÓÃInsertBTree()²åÈëÊý¾Ý + Result result; + int a[11]={45,24,53,90,3,12,50,61,70,100}; + for(int i=0;i<10;i++) + { + result=SearchBTree(T,a[i]); + if(result.tag==0) + { + InsertBTree(T,a[i],result.pt,result.i); + } + } + cout<<"OK"; +} + diff --git a/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第8ç« /8.1.cpp b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第8ç« /8.1.cpp new file mode 100644 index 0000000..e344e5f --- /dev/null +++ b/æ•°æ�®ç»“æž„/严版教æ��/æ•°æ�®ç»“构第2版-书中算法(C语言版)/第8ç« /8.1.cpp @@ -0,0 +1,65 @@ +//Ëã·¨8.1 Ö±½Ó²åÈëÅÅÐò +#include +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +void InsertSort(SqList &L) +{ + //¶Ô˳Ðò±íL×öÖ±½Ó²åÈëÅÅÐò + int i,j; + for(i=2;i<=L.length;++i) + if(L.r[i].key>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}RedType; + +void Create_Sq(RedType *R) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýºÏ²¢µÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=0;i>R[i].key; +} + +void Merge(RedType R[],RedType T[],int low,int mid,int high) +{ + //½«ÓÐÐò±íR[low..mid]ºÍR[mid+1..high]¹é²¢ÎªÓÐÐò±íT[low..high] + int i,j,k; + i=low; j=mid+1;k=low; + while(i<=mid&&j<=high) + { + //½«RÖмǼÓÉСµ½´óµØ²¢ÈëTÖÐ + if(R[i].key<=R[j].key) T[k++]=R[i++]; + else T[k++]=R[j++]; + } + while(i<=mid) //½«Ê£ÓàµÄR[low..mid]¸´ÖƵ½TÖÐ + T[k++]=R[i++]; + while(j<=high) //½«Ê£ÓàµÄR[j.high]¸´ÖƵ½TÖÐ + T[k++]=R[j++]; +}//Merge +void show(RedType *T,int low,int high) +{ + int i; + for(i=low;i<=high;i++) + cout<>low>>mid>>high; + Merge(R,T,low,mid,high); + cout<<"ºÏ²¢ºóµÄ½á¹ûΪ£º"< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}RedType; + +typedef struct +{ + RedType *r; + int length; +}SqList; + +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +//ÓÃËã·¨8.10 ÏàÁÚÁ½¸öÓÐÐò×ÓÐòÁеĹ鲢 +void Merge(RedType R[],RedType T[],int low,int mid,int high) +{ + //½«ÓÐÐò±íR[low..mid]ºÍR[mid+1..high]¹é²¢ÎªÓÐÐò±íT[low..high] + int i,j,k; + i=low; j=mid+1;k=low; + while(i<=mid&&j<=high) + { + //½«RÖмǼÓÉСµ½´óµØ²¢ÈëTÖÐ + if(R[i].key<=R[j].key) T[k++]=R[i++]; + else T[k++]=R[j++]; + } + while(i<=mid) //½«Ê£ÓàµÄR[low..mid]¸´ÖƵ½TÖÐ + T[k++]=R[i++]; + while(j<=high) //½«Ê£ÓàµÄR[j.high]¸´ÖƵ½TÖÐ + T[k++]=R[j++]; +}//Merge + +void MSort(RedType R[],RedType T[],int low,int high) +{ + //R[low..high]¹é²¢ÅÅÐòºó·ÅÈëT[low..high]ÖÐ + int mid; + RedType *S=new RedType[MAXSIZE]; + if(low==high) T[low]=R[low]; + else + { + mid=(low+high)/2; //½«µ±Ç°ÐòÁÐÒ»·ÖΪ¶þ£¬Çó³ö·ÖÁѵãmid + MSort(R,S,low,mid); //¶Ô×ÓÐòÁÐR[low..mid] µÝ¹é¹é²¢ÅÅÐò£¬½á¹û·ÅÈëS[low..mid] + MSort(R,S,mid+1,high); //¶Ô×ÓÐòÁÐR[mid+1..high] µÝ¹é¹é²¢ÅÅÐò£¬½á¹û·ÅÈëS[mid+1..high] + Merge(S,T,low,mid,high); //½«S[low..mid]ºÍS [mid+1..high]¹é²¢µ½T[low..high] + }//else +}// MSort + +void MergeSort(SqList &L) +{ + //¶Ô˳Ðò±íL×ö¹é²¢ÅÅÐò + MSort(L.r,L.r,1,L.length); +}//MergeSort +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +#include +#include +#include +#define MAXNUM_KEY 8 //¹Ø¼ü×ÖÏîÊýµÄ×î´óÖµ +#define RADIX 10 //¹Ø¼ü×Ö»ùÊý£¬´ËʱÊÇÊ®½øÖÆÕûÊýµÄ»ùÊý +#define MAX_SPACE 10000 +typedef char KeysType; //¶¨Ò幨¼ü×ÖÀàÐÍΪ×Ö·ûÐÍ +typedef int InfoType; //¶¨ÒåÆäËüÊý¾ÝÏîµÄÀàÐÍ +typedef struct +{ + KeysType keys[MAXNUM_KEY]; //¹Ø¼ü×Ö + InfoType otheritems; //ÆäËûÊý¾ÝÏî + int next; +}SLCell; //¾²Ì¬Á´±íµÄ½áµãÀàÐÍ +typedef struct +{ + SLCell r[MAX_SPACE]; //¾²Ì¬Á´±íµÄ¿ÉÀûÓÿռ䣬r[0]Ϊͷ½áµã + int keynum; //¼Ç¼µÄµ±Ç°¹Ø¼ü×Ö¸öÊý + int recnum; //¾²Ì¬Á´±íµÄµ±Ç°³¤¶È +}SLList; //¾²Ì¬Á´±íÀàÐÍ +typedef int ArrType[RADIX]; //Ö¸ÕëÊý×éÀàÐÍ + +void InitList(SLList *L) +{ + //³õʼ»¯¾²Ì¬Á´±íL£¨°ÑÊý×éDÖеÄÊý¾Ý´æÓÚLÖУ© + char c[MAXNUM_KEY],c1[MAXNUM_KEY]; + int i,j,n,max; //maxΪ¹Ø¼ü×ÖµÄ×î´óÖµ + max=-10000; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; + while(n>MAX_SPACE) + { + cout<<"ÄúÊäÈëµÄ¸öÊý³¬¹ýÉÏÏÞ£¬ÇëÖØÐÂÊäÈ룬²»³¬¹ý"<>n; + } + int *D=new int[n]; + cout<<"ÇëÊäÈë"<>D[i]; + if(max=0;j--) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±í + +void BInsertSort(SqList &L){ + //¶Ô˳Ðò±íL×öÕÛ°ë²åÈëÅÅÐò + int i,j,low,high,m; + for(i=2;i<=L.length;++i) + { + L.r[0]=L.r[i]; //½«´ý²åÈëµÄ¼Ç¼ÔÝ´æµ½¼àÊÓÉÚÖÐ + low=1; high=i-1; //ÖòéÕÒÇø¼ä³õÖµ + while(low<=high) + { //ÔÚr[low..high]ÖÐÕÛ°ë²éÕÒ²åÈëµÄλÖà + m=(low+high)/2; //ÕÛ°ë + if(L.r[0].key=high+1;--j) L.r[j+1]=L.r[j]; //¼Ç¼ºóÒÆ + L.r[high+1]=L.r[0]; //½«r[0]¼´Ô­r[i]£¬²åÈëµ½ÕýȷλÖà + } //for +} //BInsertSort + +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý£º\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +void ShellInsert(SqList &L,int dk) +{ + //¶Ô˳Ðò±íL×öÒ»ÌËÔöÁ¿ÊÇdkµÄÏ£¶û²åÈëÅÅÐò + int i,j; + for(i=dk+1;i<=L.length;++i) + if(L.r[i].key0&& L.r[0].key>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý£º\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout<>t; + for(i=0;i>dt[i]; + } + ShellSort(L,dt,t); + cout<<"ÅÅÐòºóµÄ½á¹ûΪ£º"< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +void BubbleSort(SqList &L) +{ + //¶Ô˳Ðò±íL×öðÅÝÅÅÐò + int m,j,flag; + ElemType t; + m=L.length-1; flag=1; //flagÓÃÀ´±ê¼ÇijһÌËÅÅÐòÊÇ·ñ·¢Éú½»»» + while((m>0)&&(flag==1)) + { + flag=0; //flagÖÃΪ0£¬Èç¹û±¾ÌËÅÅÐòûÓз¢Éú½»»»£¬Ôò²»»áÖ´ÐÐÏÂÒ»ÌËÅÅÐò + for(j=1;j<=m;j++) + if(L.r[j].key>L.r[j+1].key) + { + flag=1; //flagÖÃΪ1£¬±íʾ±¾ÌËÅÅÐò·¢ÉúÁ˽»»» + t=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=t; //½»»»Ç°ºóÁ½¸ö¼Ç¼ + } //if + --m; + } //while +} //BubbleSort + +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + + +int Partition(SqList &L,int low,int high) +{ + //¶Ô˳Ðò±íLÖеÄ×Ó±ír[low..high]½øÐÐÒ»ÌËÅÅÐò£¬·µ»ØÊàÖáλÖà + int pivotkey; + L.r[0]=L.r[low]; //ÓÃ×Ó±íµÄµÚÒ»¸ö¼Ç¼×öÊàÖá¼Ç¼ + pivotkey=L.r[low].key; //ÊàÖá¼Ç¼¹Ø¼ü×Ö±£´æÔÚpivotkeyÖÐ + while(low=pivotkey) --high; + L.r[low]=L.r[high]; //½«±ÈÊàÖá¼Ç¼СµÄ¼ÇÂ¼ÒÆµ½µÍ¶Ë + while(low>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + + +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +void SelectSort(SqList &L) +{ + //¶Ô˳Ðò±íL×ö¼òµ¥Ñ¡ÔñÅÅÐò + int i,j,k; + ElemType t; + for(i=1;i>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +void HeapAdjust(SqList &L,int s,int m) +{ + //¼ÙÉèr[s+1..m]ÒѾ­ÊǶѣ¬½«r[s..m]µ÷ÕûΪÒÔr[s]Ϊ¸ùµÄ´ó¸ù¶Ñ + ElemType rc; + int j; + rc=L.r[s]; + for(j=2*s;j<=m;j*=2) + { //ÑØkey½Ï´óµÄº¢×Ó½áµãÏòÏÂɸѡ + if(j=L.r[j].key) break; //rcÓ¦²åÈëÔÚλÖÃsÉÏ + L.r[s]=L.r[j]; s=j; + } + L.r[s]=rc; //²åÈë +} //HeapAdjust + +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýµ÷ÕûµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +//ÓÃËã·¨8.7 ɸѡ·¨µ÷Õû¶Ñ +void HeapAdjust(SqList &L,int s,int m) +{ + //¼ÙÉèr[s+1..m]ÒѾ­ÊǶѣ¬½«r[s..m]µ÷ÕûΪÒÔr[s]Ϊ¸ùµÄ´ó¸ù¶Ñ + ElemType rc; + int j; + rc=L.r[s]; + for(j=2*s;j<=m;j*=2) + { //ÑØkey½Ï´óµÄº¢×Ó½áµãÏòÏÂɸѡ + if(j=L.r[j].key) break; //rcÓ¦²åÈëÔÚλÖÃsÉÏ + L.r[s]=L.r[j]; s=j; + } + L.r[s]=rc; //²åÈë +} //HeapAdjust + +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈëÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +void CreatHeap(SqList &L) +{ + //°ÑÎÞÐòÐòÁÐL.r[1..n]½¨³É´ó¸ù¶Ñ + int i,n; + n=L.length; + for(i=n/2;i>0;--i) //·´¸´µ÷ÓÃHeapAdjust + HeapAdjust(L,i,n); +} //CreatHeap +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout< +using namespace std; +#define MAXSIZE 20 //˳Ðò±íµÄ×î´ó³¤¶È +typedef struct +{ + int key; + char *otherinfo; +}ElemType; +//˳Ðò±íµÄ´æ´¢½á¹¹ +typedef struct +{ + ElemType *r; //´æ´¢¿Õ¼äµÄ»ùµØÖ· + int length; //˳Ðò±í³¤¶È +}SqList; //˳Ðò±íÀàÐÍ + +//ÓÃËã·¨8.7 ɸѡ·¨µ÷Õû¶Ñ +void HeapAdjust(SqList &L,int s,int m) +{ + //¼ÙÉèr[s+1..m]ÒѾ­ÊǶѣ¬½«r[s..m]µ÷ÕûΪÒÔr[s]Ϊ¸ùµÄ´ó¸ù¶Ñ + ElemType rc; + int j; + rc=L.r[s]; + for(j=2*s;j<=m;j*=2) + { //ÑØkey½Ï´óµÄº¢×Ó½áµãÏòÏÂɸѡ + if(j=L.r[j].key) break; //rcÓ¦²åÈëÔÚλÖÃsÉÏ + L.r[s]=L.r[j]; s=j; + } + L.r[s]=rc; //²åÈë +} + //HeapAdjust +void Create_Sq(SqList &L) +{ + int i,n; + cout<<"ÇëÊäÈëÊý¾Ý¸öÊý£¬²»³¬¹ý"<>n; //ÊäÈë¸öÊý + cout<<"ÇëÊäÈë´ýÅÅÐòµÄÊý¾Ý:\n"; + while(n>MAXSIZE) + { + cout<<"¸öÊý³¬¹ýÉÏÏÞ£¬²»Äܳ¬¹ý"<>n; + } + for(i=1;i<=n;i++) + { + cin>>L.r[i].key; + L.length++; + } +} + +//ÓÃËã·¨8.8 ½¨³õ¶Ñ +void CreatHeap(SqList &L) +{ + //°ÑÎÞÐòÐòÁÐL.r[1..n]½¨³É´ó¸ù¶Ñ + int i,n; + n=L.length; + for(i=n/2;i>0;--i) //·´¸´µ÷ÓÃHeapAdjust + HeapAdjust(L,i,n); +} //CreatHeap + +void HeapSort(SqList &L) +{ + //¶Ô˳Ðò±íL½øÐжÑÅÅÐò + int i; + ElemType x; + CreatHeap(L); //°ÑÎÞÐòÐòÁÐL.r[1..L.length]½¨³É´ó¸ù¶Ñ + for(i=L.length;i>1;--i) + { + x=L.r[1]; //½«¶Ñ¶¥¼Ç¼ºÍµ±Ç°Î´¾­ÅÅÐò×ÓÐòÁÐL.r[1..i]ÖÐ×îºóÒ»¸ö¼Ç¼»¥»» + L.r[1]=L.r[i]; + L.r[i]=x; + HeapAdjust(L,1,i-1); //½«L.r[1..i-1]ÖØÐµ÷ÕûΪ´ó¸ù¶Ñ + }//for +}//HeapSort +void show(SqList L) +{ + int i; + for(i=1;i<=L.length;i++) + cout<