diff --git a/CFree/▼配套习题解析/▼02 线性表/▼习题测试文档-02/Question-2.27-main.c b/CFree/▼配套习题解析/▼02 线性表/▼习题测试文档-02/Question-2.27-main.c index aa7a7ef..4b2aa84 100644 --- a/CFree/▼配套习题解析/▼02 线性表/▼习题测试文档-02/Question-2.27-main.c +++ b/CFree/▼配套习题解析/▼02 线性表/▼习题测试文档-02/Question-2.27-main.c @@ -1,117 +1,103 @@ #include #include "../../../α㷨ʵ/02 Ա/01 SequenceList/SequenceList.c" //**02 Ա**// -/* ԭ */ -void Algo_2_27__1(SqList La, SqList Lb, SqList *Lc); -void Algo_2_27__2(SqList *La, SqList Lb); -void PrintElem(LElemType_Sq e); //Ժӡ +/* + * 2.27 + * + * 󽻼C=AB + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 + */ +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc); -int main(int argc, char *argv[]) -{ - SqList La, Lb, Lc_1, *Lc_2; - int i; - int a[10] = {1,2,2,3,4,5,6,7,7,8}; - int b[10] = {2,2,3,4,4,6,7,8,8,9}; - - if(InitList_Sq(&La) && InitList_Sq(&Lb)) //Lɹ - { - for(i=1; i<=10; i++) - { - ListInsert_Sq(&La, i, a[i-1]); - ListInsert_Sq(&Lb, i, b[i-1]); - } - } - - printf("La = "); - ListTraverse_Sq(La, PrintElem); - printf("\n"); - printf("Lb = "); - ListTraverse_Sq(Lb, PrintElem); - printf("\n\n"); - - printf(" 2.27 (1)֤\n"); - InitList_Sq(&Lc_1); - Algo_2_27__1(La, Lb, &Lc_1); - printf("Lc = LaLb = "); - ListTraverse_Sq(Lc_1, PrintElem); //L - printf("\n\n"); +// ԺӡԪ +void PrintElem(LElemType_Sq e); - printf(" 2.27 (2)֤\n"); - Algo_2_27__2(&La, Lb); - Lc_2 = &La; - printf("Lc = LaLb = "); - ListTraverse_Sq(*Lc_2, PrintElem); //L - printf("\n\n"); - - return 0; + +int main(int argc, char* argv[]) { + SqList La, Lb, Lc; + int i; + + // 0ŵԪ洢鳤 + int a[] = {10, 1, 3, 3, 7, 9, 10, 13, 15, 15, 19}; + int b[] = {8, 1, 3, 7, 7, 10, 18, 18, 20}; + + // ׼ݣͬһеԪֵͬ + InitList_Sq(&La); + InitList_Sq(&Lb); + for(i = 1; i <= a[0]; i++) { + ListInsert_Sq(&La, i, a[i]); + } + for(i = 1; i <= b[0]; i++) { + ListInsert_Sq(&Lb, i, b[i]); + } + printf("La = "); + ListTraverse_Sq(La, PrintElem); + printf("\n"); + printf("Lb = "); + ListTraverse_Sq(Lb, PrintElem); + printf("\n"); + + // 󽻼Ԫظͬ + Algo_2_27(La, Lb, &Lc); + + printf("Lc = "); + ListTraverse_Sq(Lc, PrintElem); + printf("\n"); + + return 0; } -/* -2.27C=AB -*/ -/* (1) */ -void Algo_2_27__1(SqList La, SqList Lb, SqList *Lc) -{ - int i, j, k; - - i = j = 0; - k = 1; - - while(iLb.elem[j]) - j++; - else - { - if(!i || La.elem[i]!=La.elem[i-1]) - { - ListInsert_Sq(Lc, k, La.elem[i]); - k++; - } - - i++; - j++; - } - } + +/* + * 2.27 + * + * 󽻼C=AB + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 + */ +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc) { + int i, j, k; + + // ȷLaLb + if(La.elem == NULL || Lb.elem == NULL) { + return ERROR; + } + + // ʼLcʹֱʹLaĴ洢ռ + *Lc = La; + + i = j = 0; // LaLb + k = 0; // Lc + + // ֻLaLbĹͬ־ + while(i < La.length && j < Lb.length) { + if(La.elem[i] < Lb.elem[j]) { + i++; + } else if(La.elem[i] > Lb.elem[j]) { + j++; + + // LaLbеԪ + } else { + // LcΪգҪ֤еԪزظ + if(k == 0 || (*Lc).elem[k - 1] != La.elem[i]) { + (*Lc).elem[k] = La.elem[i]; + k++; + } + + i++; + j++; + } + } + + // ˳Lcij + (*Lc).length = k; + + return OK; } -/* -2.27C=AB -*/ -/* (2) */ -void Algo_2_27__2(SqList *La, SqList Lb) -{ - int i, j, k; - int len_a; - - i = j = k = 0; - len_a = 0; - - while(i<(*La).length && jLb.elem[j]) - j++; - else - { - if(!i || (*La).elem[i]!=(*La).elem[i-1]) - { - (*La).elem[k] = (*La).elem[i]; - len_a++; - k++; - } - i++; - j++; - } - } - - (*La).length = len_a; -} - -void PrintElem(LElemType_Sq e) -{ - printf("%d ", e); +void PrintElem(LElemType_Sq e) { + printf("%2d ", e); } diff --git a/CLion/ExerciseBook/02.27/02.27.c b/CLion/ExerciseBook/02.27/02.27.c index 03a294d..5f917b1 100644 --- a/CLion/ExerciseBook/02.27/02.27.c +++ b/CLion/ExerciseBook/02.27/02.27.c @@ -5,9 +5,11 @@ * 题2.27 * * 求交集:C=A∩B。 - * 不允许C中的元素重复,且C会利用A原有的空间,A被销毁。 + * + * A和B中元素可能重复,但C中元素不重复。 + * 而且,要求C利用A原有的空间。 */ -SqList Algo_2_27(SqList* La, SqList Lb); +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc); // 测试函数,打印元素 void PrintElem(ElemType e); @@ -17,25 +19,26 @@ int main(int argc, char* argv[]) { SqList La, Lb, Lc; int i; - int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12}; - int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13}; + // 0号单元存储的是数组长度 + int a[] = {10, 1, 3, 3, 7, 9, 10, 13, 15, 15, 19}; + int b[] = {8, 1, 3, 7, 7, 10, 18, 18, 20}; - // 准备测试数据 + // 准备测试数据,同一表中的元素值可能相同 InitList(&La); InitList(&Lb); - for(i = 1; i <= 10; i++) { - ListInsert(&La, i, a[i - 1]); - ListInsert(&Lb, i, b[i - 1]); + for(i = 1; i <= a[0]; i++) { + ListInsert(&La, i, a[i]); + } + for(i = 1; i <= b[0]; i++) { + ListInsert(&Lb, i, b[i]); } - printf("La = "); ListTraverse(La, PrintElem); - printf("Lb = "); ListTraverse(Lb, PrintElem); - // 求交集 - Lc = Algo_2_27(&La, Lb); + // 求交集,新链表的元素各不相同 + Algo_2_27(La, Lb, &Lc); printf("Lc = "); ListTraverse(Lc, PrintElem); @@ -43,36 +46,41 @@ int main(int argc, char* argv[]) { return 0; } -// 求交集:C=A∩B -SqList Algo_2_27(SqList* La, SqList Lb) { + +/* + * 题2.27 + * + * 求交集:C=A∩B。 + * + * A和B中元素可能重复,但C中元素不重复。 + * 而且,要求C利用A原有的空间。 + */ +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc) { int i, j, k; - SqList Lc; // 确保La和Lb存在 - if((*La).elem == NULL || Lb.elem == NULL) { - Lc.elem = NULL; - Lc.length = 0; - Lc.listsize = 0; - return Lc; + if(La.elem == NULL || Lb.elem == NULL) { + return ERROR; } + // 初始化Lc,使其直接使用La的存储空间 + *Lc = La; + i = j = 0; // 遍历La和Lb k = 0; // 遍历Lc - Lc.elem = (*La).elem; - Lc.listsize = La->listsize; - // 只遍历La和Lb的共同部分就行 - while(i < (*La).length && j < Lb.length) { - if((*La).elem[i] < Lb.elem[j]) { + while(i < La.length && j < Lb.length) { + if(La.elem[i] < Lb.elem[j]) { i++; - } else if((*La).elem[i] > Lb.elem[j]) { + } else if(La.elem[i] > Lb.elem[j]) { j++; + // 如果La和Lb中的元素相等 } else { - // 确保Lc中的元素不重复 - if(k == 0 || Lc.elem[k - 1] != (*La).elem[i]) { - Lc.elem[k] = (*La).elem[i]; + // 如果Lc不为空,则需要保证其中的元素不重复 + if(k == 0 || (*Lc).elem[k - 1] != La.elem[i]) { + (*Lc).elem[k] = La.elem[i]; k++; } @@ -81,16 +89,12 @@ SqList Algo_2_27(SqList* La, SqList Lb) { } } - // 销毁A,但其空间交给了C使用 - (*La).elem = NULL; - (*La).length = 0; - (*La).listsize = 0; + // 更新顺序表Lc的长度 + (*Lc).length = k; - Lc.length = k; - - return Lc; + return OK; } void PrintElem(ElemType e) { - printf("%d ", e); + printf("%2d ", e); } diff --git a/Dev-C++/ExerciseBook/02.27/02.27.cpp b/Dev-C++/ExerciseBook/02.27/02.27.cpp index f575a69..9fe7cae 100644 --- a/Dev-C++/ExerciseBook/02.27/02.27.cpp +++ b/Dev-C++/ExerciseBook/02.27/02.27.cpp @@ -5,9 +5,11 @@ * 2.27 * * 󽻼C=AB - * CеԪظCAԭеĿռ䣬A١ + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 */ -SqList Algo_2_27(SqList* La, SqList Lb); +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc); // ԺӡԪ void PrintElem(ElemType e); @@ -16,81 +18,84 @@ void PrintElem(ElemType e); int main(int argc, char* argv[]) { SqList La, Lb, Lc; int i; - - int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12}; - int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13}; - - // ׼ + + // 0ŵԪ洢鳤 + int a[] = {10, 1, 3, 3, 7, 9, 10, 13, 15, 15, 19}; + int b[] = {8, 1, 3, 7, 7, 10, 18, 18, 20}; + + // ׼ݣͬһеԪֵͬ InitList(&La); InitList(&Lb); - for(i = 1; i <= 10; i++) { - ListInsert(&La, i, a[i - 1]); - ListInsert(&Lb, i, b[i - 1]); + for(i = 1; i <= a[0]; i++) { + ListInsert(&La, i, a[i]); + } + for(i = 1; i <= b[0]; i++) { + ListInsert(&Lb, i, b[i]); } - printf("La = "); ListTraverse(La, PrintElem); - printf("Lb = "); ListTraverse(Lb, PrintElem); - - // 󽻼 - Lc = Algo_2_27(&La, Lb); - + + // 󽻼Ԫظͬ + Algo_2_27(La, Lb, &Lc); + printf("Lc = "); ListTraverse(Lc, PrintElem); - + return 0; } -// 󽻼C=AB -SqList Algo_2_27(SqList* La, SqList Lb) { + +/* + * 2.27 + * + * 󽻼C=AB + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 + */ +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc) { int i, j, k; - SqList Lc; - + // ȷLaLb - if((*La).elem == NULL || Lb.elem == NULL) { - Lc.elem = NULL; - Lc.length = 0; - Lc.listsize = 0; - return Lc; + if(La.elem == NULL || Lb.elem == NULL) { + return ERROR; } - + + // ʼLcʹֱʹLaĴ洢ռ + *Lc = La; + i = j = 0; // LaLb k = 0; // Lc - - Lc.elem = (*La).elem; - Lc.listsize = La->listsize; - + // ֻLaLbĹͬ־ - while(i < (*La).length && j < Lb.length) { - if((*La).elem[i] < Lb.elem[j]) { + while(i < La.length && j < Lb.length) { + if(La.elem[i] < Lb.elem[j]) { i++; - } else if((*La).elem[i] > Lb.elem[j]) { + } else if(La.elem[i] > Lb.elem[j]) { j++; + // LaLbеԪ } else { - // ȷLcеԪزظ - if(k == 0 || Lc.elem[k - 1] != (*La).elem[i]) { - Lc.elem[k] = (*La).elem[i]; + // LcΪգҪ֤еԪزظ + if(k == 0 || (*Lc).elem[k - 1] != La.elem[i]) { + (*Lc).elem[k] = La.elem[i]; k++; } - + i++; j++; } } - - // Aռ佻Cʹ - (*La).elem = NULL; - (*La).length = 0; - (*La).listsize = 0; - - Lc.length = k; - - return Lc; + + // ˳Lcij + (*Lc).length = k; + + return OK; } void PrintElem(ElemType e) { - printf("%d ", e); + printf("%2d ", e); } + diff --git a/VisualC++/ExerciseBook/02.27/02.27.c b/VisualC++/ExerciseBook/02.27/02.27.c index f575a69..919c95c 100644 --- a/VisualC++/ExerciseBook/02.27/02.27.c +++ b/VisualC++/ExerciseBook/02.27/02.27.c @@ -5,9 +5,11 @@ * 2.27 * * 󽻼C=AB - * CеԪظCAԭеĿռ䣬A١ + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 */ -SqList Algo_2_27(SqList* La, SqList Lb); +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc); // ԺӡԪ void PrintElem(ElemType e); @@ -17,25 +19,26 @@ int main(int argc, char* argv[]) { SqList La, Lb, Lc; int i; - int a[10] = {1, 2, 2, 3, 4, 4, 9, 9, 10, 12}; - int b[10] = {1, 1, 2, 2, 3, 3, 4, 5, 12, 13}; + // 0ŵԪ洢鳤 + int a[] = {10, 1, 3, 3, 7, 9, 10, 13, 15, 15, 19}; + int b[] = {8, 1, 3, 7, 7, 10, 18, 18, 20}; - // ׼ + // ׼ݣͬһеԪֵͬ InitList(&La); InitList(&Lb); - for(i = 1; i <= 10; i++) { - ListInsert(&La, i, a[i - 1]); - ListInsert(&Lb, i, b[i - 1]); + for(i = 1; i <= a[0]; i++) { + ListInsert(&La, i, a[i]); + } + for(i = 1; i <= b[0]; i++) { + ListInsert(&Lb, i, b[i]); } - printf("La = "); ListTraverse(La, PrintElem); - printf("Lb = "); ListTraverse(Lb, PrintElem); - // 󽻼 - Lc = Algo_2_27(&La, Lb); + // 󽻼Ԫظͬ + Algo_2_27(La, Lb, &Lc); printf("Lc = "); ListTraverse(Lc, PrintElem); @@ -43,36 +46,41 @@ int main(int argc, char* argv[]) { return 0; } -// 󽻼C=AB -SqList Algo_2_27(SqList* La, SqList Lb) { + +/* + * 2.27 + * + * 󽻼C=AB + * + * ABԪؿظCԪزظ + * ңҪCAԭеĿռ䡣 + */ +Status Algo_2_27(SqList La, SqList Lb, SqList* Lc) { int i, j, k; - SqList Lc; // ȷLaLb - if((*La).elem == NULL || Lb.elem == NULL) { - Lc.elem = NULL; - Lc.length = 0; - Lc.listsize = 0; - return Lc; + if(La.elem == NULL || Lb.elem == NULL) { + return ERROR; } + // ʼLcʹֱʹLaĴ洢ռ + *Lc = La; + i = j = 0; // LaLb k = 0; // Lc - Lc.elem = (*La).elem; - Lc.listsize = La->listsize; - // ֻLaLbĹͬ־ - while(i < (*La).length && j < Lb.length) { - if((*La).elem[i] < Lb.elem[j]) { + while(i < La.length && j < Lb.length) { + if(La.elem[i] < Lb.elem[j]) { i++; - } else if((*La).elem[i] > Lb.elem[j]) { + } else if(La.elem[i] > Lb.elem[j]) { j++; + // LaLbеԪ } else { - // ȷLcеԪزظ - if(k == 0 || Lc.elem[k - 1] != (*La).elem[i]) { - Lc.elem[k] = (*La).elem[i]; + // LcΪգҪ֤еԪزظ + if(k == 0 || (*Lc).elem[k - 1] != La.elem[i]) { + (*Lc).elem[k] = La.elem[i]; k++; } @@ -81,16 +89,12 @@ SqList Algo_2_27(SqList* La, SqList Lb) { } } - // Aռ佻Cʹ - (*La).elem = NULL; - (*La).length = 0; - (*La).listsize = 0; + // ˳Lcij + (*Lc).length = k; - Lc.length = k; - - return Lc; + return OK; } void PrintElem(ElemType e) { - printf("%d ", e); + printf("%2d ", e); }