diff --git a/Chapter2/2-1-SqList/SqList.cpp b/Chapter2/2-1-SqList/SqList.cpp index 65f8a5f..86c7dba 100644 --- a/Chapter2/2-1-SqList/SqList.cpp +++ b/Chapter2/2-1-SqList/SqList.cpp @@ -1,4 +1,4 @@ -// 2-1-SqList-˳ +// 2-1-SqList-顺序表 #include //cout,cin using namespace std; @@ -8,147 +8,147 @@ char pause; void dispmenu() { - //ʾ˵ + //显示主菜单 cout << endl; - cout << "*** ˳ ***\n"; - cout << " 1-ʼ˳\n"; - cout << " 2-˳\n"; - cout << " 3-ȡiԪ\n"; - cout << " 4-ֵԪλ\n"; - cout << " 5-iԪ\n"; - cout << " 6-ɾiԪ\n"; - cout << " 7-޸ĵiԪ\n"; - cout << " 8-ձ\n"; - cout << " 9-\n"; - cout << " 10-\n"; - cout << " 11-\n"; - cout << " 12-ʾ\n"; - cout << " 13-ֵǰ\n"; - cout << " 0-˳\n"; + cout << "*** 顺 序 表 ***\n"; + cout << " 1-初始化顺序表\n"; + cout << " 2-创建顺序表\n"; + cout << " 3-获取第i个元素\n"; + cout << " 4-按值查找元素位序\n"; + cout << " 5-插入第i个元素\n"; + cout << " 6-删除第i个元素\n"; + cout << " 7-修改第i个元素\n"; + cout << " 8-清空表\n"; + cout << " 9-测表长\n"; + cout << " 10-测表空\n"; + cout << " 11-测表满\n"; + cout << " 12-显示表\n"; + cout << " 13-按值查找前驱\n"; + cout << " 0-退出\n"; } -// +//主函数 void main() { int i; int e, pre_e; - SqList L; //Ϊ20ԪΪ͵Ŀ˳ - system("cls"); //ִϵͳcls + SqList L; //建立容量为20、元素类型为整型的空顺序表 + system("cls"); //执行系统命令cls,清屏 int choice; do { - dispmenu(); //ʾ˵ - cout << "Enter choice(1~120 ˳):"; + dispmenu(); //显示主菜单 + cout << "Enter choice(1~12,0 退出):"; cin >> choice; switch (choice) { - case 1: //ʼԱ - cout << "Ҫ˳ijȣ"; + case 1: //初始化线性表 + cout << "请输入要创建的顺序表的长度:"; cin >> i; cout << endl; InitList(L, i); - cout << endl << "ɹ" << endl; + cout << endl << "创建成功!" << endl; break; - case 2: //Ա - cout << "ҪԪظ:"; + case 2: //创建线性表 + cout << "请输入要创建的元素个数:"; cin >> i; cout << endl; CreateList(L, i); - cout << "˳ԪΪ\n"; //ʾԪ + cout << "创建的顺序表元素为:\n"; //显示表元素 DispList(L); cout << endl; break; - case 3: //ȡiԪ - cout << "Ԫ:"; + case 3: //获取第i个元素 + cout << "请输入元素序号:"; cin >> i; cout << endl; if (GetElem_i(L, i, e)) - cout << endl << "" << i << "ԪΪ:" << e << endl; + cout << endl << "第" << i << "个元素为:" << e << endl; else - cout << endl << "Ԫزڣ" << endl; + cout << endl << "元素不存在!" << endl; break; - case 4: //ֵ - cout << "ҪѯԪֵ:"; + case 4: //按值查找 + cout << "请输入要查询的元素值:"; cin >> e; i = LocateElem_e(L, e); if (i) - cout << endl << e << "ǵ" << i << "Ԫ" << endl; + cout << endl << e << "是第" << i << "个数据元素" << endl; else - cout << endl << "ڴԪأ" << endl; + cout << endl << "不存在此元素!" << endl; break; - case 5: // ڵiλòԪ - cout << "λã" << endl; + case 5: // 在第i个位置插入元素 + cout << "输入插入位置:" << endl; cin >> i; - cout << "Ԫֵ" << endl; + cout << "输入插入元素值:" << endl; cin >> e; if (InsertElem_i(L, i, e)) { - cout << endl << "ɹ" << endl; + cout << endl << "插入成功!" << endl; DispList(L); } else - cout << endl << "벻ɹ" << endl;; + cout << endl << "插入不成功!" << endl;; break; - case 6: //ɾiԪ - cout << "ɾԪλã" << endl; + case 6: //删除第i个元素 + cout << "输入删除元素位置:" << endl; cin >> i; if (DeleElem_i(L, i)) { - cout << endl << "ɾɹ" << endl; + cout << endl << "删除成功!" << endl; DispList(L); } else - cout << endl << "ɾʧܣ" << endl; + cout << endl << "删除失败!" << endl; break; - case 7: //޸ĵiԪصֵ - cout << "޸Ԫλã" << endl; + case 7: //修改第i个元素的值 + cout << "输入修改元素位置:" << endl; cin >> i; - cout << "Ԫֵ" << endl; + cout << "输入新元素值:" << endl; cin >> e; if (PutElem(L, i, e)) { - cout << endl << "޸ijɹ" << endl; + cout << endl << "修改成功!" << endl; DispList(L); } else - cout << endl << "޸ʧܣ" << endl; + cout << endl << "修改失败!" << endl; break; - case 8: // ձ + case 8: // 清空表 ClearList(L); break; - case 9: // - cout << "Ϊ" << ListLength(L) << endl; + case 9: // 测表长 + cout << "表长为:" << ListLength(L) << endl; break; - case 10: // + case 10: //测表空 if (ListEmpty(L)) - cout << endl << "ձ" << endl; + cout << endl << "空表!" << endl; else - cout << endl << "ǿձ" << endl; + cout << endl << "不是空表!" << endl; break; - case 11: // δ + case 11: // 未表满 if (ListFull(L)) - cout << endl << "" << endl; + cout << endl << "表满!" << endl; else - cout << endl << "" << endl; + cout << endl << "表不满!" << endl; break; - case 12: //ʾ + case 12: //遍历显示表 DispList(L); cout << endl; cin.get(pause); system("pause"); break; case 13: - cout << "˳Ϊ\n"; + cout << "测试顺序表为\n"; DispList(L); - cout << "ǰԪֵ\n"; + cout << "输入查找前驱的元素值:\n"; cin >> e; if (PriorElem_e(L, e, pre_e)) - cout << e << "ǰԪΪ" << pre_e << endl; + cout << e << "的前驱元素为:" << pre_e << endl; else - cout << e << "ǰԪأ" << endl; + cout << e << "无前驱元素!" << endl; break; - case 0: //˳ + case 0: //退出 - cout << "bye-bye!" << endl; + cout << "结束运行bye-bye!" << endl; break; - default: //Чѡ - cout << "Чѡ!\n"; + default: //无效选择 + cout << "无效选择!\n"; break; } } while (choice != 0); diff --git a/Chapter2/2-1-SqList/SqList.h b/Chapter2/2-1-SqList/SqList.h index e55349c..5dfd6e5 100644 --- a/Chapter2/2-1-SqList/SqList.h +++ b/Chapter2/2-1-SqList/SqList.h @@ -1,14 +1,14 @@ template -struct SqList // ˳ +struct SqList // 顺序表 { - DT* elem; // ַ - int length; // - int size; // + DT* elem; // 表首址 + int length; // 表长 + int size; // 表容量 }; -//㷨2.1 +//算法2.1 template -bool PriorElem_e(SqList
L, DT e, DT& pre_e) // ֵΪeԪǰ +bool PriorElem_e(SqList
L, DT e, DT& pre_e) // 求值为e的元素前驱 { int k; k = LocateElem_e(L, e); // @@ -21,119 +21,119 @@ bool PriorElem_e(SqList
L, DT e, DT& pre_e) // return true; } -//㷨2.2 ʼ +//【算法2.2】 初始化 template bool InitList(SqList
& L, int m) { - L.elem = new DT[m]; // ռ + L.elem = new DT[m]; // 申请表空间 if (L.elem == NULL) { - cout << "δɹ"; // 벻ɹ˳ + cout << "未创建成功!"; // 申请不成功,退出 exit(1); } - L.length = 0; // ɹԸֵձΪ0 - L.size = m; // Ϊm + L.length = 0; // 申请成功,属性赋值。空表,表长为0 + L.size = m; // 表容量为m return true; } -//㷨2.3 Ԫ +//【算法2.3】 创建表元素 template bool CreateList(SqList
& L, int n) { int i; - if (n > L.size) // 1.Ԫظڱܴ + if (n > L.size) // 1.元素个数大于表容量,不能创建。 { - cout << "Ԫظڱܴ" << endl; + cout << "元素个数大于表长,不能创建!" << endl; return false; } - cout << "" << n << "Ԫֵ" << endl; // 2.λԪֵ + cout << "请依次输入" << n << "个元素值:" << endl; // 2.依位序输入各元素值 for (i = 1; i <= n; i++) cin >> L.elem[i - 1]; - L.length = n; // 3.ΪԪظ + L.length = n; // 3.表长为创建的元素个数 return true; } -//㷨2.4 ˳ +//【算法2.4】 销毁顺序表 template void DestroyList(SqList
& L) { - delete[] L.elem; // 1.ͷűռ - L.length = 0; // 2.Ըֵ + delete[] L.elem; // 1.释放表空间 + L.length = 0; // 2.属性赋值 L.size = 0; } -//㷨2.5 ȡiԪֵ +//【算法2.5】 获取第i个元素值 template bool GetElem_i(SqList
L, int i, DT& e) { - if (i<1 || i>L.length) // 1.λ򲻺false + if (i<1 || i>L.length) // 1.位序不合理,返回false { - cout << "Ԫزڣ" << endl; + cout << "该元素不存在!" << endl; return false; } - e = L.elem[i - 1]; // 2. 򣬻ȡiԪֵ - return true; // true + e = L.elem[i - 1]; // 2. 否则,获取第i个元素值 + return true; // 返回true } -//㷨2.6 ֵ +//【算法2.6】 按值查找 template int LocateElem_e(SqList
L, DT e) { - for (int i = 1; i <= L.length; i++) // ˳ - if (L.elem[i - 1] == e) // 1.ҵ - return i; // Ԫλ - return 0; // 2.δҵ0 + for (int i = 1; i <= L.length; i++) // 顺序查找 + if (L.elem[i - 1] == e) // 1.找到 + return i; // 返回元素位序 + return 0; // 2.未找到,返回0 } -//㷨2.7 +//【算法2.7】 template bool InsertElem_i(SqList
& L, int i, DT e) { - if (L.length >= L.size) // 1.ܲ + if (L.length >= L.size) // 1.表满,不能插入 return false; - if (i<1 || i>L.length + 1) // 2.λòܲ + if (i<1 || i>L.length + 1) // 2.插入位置不合理,不能插入 return false; - for (int j = L.length; j >= i; j--) // 3. an~aiκ + for (int j = L.length; j >= i; j--) // 3. an~ai依次后移 L.elem[j] = L.elem[j - 1]; L.elem[i - 1] = e; L.length++; - return true; // ɹtrue + return true; // 插入成功,返回true } -//㷨2.8 ɾiԪ +//【算法2.8】 删除第i个元素 template bool DeleElem_i(SqList
& L, int i) { - if (L.length == 0) // 1.գɾ + if (L.length == 0) // 1.表空,不能删除 return false; - if (i<1 || i>L.length) // 2.ɾλòܲ + if (i<1 || i>L.length) // 2.删除位置不合理,不能插入 return false; - for (int j = i; j < L.length; j++) // 3. ai+1~anǰ + for (int j = i; j < L.length; j++) // 3. ai+1~an依次前移 L.elem[j - 1] = L.elem[j]; L.length--; - return true; // ɾɹtrue + return true; // 删除成功,返回true } -//㷨2.9 +//【算法2.9】 template -bool PutElem(SqList
& L, int i, DT e) // ޸ĵiԪصֵ +bool PutElem(SqList
& L, int i, DT e) // 修改第i个元素的值 { - if (i<1 || i>L.length) // 1.λ򲻺޸ģ - return false; // false - L.elem[i - 1] = e; // 2.õiԪֵ - return true; // 3.޸ijɹtrue + if (i<1 || i>L.length) // 1.位序不合理,不能修改, + return false; // 返回false + L.elem[i - 1] = e; // 2.重置第i个元素值 + return true; // 3.修改成功,返回true } -// ˳ +// 清空顺序表 template void ClearList(SqList
& L) { - L.length = 0; // ձΪ0 + L.length = 0; // 空表,表长为0 } -// +// 测表长 template int ListLength(SqList
L) { @@ -142,29 +142,29 @@ int ListLength(SqList
L) template -bool ListEmpty(SqList
L) // +bool ListEmpty(SqList
L) // 测表空 { - if (L.length == 0) // ձtrue + if (L.length == 0) // 空表,返回true return true; else - return false; // ǿձfalse + return false; // 非空表,返回false } template bool ListFull(SqList
L) { - if (L.length == L.size) // true + if (L.length == L.size) // 表满,返回true return true; else - return false; // false + return false; // 表不满,返回false } -//㷨2.10 +//【算法2.10】 遍历输出 template void DispList(SqList
L) { int i; - for (i = 1; i <= L.length; i++) // λԪֵ + for (i = 1; i <= L.length; i++) // 依位序输出元素值 { cout << L.elem[i - 1] << "\t"; diff --git a/Chapter2/2-2-LinkList/LinkList.cpp b/Chapter2/2-2-LinkList/LinkList.cpp index 4ed2aec..5f4a1a7 100644 --- a/Chapter2/2-2-LinkList/LinkList.cpp +++ b/Chapter2/2-2-LinkList/LinkList.cpp @@ -1,186 +1,186 @@ -// 2-2-LinkList- +// 2-2-LinkList-单链表 // WARNING: /sdl is disabled to pass the compilation process. #include //cout,cin using namespace std; #include "LinkList.h" -//㷨2.25 +//算法2.25 单链表逆置 void ReverseLinkList(LNode*& L) { - LNode* p, * q; // 1.ùָ - p = L->next; // ԭͷ㣬Ϊúͷ + LNode* p, * q; // 1.设置工作指针 + p = L->next; // 原链表头结点,作为逆置后表的头结点 L->next = NULL; - while (p) // 2. ժԭ㣬ͷ巨뵽 + while (p) // 2. 依次摘除原链表结点,以头插法插入到逆置链表中 { - q = p; // 2.1 qȡǰλ - p = p->next; // 2.2 pָһ - q->next = L->next; // 2.3 q 뵽ͷ֮ + q = p; // 2.1 q取当前结点位置 + p = p->next; // 2.2 p指向下一个待处理结点 + q->next = L->next; // 2.3 将q 插入到头结点之后 L->next = q; } } void dispmenu() -{ // ʾ˵ +{ // 显示主菜单 cout << endl; - cout << " *** ***\n"; - cout << " 1-ʼ\n"; - cout << " 2-β巨˳\n"; - cout << " 3-ͷ巨\n"; - cout << " 4-ȡiԪ\n"; - cout << " 5-ֵ\n"; - cout << " 6-iԪ\n"; - cout << " 7-ɾiԪ\n"; - cout << " 8-޸ĵiԪ\n"; - cout << " 9-ձ\n"; - cout << "10-\n"; - cout << "11-\n"; - cout << "12-\n"; - cout << "13-ֵǰ\n"; - cout << "14-\n"; - cout << "0-˳\n"; + cout << " *** 单 链 表 ***\n"; + cout << " 1-初始化单链表\n"; + cout << " 2-尾插法顺序表\n"; + cout << " 3-头插法建表\n"; + cout << " 4-获取第i个元素\n"; + cout << " 5-按值查找\n"; + cout << " 6-插入第i个元素\n"; + cout << " 7-删除第i个元素\n"; + cout << " 8-修改第i个元素\n"; + cout << " 9-清空表\n"; + cout << "10-测表长\n"; + cout << "11-测表空\n"; + cout << "12-遍历输出\n"; + cout << "13-按值查找前驱\n"; + cout << "14-单链表逆置\n"; + cout << "0-退出\n"; } char pause; -// +// 主函数 int main() { int i, n; int e, pre_e; LNode* L; - system("cls"); // + system("cls"); // 清屏 int choice; do { - dispmenu(); // ʾ˵ - cout << "Enter choice(1~120 ˳):"; + dispmenu(); // 显示主菜单 + cout << "Enter choice(1~12,0 退出):"; cin >> choice; switch (choice) { - case 1: // ʼ + case 1: // 初始化单链表 InitList(L); - cout << endl << "ɹ" << endl; + cout << endl << "创建成功!" << endl; break; - case 2: // β巨 - cout << "β巨" << endl; - cout << "Ҫ˳Ԫظ:"; + case 2: // 尾插法建单链表 + cout << "尾插法创建单链表" << endl; + cout << "输入要创建的顺序表中元素个数:"; cin >> n; cout << endl; CreateList_1(L, n); - cout << "ĵΪ"; + cout << "创建的单链表为:"; DispList(L); cout << endl; break; - case 3: // ͷ巨 - cout << "ͷ巨" << endl; - cout << "Ҫ˳Ԫظ:"; + case 3: // 头插法创建单链表 + cout << "头插法创建单链表" << endl; + cout << "输入要创建的顺序表中元素个数:"; cin >> n; cout << endl; CreateList_2(L, n); - cout << "ĵΪ"; + cout << "创建的单链表为:"; DispList(L); cout << endl; break; - case 4: // ȡiԪ - cout << "Ԫ:"; + case 4: // 获取第i个元素 + cout << "请输入元素序号:"; cin >> i; cout << endl; if (GetElem_i(L, i, e)) - cout << endl << "" << i << "ԪΪ:" << e << endl; + cout << endl << "第" << i << "个元素为:" << e << endl; else - cout << endl << "Ԫزڣ" << endl; + cout << endl << "元素不存在!" << endl; break; - case 5: // ѯԪλ - cout << "ҪѯԪֵ:"; + case 5: // 查询元素位序 + cout << "请输入要查询的元素值:"; cin >> e; i = LocateElem_e(L, e); if (i) - cout << endl << e << "ǵ" << i << "Ԫ" << endl; + cout << endl << e << "是第" << i << "个数据元素" << endl; else - cout << endl << "ڴԪأ" << endl; + cout << endl << "不存在此元素!" << endl; break; - case 6: // iԪ - cout << "λã" << endl; + case 6: // 插入第i个元素 + cout << "输入插入位置:" << endl; cin >> i; - cout << "Ԫֵ" << endl; + cout << "输入插入元素值:" << endl; cin >> e; if (InsertElem_i(L, i, e)) { - cout << endl << "ɹ" << endl; - cout << "ԪغĵΪ" << endl; + cout << endl << "插入成功!" << endl; + cout << "插入元素后的单链表为:" << endl; DispList(L); } else - cout << endl << "벻ɹ" << endl; + cout << endl << "插入不成功!" << endl; break; - case 7: // ɾiԪ - cout << "ɾԪλã" << endl; + case 7: // 删除第i个元素 + cout << "输入删除元素位置:" << endl; cin >> i; if (DeleElem_i(L, i)) { - cout << endl << "ɾɹ" << endl; - cout << "ɾԪغĵΪ" << endl; + cout << endl << "删除成功!" << endl; + cout << "删除元素后的单链表为:" << endl; DispList(L); } else - cout << endl << "ɾʧܣ" << endl; + cout << endl << "删除失败!" << endl; break; - case 8: // ޸ĵiԪ - cout << "޸Ԫλã" << endl; + case 8: // 修改第i个元素 + cout << "输入修改元素位置:" << endl; cin >> i; - cout << "Ԫֵ" << endl; + cout << "输入新元素值:" << endl; cin >> e; if (PutElem_i(L, i, e)) { - cout << endl << "޸ijɹ" << endl; - cout << "޸ĺĵΪ" << endl; + cout << endl << "修改成功!" << endl; + cout << "修改后的单链表为:" << endl; DispList(L); } else - cout << endl << "޸ʧܣ" << endl; + cout << endl << "修改失败!" << endl; break; - case 9: // ձ + case 9: // 清空表 ClearList(L); break; - case 10: // - cout << "Ϊ" << ListLength(L) << endl; + case 10: // 测表长 + cout << "表长为:" << ListLength(L) << endl; break; - case 11: // + case 11: // 测表空 if (ListEmpty(L)) - cout << endl << "ձ" << endl; + cout << endl << "空表!" << endl; else - cout << endl << "ǿձ" << endl; + cout << endl << "不是空表!" << endl; break; - case 12: //ʾ + case 12: //遍历显示表 DispList(L); cout << endl; break; case 13: - cout << "Ϊ\n"; + cout << "测试链表为\n"; DispList(L); - cout << "ǰԪֵ\n"; + cout << "输入查找前驱的元素值:\n"; cin >> e; if (PriorElem_e(L, e, pre_e)) - cout << e << "ǰԪΪ" << pre_e << endl; + cout << e << "的前驱元素为:" << pre_e << endl; else - cout << e << "ǰԪأ" << endl; + cout << e << "无前驱元素!" << endl; break; - case 14: // õ - cout << "ǰĵΪ"; + case 14: // 逆置单链表 + cout << "逆置前的单链表为:"; DispList(L); ReverseLinkList(L); - cout << "úĵΪ"; + cout << "逆置后的单链表为:"; DispList(L); cout << endl; break; - case 0: //˳ + case 0: //退出,销毁链表 DestroyList(L); - cout << "bye-bye!" << endl; + cout << "结束运行bye-bye!" << endl; break; - default: //Чѡ - cout << "Чѡ!\n"; + default: //无效选择 + cout << "无效选择!\n"; break; } } while (choice != 0); diff --git a/Chapter2/2-2-LinkList/LinkList.h b/Chapter2/2-2-LinkList/LinkList.h index e41b0e3..7914d52 100644 --- a/Chapter2/2-2-LinkList/LinkList.h +++ b/Chapter2/2-2-LinkList/LinkList.h @@ -1,249 +1,249 @@ template -struct LNode // +struct LNode //链表结点 { - DT data; //򣬴洢Ԫֵ - LNode* next; //ָָһ + DT data; //数据域,存储数据元素值 + LNode* next; //指针域,指向下一个结点 }; -//㷨2.1 +//算法2.1 template -bool PriorElem_e(LNode
* L, DT e, DT& pre_e) // ֵΪeԪǰ +bool PriorElem_e(LNode
* L, DT e, DT& pre_e) // 求值为e的元素前驱 { int k; - k = LocateElem_e(L, e); // 1.ȡeλk - if (k > 1) // 2.λk1 + k = LocateElem_e(L, e); // 1.获取e的位序k + if (k > 1) // 2.位序k大于1 { - GetElem_i(L, k - 1, pre_e); // k-1ԪΪeǰ + GetElem_i(L, k - 1, pre_e); // 第k-1个元素为e的前驱 return true; } - else // 3.Ԫeǰ - return false; // false + else // 3.元素e无前驱 + return false; // 返回false } -//㷨2.14 յ +//【算法2.14】 创建空单链表 template bool InitList(LNode
*& L) { - L = new LNode
; // 1.ͷ - if (!L) exit(1); // 2.ʧܣ˳ - L->next = NULL; // 3.ɹ - return true; // true + L = new LNode
; // 1.创建头结点 + if (!L) exit(1); // 2.创建失败,退出 + L->next = NULL; // 3.创建成功 + return true; // 返回true } -//㷨2.15 β巨nԪ +//【算法2.15】 尾插法创建n的元素 template bool CreateList_1(LNode
*& L, int n) { int i; LNode
* p, * s; - p = L; //1.ָʼָβ - cout << "" << n << "Ԫأ" << endl; - for (i = 1; i <= n; i++) // 2.Ԫλ򴴽 + p = L; //1.工作指针初始化,指向尾结点 + cout << "依次输入" << n << "个数据元素:" << endl; + for (i = 1; i <= n; i++) // 2.按元素位序正序创建各结点 { - s = new LNode
; // 2.1 ½һs - if (!s) // 2.2 ʧܣfalse + s = new LNode
; // 2.1 新建一个结点s + if (!s) // 2.2 创建失败,返回false return false; - cin >> s->data; // 2.3 ֵ - s->next = p->next; // 2.4 s ڱβ + cin >> s->data; // 2.3 输入结点值 + s->next = p->next; // 2.4 s 链在表尾 p->next = s; - p = s; // 2.5 ָָ s + p = s; // 2.5 工作指针指向 s } - return true; // 3.ɹtrue + return true; // 3.创建成功,返回true } -//㷨2.16 ͷ巨nԪ +//【算法2.16】 头插法创建n个元素 template bool CreateList_2(LNode
* (&L), int n) { int i; LNode
* s; - cout << "" << n << "Ԫأ" << endl; - for (i = 1; i <= n; i++) // 1.Ԫλ򴴽 + cout << "逆序输入" << n << "个数据元素:" << endl; + for (i = 1; i <= n; i++) // 1.按元素位序逆序创建各结点 { - s = new LNode
; // 1.1 ½һ s - if (!s) // 1.2 ʧܣfalse + s = new LNode
; // 1.1 新建一个结点 s + if (!s) // 1.2 创建失败,返回false return false; - cin >> s->data; // 1.3 ֵ - s->next = L->next; // 1.4 s ͷ + cin >> s->data; // 1.3 输入结点值 + s->next = L->next; // 1.4 s 在头结点后 L->next = s; } - return true; // 1.ɹtrue + return true; // 1.创建成功,返回true } -//㷨2.17 +//【算法2.17】 template -void DestroyList(LNode
* (&L)) // ͷռռ +void DestroyList(LNode
* (&L)) // 释放链表所占空间 { LNode
* p; - while (L) // 1. ǿ,ͷ㿪ʼͷŽ + while (L) // 1. 表非空,从头结点开始,依次释放结点 { - p = L; // 1.1 ͷ - L = L->next; // 1.2 ͷָ - delete p; // 1.3 ͷűͷռڴ + p = L; // 1.1 处理表头结点 + L = L->next; // 1.2 头指针后移 + delete p; // 1.3 释放表头结点所占内存 } - L = NULL; // 2.ͷָָ + L = NULL; // 2.头指针指向空 } -//㷨2.18 ȡiԪ +//【算法2.18】 获取第i个元素 template bool GetElem_i(LNode
* L, int i, DT& e) { - LNode
* p; // 1.ʼ - p = L->next; // 1.1 ùָ룬׽㿪ʼ - int j = 1; // 1.2 ʼ - while (p && j < i) // 2.λiԪؽ + LNode
* p; // 1.初始化 + p = L->next; // 1.1 设置工作指针,从首结点开始数结点 + int j = 1; // 1.2 计数器初始化 + while (p && j < i) // 2.定位到第i个元素结点 { p = p->next; j++; } - if (!p || j > i) // 3 δҵfalse + if (!p || j > i) // 3 未找到,返回false return false; - else // 4. ҵ + else // 4. 找到 { - e = p->data; // ȡiԪֵ - return true; // true + e = p->data; // 获取第i个元素值 + return true; // 返回true } } -//㷨2.19 ֵΪeԪλ +//【算法2.19】 查找值为e的元素位序 template int LocateElem_e(LNode
* L, DT e) { - LNode
* p; // 1.ʼԪʼ - p = L->next; // 1.1Ԫʼ - int j = 1; // 1.2 ֵ - while (p && p->data != e) // 2.˳ + LNode
* p; // 1.初始化从首元开始查找 + p = L->next; // 1.1从首元开始查找 + int j = 1; // 1.2 计数器初值 + while (p && p->data != e) // 2.顺序查找 { - p = p->next; // 2.1δҵָ - j++; // 2.2 1 + p = p->next; // 2.1未找到指针后移 + j++; // 2.2 计数器增1 } - if (p == NULL) // 3. жǷҵ - return 0; // 3.1ĩҵ0 + if (p == NULL) // 3. 判断是否找到 + return 0; // 3.1末找到,返回0 else - return j; // 3.2 ҵλ + return j; // 3.2 找到,返回位序 } -//㷨2.20 iԪ +//【算法2.20】 插入第i个元素 template bool InsertElem_i(LNode
*& L, int i, DT e) { int j = 0; - LNode
* p; // 1.ʼ - p = L; // ָʼ - while (p && j < i - 1) // 2. λǰ + LNode
* p; // 1.初始化 + p = L; // 工作指针初始化 + while (p && j < i - 1) // 2. 定位到插入点前驱 { p = p->next; j++; } - if (!p || j > i - 1) // 3.ж϶λǷɹ - return false; // 3.1 λʧܣܲ - else // 3.2 λɹ + if (!p || j > i - 1) // 3.判断定位是否成功: + return false; // 3.1 定位失败,不能插入 + else // 3.2 定位成功 { LNode
* s; - s = new LNode
; // 3.2.1½ - s->data = e; // 3.2.2½㸳ֵ - s->next = p->next; // 3.2.3Sӵp֮ + s = new LNode
; // 3.2.1建立新结点 + s->data = e; // 3.2.2新结点赋值 + s->next = p->next; // 3.2.3结点S链接到p结点之后 p->next = s; - return true; // 3.2.4 ɹtrue + return true; // 3.2.4 插入成功,返回true } } -//㷨2.21 ɾiԪ +//【算法2.21】 删除第i个元素 template bool DeleElem_i(LNode
* (&L), int i) { - LNode
* p, * q; //1.ʼùָ - p = L; //Ҵͷ㿪ʼ - int j = 0; //ʼ - while (p->next && j < i - 1) //2.pλɾǰ + LNode
* p, * q; //1.初始化:设置工作指针 + p = L; //查找从头结点开始 + int j = 0; //计数器初始化 + while (p->next && j < i - 1) //2.p定位到删除点的前驱 { p = p->next; j++; } - if (!p->next || j > i - 1) //3.ɾλòɾ - return false; //false - else //4.ɾ + if (!p->next || j > i - 1) //3.删除位置不合理,不能删除 + return false; //返回false + else //4.删除操作 { - q = p->next; //4.1ݴɾλ - p->next = q->next; //4.2ժɾ + q = p->next; //4.1暂存删除结点位置 + p->next = q->next; //4.2从链表中摘除删除结点 delete q; - return true; //4.3ɾɹtrue + return true; //4.3删除成功,返回true } } -//㷨2.22 ޸ĵiԪֵ +//【算法2.22】 修改第i个元素值 template bool PutElem_i(LNode
* (&L), int i, DT e) { - LNode
* p; // 1.ʼ:ùָ - p = L->next; // ׽㿪ʼ - int j = 1; // ʼ - while (p && j < i) // 2.ҵiԪؽ + LNode
* p; // 1.初始化:设置工作指针 + p = L->next; // 从首结点开始,数结点 + int j = 1; // 计数器初始化 + while (p && j < i) // 2.查找第i个元素结点 { p = p->next; j++; } - if (!p || j > i) // 3.Ԫز,false + if (!p || j > i) // 3.元素不存在,返回false return false; - else // 4.λɹ + else // 4.定位成功 { - p->data = e; // ޸Ԫֵ - return true; // true + p->data = e; // 修改元素值 + return true; // 返回true } } -// ͷռռ +// 释放链表所占空间 template void ClearList(LNode
* (&L)) { LNode
* p; - while (L->next) // Ԫ㿪ʼͷŽ + while (L->next) // 从首元结点开始,依次释放结点 { p = L->next; L->next = p->next; delete p; } - cout << endl << "!" << endl; + cout << endl << "表已清空!" << endl; } -//㷨2.23 +//【算法2.23】 测表长 template int ListLength(LNode
* L) -{ // 1.ʼ - int len = 0; // 1.1 ֵ0 - LNode
* p; // 1.2ùָ - p = L; // ָͷ - while (p->next) // 2.к̽㣬 +{ // 1.初始化 + int len = 0; // 1.1 结点计数器赋初值0 + LNode
* p; // 1.2设置工作指针 + p = L; // 指向头结点 + while (p->next) // 2.数结点个数。有后继结点, { - len++; p = p->next; // 1ָ + len++; p = p->next; // 结点数增1,指针后移 } - return len; // 3.ر + return len; // 3.返回表长 } // template -bool ListEmpty(LNode
* L) // +bool ListEmpty(LNode
* L) //测表空 { if (L->next == NULL) - return true; //ձ1 + return true; //空表,返回1 else - return false; //գ0 + return false; //不空,返回0 } -//㷨2.24 +//【算法2.24】 遍历表 template -void DispList(LNode
* L) // ʾ +void DispList(LNode
* L) // 显示表内容 { - LNode
* p; // 1. ùָ - p = L; // Ԫ㿪ʼ - while (p->next) // 2.ֵ + LNode
* p; // 1. 设置工作指针 + p = L; // 从首元结点开始遍历 + while (p->next) // 2.依次输出各结点值 { p = p->next; cout << p->data << "\t"; diff --git a/Chapter2/2-3-SqListApp/SqList.h b/Chapter2/2-3-SqListApp/SqList.h index 5a18d59..50e801c 100644 --- a/Chapter2/2-3-SqListApp/SqList.h +++ b/Chapter2/2-3-SqListApp/SqList.h @@ -1,55 +1,55 @@ template -struct SqList //˳ +struct SqList //顺序表类 { - DT* elem; //ַ - int length; // - int size;// + DT* elem; //表首址 + int length; //表长 + int size;//表容量 }; -//㷨2.2 +//【算法2.2】 template bool InitList(SqList
& L, int m) -{//һΪmĿձ - L.elem = new DT[m];// ռ +{//构建函数,创建一表容量为m的空表 + L.elem = new DT[m];// 申请表空间 if (L.elem == NULL) { - cout << "δɹ"; + cout << "未创建成功!"; exit(1); } - L.length = 0; // ձΪ0 - L.size = m; //Ϊm + L.length = 0; // 空表,表长为0 + L.size = m; //表容量为m return true; } -//㷨2.3 +//【算法2.3】 template -bool CreateList(SqList
& L, int n) //Ϊn˳ +bool CreateList(SqList
& L, int n) //创建表长度为n的顺序表 { int i; if (n > L.size) { - cout << "Ԫظڱܴ" << endl; + cout << "元素个数大于表长,不能创建!" << endl; return false; } - cout << "" << n << "Ԫֵ" << endl; + cout << "请依次输入" << n << "个元素值:" << endl; for (i = 1; i <= n; i++) cin >> L.elem[i - 1]; L.length = n; return true; } -//㷨2.4 +//【算法2.4】 template -void DestroyList(SqList
& L) //˳ͷűռ +void DestroyList(SqList
& L) //销毁顺序表,释放表空间 { delete[] L.elem; L.length = 0; L.size = 0; } -//㷨2.5 +//【算法2.5】 template -bool GetElem_i(SqList
L, int i, DT& e)// ȡiԪֵ +bool GetElem_i(SqList
L, int i, DT& e)// 获取第i个元素值 { if (i<0 || i>L.length) return false; @@ -57,60 +57,60 @@ bool GetElem_i(SqList
L, int i, DT& e)// return true; } -//㷨2.6 +//【算法2.6】 template -int LocateElem_e(SqList
L, DT e) // ֵ +int LocateElem_e(SqList
L, DT e) // 按值查找 { int i; - for (i = 0; i < L.length; i++) // ˳ - if (L.elem[i] == e) // ҵ + for (i = 0; i < L.length; i++) // 顺序查找 + if (L.elem[i] == e) // 找到 return i + 1; - return 0; // δҵ + return 0; // 未找到 } -//㷨2.7 +//【算法2.7】 template -bool InsertElem_i(SqList
& L, int i, DT e) // ڵiλòԪ +bool InsertElem_i(SqList
& L, int i, DT e) // 在第i个位置插入新元素 { int j; - if (L.length >= L.size) //1.ܲ + if (L.length >= L.size) //1.表满,不能插入 return false; - if (i<1 || i>L.length + 1) //2.λòܲ + if (i<1 || i>L.length + 1) //2.插入位置不合理,不能插入 return false; - for (j = L.length; j >= i; j--) //3. an~aiκ + for (j = L.length; j >= i; j--) //3. an~ai依次后移 L.elem[j] = L.elem[j - 1]; L.elem[i - 1] = e; L.length++; - return true; // ɹtrue + return true; // 插入成功,返回true } -//㷨2.8 +//【算法2.8】 template -bool DeleElem_i(SqList
& L, int i) // ɾiԪ +bool DeleElem_i(SqList
& L, int i) // 删除第i个元素 { int j; - if (L.length == 0) //1.գɾ + if (L.length == 0) //1.表空,不能删除 return false; - if (i<1 || i>L.length) //2.ɾλòܲ + if (i<1 || i>L.length) //2.删除位置不合理,不能插入 return false; - for (j = i; j < L.length; j++) //3. ai~anǰ + for (j = i; j < L.length; j++) //3. ai~an依次前移 L.elem[j - 1] = L.elem[j]; L.length--; - return true; // ɾɹtrue + return true; // 删除成功,返回true } -//㷨2.9 +//【算法2.9】 template -bool PutElem(SqList
& L, int i, DT e) // ޸ĵiԪصֵ +bool PutElem(SqList
& L, int i, DT e) // 修改第i个元素的值 { - if (i<1 || i>L.length) //1.λò޸ + if (i<1 || i>L.length) //1.位置不合理,不能修改 return false; - L.elem[i - 1] = e; //2.õiԪֵ - return true; //3.޸ijɹtrue + L.elem[i - 1] = e; //2.重置第i个元素值 + return true; //3.修改成功,返回true } -//˳ +//清空顺序表 template void ClearList(SqList
& L) { @@ -118,14 +118,14 @@ void ClearList(SqList
& L) } -// +//测表长 template int ListLength(SqList
L) { return L.length; } -// +//测表空 template bool ListEmpty(SqList
L) { @@ -135,7 +135,7 @@ bool ListEmpty(SqList
L) return false; } -// +//测表满 template bool ListFull(SqList
L) { @@ -145,9 +145,9 @@ bool ListFull(SqList
L) return false; } -//㷨2.10 +//【算法2.10】 template -void DispList(SqList
L) // +void DispList(SqList
L) //遍历输出 { int i; for (i = 0; i < L.length; i++) diff --git a/Chapter2/2-3-SqListApp/SqListApp.cpp b/Chapter2/2-3-SqListApp/SqListApp.cpp index febfb3f..7398df8 100644 --- a/Chapter2/2-3-SqListApp/SqListApp.cpp +++ b/Chapter2/2-3-SqListApp/SqListApp.cpp @@ -1,4 +1,4 @@ -// 2-3-SqListApp-˳Ӧ +// 2-3-SqListApp-顺序表应用 #include//cout,cin using namespace std; @@ -7,35 +7,35 @@ using namespace std; char pause; void dispmenu() -{ // ʾ˵ - cout << "\n*** ˳Ӧ ***\n"; - cout << " 1-ϲA=AB\n"; - cout << " 2-˳\n"; - cout << " 3-ʽ\n"; - cout << " 0-˳\n"; +{ // 显示主菜单 + cout << "\n*** 顺序表的应用 ***\n"; + cout << " 1-集合并A=A∪B\n"; + cout << " 2-顺序表逆置\n"; + cout << " 3-多项式求和\n"; + cout << " 0-退出\n"; } -//㷨2.11 +//算法2.11 template -void Union(SqList
& La, SqList
Lb) // La=LaLa +void Union(SqList
& La, SqList
Lb) // 求La=La∪La { DT e; int k, i; - for (i = 1; i <= Lb.length; i++) // ɨLb + for (i = 1; i <= Lb.length; i++) // 扫描Lb { - GetElem_i(Lb, i, e); // 1. ȡLbĵiԪ - if (!LocateElem_e(La, e)) // 2.La޴Ԫ + GetElem_i(Lb, i, e); // 1. 获取Lb的第i个元素 + if (!LocateElem_e(La, e)) // 2.如果La中无此元素 { - k = La.length + 1; // Laıβ + k = La.length + 1; // 添加在La的表尾 InsertElem_i(La, k, e); } } } -//㷨2.12 +//算法2.12 template -void ReverseSqList(SqList
& L) // ˳Ԫ +void ReverseSqList(SqList
& L) // 顺序表元素逆置 { DT t; int i; @@ -48,28 +48,28 @@ void ReverseSqList(SqList
& L) // ˳ return; } -//㷨2.13 ʽ lc=la+lb +//算法2.13 多项式求和 lc=la+lb void PolyAdd(SqList la, SqList lb, SqList& lc) { - int i = 0; // 1.ʼôʼλ - while (i < la.length && i < lb.length) // 2.ʽδ + int i = 0; // 1.初始化,设置处理起始位置 + while (i < la.length && i < lb.length) // 2.两个多项式均未处理完 { - lc.elem[i] = la.elem[i] + lb.elem[i]; // ͬλϵϵ + lc.elem[i] = la.elem[i] + lb.elem[i]; // 相同位序上的系数相加 i++; } - if (la.length > lb.length) // 3.laδ꣬lbѴ + if (la.length > lb.length) // 3.la未处理完,lb已处理完 { - while (i < la.length) // lcȡlaʣ + while (i < la.length) // lc取la中剩余项 { lc.elem[i] = la.elem[i]; i++; } } - else // 3.lbδ꣬laѴ + else // 3.lb未处理完,la已处理完 { - while (i < lb.length) // lcȡlbʣ + while (i < lb.length) // lc取lb中剩余项 { lc.elem[i] = lb.elem[i]; i++; @@ -78,7 +78,7 @@ void PolyAdd(SqList la, SqList lb, SqList& lc) } } -//ʾඥʽ +//显示多顶式 void DispPoly(float A[], int n) { int i; @@ -91,95 +91,95 @@ void DispPoly(float A[], int n) -// +//主函数 int main() { int e; int na, nb, nc; - SqList La, Lb; // AB - SqList Lc; // ˳ - SqList fa, fb, fc; // ʽABC + SqList La, Lb; // 集合A、B + SqList Lc; // 顺序表 + SqList fa, fb, fc; // 多项式A、B、C - system("cls"); // + system("cls"); // 清屏 int choice; do { - dispmenu(); // ʾ˵ - cout << "Enter choice(1~4,0˳):"; + dispmenu(); // 显示主菜单 + cout << "Enter choice(1~4,0退出):"; cin >> choice; switch (choice) { - case 1: // 󼯺ϲ - cout << "AB\n"; - cout << "뼯AԪظ"; + case 1: // 求集合并 + cout << "创建集合A、B\n"; + cout << "输入集合A元素个数:"; cin >> na; - cout << "뼯BԪظ"; + cout << "输入集合B元素个数:"; cin >> nb; - InitList(La, na + nb); // A - cout << "AԪ\n"; + InitList(La, na + nb); // 创建集合A + cout << "创建集合A的元素\n"; CreateList(La, na); - InitList(Lb, nb); // B - cout << "BԪ\n"; + InitList(Lb, nb); // 创建集合B + cout << "创建集合B的元素\n"; CreateList(Lb, nb); - cout << "AΪ" << endl; // ʾA + cout << "集合A为:" << endl; // 显示集合A DispList(La); - cout << "BΪ" << endl; // ʾB + cout << "集合B为:" << endl; // 显示集合B DispList(Lb); - Union(La, Lb); // 󼯺ϲ - cout << "ABΪ:" << endl; // ʾ + Union(La, Lb); // 求集合并 + cout << "A∪B为:" << endl; // 显示结果 DispList(La); cout << endl; DestroyList(La); DestroyList(Lb); break; - case 2: // ˳ - cout << "Ҫ˳Ԫظ:"; + case 2: // 顺序表逆置 + cout << "请输入要创建的顺序表中元素个数:"; cin >> nc; InitList(Lc, nc); cout << endl; CreateList(Lc, nc); - cout << "˳Ϊ" << endl; // ʾA + cout << "创建的顺序表为:" << endl; // 显示集合A DispList(Lc); ReverseSqList(Lc); - cout << "ú˳Ϊ" << endl; // ʾA + cout << "逆置后的顺序表为:" << endl; // 显示集合A DispList(Lc); cout << endl; DestroyList(Lc); break; - case 3: //ʽ - cout << "\nʽA\n"; // ʽA - cout << "ʽA"; + case 3: //多项式求和 + cout << "\n创建多项式A\n"; // 创建多项式A + cout << "输入多项式A的项数:"; cin >> na; InitList(fa, na); - cout << "ʽAϵ\n"; + cout << "按幂升序输入多项式A各项系数\n"; CreateList(fa, na); - cout << "\nʽB\n"; // ʽB - cout << "ʽB"; + cout << "\n创建多项式B\n"; // 创建多项式B + cout << "输入多项式B的项数:"; cin >> nb; InitList(fb, nb); - cout << "ʽBϵ\n"; + cout << "按幂升序输入多项式B各项系数\n"; CreateList(fb, nb); - cout << "\nʽ A Ϊ " << endl; // ʾʽA + cout << "\n多项式 A 为 :" << endl; // 显示多项式A DispPoly(fa.elem, na); - cout << "\nʽ B Ϊ " << endl; // ʾʽB + cout << "\n多项式 B 为 :" << endl; // 显示多项式B DispPoly(fb.elem, nb); nc = (na >= nb) ? na : nb; - InitList(fc, nc); // ʽC - PolyAdd(fa, fb, fc); // ʽ C=A+B - cout << "\nʽA + ʽB = " << endl; // ʾ + InitList(fc, nc); // 创建多项式C + PolyAdd(fa, fb, fc); // 求多项式 C=A+B + cout << "\n多项式A + 多项式B = " << endl; // 显示结果 DispPoly(fc.elem, nc); cout << endl; DestroyList(fa); DestroyList(fb); DestroyList(fc); break; - case 0: // ˳ - cout << " bye-bye!" << endl; + case 0: // 退出 + cout << " 结束运行bye-bye!" << endl; break; - default: // Чѡ - cout << "Чѡ!\n"; + default: // 无效选择 + cout << "无效选择!\n"; break; } } while (choice != 0); diff --git a/Chapter2/2-4-PolyAdd/PolyAdd.cpp b/Chapter2/2-4-PolyAdd/PolyAdd.cpp index de41251..e42045d 100644 --- a/Chapter2/2-4-PolyAdd/PolyAdd.cpp +++ b/Chapter2/2-4-PolyAdd/PolyAdd.cpp @@ -1,33 +1,33 @@ -// 2-4-PolyAdd-ϡʽ +// 2-4-PolyAdd-稀疏多项式求和 // WARNING: /sdl is disabled to pass the compilation process. #include//cout,cin using namespace std; -struct PolyNode // ʽ +struct PolyNode // 多项式结点 { - float coef; // ϵ - int exp; // ָ - PolyNode* next; // ָһ + float coef; // 系数 + int exp; // 指数 + PolyNode* next; // 指向下一项结点 }; void InitPoly(PolyNode*& L) -{ //һնʽ +{ //创建一空多项式 L = new PolyNode; L->next = NULL; } -bool CreatePoly(PolyNode*& L, int n) // β巨nʽ +bool CreatePoly(PolyNode*& L, int n) // 尾插法创建n项多项式 { int i; PolyNode* p, * s; p = L; - for (i = 1; i <= n; i++) // ʽϵָ + for (i = 1; i <= n; i++) // 按幂升序依次输入多项式各项系数与幂指数 { s = new PolyNode; if (!s) return false; - cout << "" << i << "ϵָ"; + cout << "输入第" << i << "项系数和幂指数:"; cin >> s->coef >> s->exp; s->next = p->next; p->next = s; @@ -37,13 +37,13 @@ bool CreatePoly(PolyNode*& L, int n) // β } -//ʾඥʽ -void DispPoly(PolyNode* L) // ͨ㣬ʽ +//显示多顶式 +void DispPoly(PolyNode* L) // 通过遍历结点,输出多项式 { PolyNode* p; - if (!L) // ձ + if (!L) // 空表,返回 { - cout << "ձ!"; + cout << "空表!"; return; } p = L->next; @@ -56,100 +56,100 @@ void DispPoly(PolyNode* L) // ͨ cout << endl; } -//㷨2.26 ʽLA=LA+LB +//【算法2.26】 求多项式LA=LA+LB void PolyAdd(PolyNode*& LA, PolyNode*& LB) { float sum; - PolyNode* pa, * pb, * qa, * qb; // 1.ָʼ + PolyNode* pa, * pb, * qa, * qb; // 1.工作指针初始化 pa = LA; qa = pa->next; pb = LB; qb = pb->next; - while (qa != NULL && qb != NULL) // 2. + while (qa != NULL && qb != NULL) // 2. 两表均不空 { - if (qa->exp < qb->exp) // 2.1 LAС - { // paqa + if (qa->exp < qb->exp) // 2.1 LA的幂小 + { // pa、qa后移 pa = qa; qa = qa->next; } - else if (qa->exp > qb->exp) //2.2 LA ݴ + else if (qa->exp > qb->exp) //2.2 LA 幂大 { - pb->next = qb->next; // qbӵpa֮ + pb->next = qb->next; // qb链接到pa之后 qb->next = qa; pa->next = qb; pa = qb; qb = pb->next; } - else // 2.3 LALBͬ + else // 2.3 LA与LB幂相同 { - sum = qa->coef + qb->coef; // ϵ - if (sum != 0) // 2.3.1 ϵͲΪ0 + sum = qa->coef + qb->coef; // 计算系数和 + if (sum != 0) // 2.3.1 系数和不为0 { - qa->coef = sum; // 2.3.1.1 qa->coefsum - pa = qa; qa = qa->next; // 2.3.1.2 paqa + qa->coef = sum; // 2.3.1.1 qa->coef←sum + pa = qa; qa = qa->next; // 2.3.1.2 pa,qa后移 pb->next = qb->next; - delete qb; // 2.3.1.3ɾqb + delete qb; // 2.3.1.3删除qb, qb = pb->next; } - else // 2.3.2 ϵΪ0 + else // 2.3.2 系数和为0 { pa->next = qa->next; - delete qa; // 2.3.2.1 ɾqa - qa = pa->next; // 2.3.2.2 qaΪpạ + delete qa; // 2.3.2.1 删除qa, + qa = pa->next; // 2.3.2.2 qa为pa后继; pb->next = qb->next; - delete qb; // 2.3.2.3 ɾqb - qb = pb->next; // 2.3.2.4 qbΪpbĺ + delete qb; // 2.3.2.3 删除qb + qb = pb->next; // 2.3.2.4 qb为pb的后继 } } }//while - if (qb != NULL) // 3. LALBδ - pa->next = qb; // 3.1 qbqa֮ - delete pb; // 3.2 ɾlbͷ + if (qb != NULL) // 3. LA处理结束,LB未结束 + pa->next = qb; // 3.1 qb链到qa之后 + delete pb; // 3.2 删除lb头结点 LB = NULL; }//Add -void DestroyPoly(PolyNode*& L) // ͷռռ +void DestroyPoly(PolyNode*& L) // 释放链表所占空间 { PolyNode* p; - while (L) // ͷ㿪ʼͷŽ + while (L) // 从头结点开始,依次释放结点 { p = L; L = L->next; delete p; } - L = NULL; // ͷָ + L = NULL; // 头结点指向空 } -void SortPoly(PolyNode*& L) // ʽ +void SortPoly(PolyNode*& L) // 将多项式按幂升序排序 { - PolyNode* p1, * p2, * q, * r; // ò㷨 - p1 = L; p2 = p1->next; // p1p2ǰ - if (p2 == NULL || p2->next == NULL) // ձֻ1ĶʽҪ + PolyNode* p1, * p2, * q, * r; // 采用插入排序算法 + p1 = L; p2 = p1->next; // p1是p2的前驱 + if (p2 == NULL || p2->next == NULL) // 空表或只有1项的多项式,不需要排序 { - cout << "Ҫ!" << endl; + cout << "不需要排序!" << endl; return; } - r = L->next; // β - q = r->next; // qΪǰĺһ - while (q) // δ - { // Ԫ㿪ʼҲ + r = L->next; // 有序表表尾 + q = r->next; // q为当前处理项,有序表的后一项 + while (q) // 未处理完 + { // 从首元结点开始查找插入点 p1 = L; p2 = p1->next; - while (q->exp > p2->exp && p2 != q) // ǰݴ󣬲 + while (q->exp > p2->exp && p2 != q) // 当前结点幂大,插入点后移 { p1 = p2; p2 = p2->next; } - if (p2 == q) // ǰƶ + if (p2 == q) // 当前项无需移动 { - r = q; // β˳ + r = q; // 有序表表尾顺移 } - else // q뵽p2ǰ + else // q插入到p2前面 { - r->next = q->next; // ժq - q->next = p1->next; // p1q + r->next = q->next; // 摘除q结点 + q->next = p1->next; // 在p1后插入结点q p1->next = q; } - q = r->next; // һ账 + q = r->next; // 下一个需处理的项 } return; @@ -158,81 +158,81 @@ void SortPoly(PolyNode*& L) // void dispmenu() -{//ʾ˵ +{//显示主菜单 cout << endl; - cout << "*** ϡʽ ***\n"; - cout << "1-ʽA\n"; - cout << "2-ʽB\n"; - cout << "3-ʽA=A+B\n"; - cout << "4-ʾʽ\n"; - cout << "0-˳\n"; + cout << "*** 稀疏多项式求和 ***\n"; + cout << "1-创建多项式A\n"; + cout << "2-创建多项式B\n"; + cout << "3-多项式求和A=A+B\n"; + cout << "4-显示多项式\n"; + cout << "0-退出\n"; } -// +//主函数 int main() { int m, n; char c; PolyNode* LA, * LB; - system("cls"); // ִϵͳcls + system("cls"); // 执行系统命令cls,清屏 int choice; do { - dispmenu(); // ʾ˵ - cout << "Enter choice(1~4,0 ˳):"; + dispmenu(); // 显示主菜单 + cout << "Enter choice(1~4,0 退出):"; cin >> choice; switch (choice) { - case 1: // ʽA + case 1: // 创建多项式A InitPoly(LA); - cout << "ʽ A "; + cout << "请输入多项式 A 的项数: "; cin >> m; CreatePoly(LA, m); - cout << "Ķʽ A Ϊ" << endl; + cout << "创建的多项式 A 为:" << endl; DispPoly(LA); SortPoly(LA); - cout << "ʽ A Ϊ" << endl; + cout << "排序后多项式 A 为:" << endl; DispPoly(LA); break; - case 2: // ʽB + case 2: // 创建多项式B InitPoly(LB); - cout << "ʽB "; + cout << "请输入多项式B的项数: "; cin >> n; CreatePoly(LB, n); - cout << "ĶʽBΪ" << endl; + cout << "创建的多项式B为:" << endl; DispPoly(LB); SortPoly(LB); - cout << "ʽ B Ϊ" << endl; + cout << "排序后多项式 B 为:" << endl; DispPoly(LB); break; - case 3: //ʽ + case 3: //多项式求和 cout << "A = "; DispPoly(LA); cout << "B = "; DispPoly(LB); - PolyAdd(LA, LB); // ʽ LA=LA+LB - cout << "A + B = "; // ʾ + PolyAdd(LA, LB); // 求多项式 LA=LA+LB + cout << "A + B = "; // 显示结果 DispPoly(LA); cout << endl; break; - case 4: // ʾʽ - cout << "ѡҪʾĶʽ A B" << endl; + case 4: // 显示多项式 + cout << "选择要显示的多项式 A 或 B:" << endl; cin >> c; if (c == 'A' || c == 'a') DispPoly(LA); else if (c == 'B' || c == 'b') DispPoly(LB); else - cout << "ѡ" << endl; + cout << "选择错误!" << endl; break; - case 5: //˳ + case 5: //退出 DestroyPoly(LA); DestroyPoly(LB); - cout << "bye-bye!" << endl; + cout << "结束运行bye-bye!" << endl; break; - default: //Ƿѡ - cout << "Ƿѡ!\n"; + default: //非法选择 + cout << "非法选择!\n"; break; } } while (choice != 0); diff --git a/homework240306/SqList.h b/homework240306/SqList.h index e55349c..5dfd6e5 100644 --- a/homework240306/SqList.h +++ b/homework240306/SqList.h @@ -1,14 +1,14 @@ template -struct SqList // ˳ +struct SqList // 顺序表 { - DT* elem; // ַ - int length; // - int size; // + DT* elem; // 表首址 + int length; // 表长 + int size; // 表容量 }; -//㷨2.1 +//算法2.1 template -bool PriorElem_e(SqList
L, DT e, DT& pre_e) // ֵΪeԪǰ +bool PriorElem_e(SqList
L, DT e, DT& pre_e) // 求值为e的元素前驱 { int k; k = LocateElem_e(L, e); // @@ -21,119 +21,119 @@ bool PriorElem_e(SqList
L, DT e, DT& pre_e) // return true; } -//㷨2.2 ʼ +//【算法2.2】 初始化 template bool InitList(SqList
& L, int m) { - L.elem = new DT[m]; // ռ + L.elem = new DT[m]; // 申请表空间 if (L.elem == NULL) { - cout << "δɹ"; // 벻ɹ˳ + cout << "未创建成功!"; // 申请不成功,退出 exit(1); } - L.length = 0; // ɹԸֵձΪ0 - L.size = m; // Ϊm + L.length = 0; // 申请成功,属性赋值。空表,表长为0 + L.size = m; // 表容量为m return true; } -//㷨2.3 Ԫ +//【算法2.3】 创建表元素 template bool CreateList(SqList
& L, int n) { int i; - if (n > L.size) // 1.Ԫظڱܴ + if (n > L.size) // 1.元素个数大于表容量,不能创建。 { - cout << "Ԫظڱܴ" << endl; + cout << "元素个数大于表长,不能创建!" << endl; return false; } - cout << "" << n << "Ԫֵ" << endl; // 2.λԪֵ + cout << "请依次输入" << n << "个元素值:" << endl; // 2.依位序输入各元素值 for (i = 1; i <= n; i++) cin >> L.elem[i - 1]; - L.length = n; // 3.ΪԪظ + L.length = n; // 3.表长为创建的元素个数 return true; } -//㷨2.4 ˳ +//【算法2.4】 销毁顺序表 template void DestroyList(SqList
& L) { - delete[] L.elem; // 1.ͷűռ - L.length = 0; // 2.Ըֵ + delete[] L.elem; // 1.释放表空间 + L.length = 0; // 2.属性赋值 L.size = 0; } -//㷨2.5 ȡiԪֵ +//【算法2.5】 获取第i个元素值 template bool GetElem_i(SqList
L, int i, DT& e) { - if (i<1 || i>L.length) // 1.λ򲻺false + if (i<1 || i>L.length) // 1.位序不合理,返回false { - cout << "Ԫزڣ" << endl; + cout << "该元素不存在!" << endl; return false; } - e = L.elem[i - 1]; // 2. 򣬻ȡiԪֵ - return true; // true + e = L.elem[i - 1]; // 2. 否则,获取第i个元素值 + return true; // 返回true } -//㷨2.6 ֵ +//【算法2.6】 按值查找 template int LocateElem_e(SqList
L, DT e) { - for (int i = 1; i <= L.length; i++) // ˳ - if (L.elem[i - 1] == e) // 1.ҵ - return i; // Ԫλ - return 0; // 2.δҵ0 + for (int i = 1; i <= L.length; i++) // 顺序查找 + if (L.elem[i - 1] == e) // 1.找到 + return i; // 返回元素位序 + return 0; // 2.未找到,返回0 } -//㷨2.7 +//【算法2.7】 template bool InsertElem_i(SqList
& L, int i, DT e) { - if (L.length >= L.size) // 1.ܲ + if (L.length >= L.size) // 1.表满,不能插入 return false; - if (i<1 || i>L.length + 1) // 2.λòܲ + if (i<1 || i>L.length + 1) // 2.插入位置不合理,不能插入 return false; - for (int j = L.length; j >= i; j--) // 3. an~aiκ + for (int j = L.length; j >= i; j--) // 3. an~ai依次后移 L.elem[j] = L.elem[j - 1]; L.elem[i - 1] = e; L.length++; - return true; // ɹtrue + return true; // 插入成功,返回true } -//㷨2.8 ɾiԪ +//【算法2.8】 删除第i个元素 template bool DeleElem_i(SqList
& L, int i) { - if (L.length == 0) // 1.գɾ + if (L.length == 0) // 1.表空,不能删除 return false; - if (i<1 || i>L.length) // 2.ɾλòܲ + if (i<1 || i>L.length) // 2.删除位置不合理,不能插入 return false; - for (int j = i; j < L.length; j++) // 3. ai+1~anǰ + for (int j = i; j < L.length; j++) // 3. ai+1~an依次前移 L.elem[j - 1] = L.elem[j]; L.length--; - return true; // ɾɹtrue + return true; // 删除成功,返回true } -//㷨2.9 +//【算法2.9】 template -bool PutElem(SqList
& L, int i, DT e) // ޸ĵiԪصֵ +bool PutElem(SqList
& L, int i, DT e) // 修改第i个元素的值 { - if (i<1 || i>L.length) // 1.λ򲻺޸ģ - return false; // false - L.elem[i - 1] = e; // 2.õiԪֵ - return true; // 3.޸ijɹtrue + if (i<1 || i>L.length) // 1.位序不合理,不能修改, + return false; // 返回false + L.elem[i - 1] = e; // 2.重置第i个元素值 + return true; // 3.修改成功,返回true } -// ˳ +// 清空顺序表 template void ClearList(SqList
& L) { - L.length = 0; // ձΪ0 + L.length = 0; // 空表,表长为0 } -// +// 测表长 template int ListLength(SqList
L) { @@ -142,29 +142,29 @@ int ListLength(SqList
L) template -bool ListEmpty(SqList
L) // +bool ListEmpty(SqList
L) // 测表空 { - if (L.length == 0) // ձtrue + if (L.length == 0) // 空表,返回true return true; else - return false; // ǿձfalse + return false; // 非空表,返回false } template bool ListFull(SqList
L) { - if (L.length == L.size) // true + if (L.length == L.size) // 表满,返回true return true; else - return false; // false + return false; // 表不满,返回false } -//㷨2.10 +//【算法2.10】 遍历输出 template void DispList(SqList
L) { int i; - for (i = 1; i <= L.length; i++) // λԪֵ + for (i = 1; i <= L.length; i++) // 依位序输出元素值 { cout << L.elem[i - 1] << "\t"; diff --git a/homework240306/main.cpp b/homework240306/main.cpp index f99974c..62fca54 100644 --- a/homework240306/main.cpp +++ b/homework240306/main.cpp @@ -7,10 +7,10 @@ bool CreateListNoRepeat(SqList
& L, int n) int i; if (n > L.size) { - cout << "Ԫظڱܴ" << endl; + cout << "元素个数大于表长,不能创建!" << endl; return false; } - cout << "" << n << "Ԫֵ" << endl; + cout << "请依次输入" << n << "个元素值:" << endl; for (i = 1; i <= n; i++) { int temp; @@ -53,22 +53,22 @@ int main() InitList(A, 32); InitList(B, 32); int length_a, length_b; - cout << "뼯AԪظ: "; + cout << "请输入集合A的元素个数: "; cin >> length_a; CreateListNoRepeat(A, length_a); - cout << "뼯BԪظ: "; + cout << "请输入集合B的元素个数: "; cin >> length_b; CreateListNoRepeat(B, length_b); - cout << "A: "; + cout << "集合A: "; DispList(A); - cout << "B: "; + cout << "集合B: "; DispList(B); Union(A, B); - cout << "AB: "; + cout << "A∪B: "; DispList(A); A.length = length_a; // Reset A to its original length Intersection(A, B); - cout << "AB: "; + cout << "A∩B: "; DispList(A); DestroyList(A); DestroyList(B);