【发布时间】:2020-10-04 05:34:31
【问题描述】:
所以我有以下问题:
给定一个数组 l1,l2,l3 。 . . ln,创建一个新数组如下: (l1+ln),(l2+l[n-1]), . . .(l[n/2]+l[n/2+1])。这个问题有以下规则和信息:
- 原始列表只能阅读一次。
- 列表是动态的,只有值和指向下一项的指针。
- 新列表的类型必须与原始列表相同。
- 不允许创建辅助列表来多次读取数据。
我已经尝试了很多次来解决它,虽然我已经接近解决方案,但结果仍然是错误的顺序。接下来我展示我当前的测试场景:
结构号 { 整数值; 否* 下一个; }; typedef No* Noptr; 主函数() { Noptr L = NULL; 插入列表(L,1); 插入列表(L,2); 插入列表(L,3); 插入列表(L,5); 插入列表(L,4); 插入列表(L,3); 插入列表(L,9); 插入列表(L,2); 插入列表(L,7); 插入列表(L,1); 插入列表(L,10); 插入列表(L,12); 插入列表(L,11); 插入列表(L,15); 插入列表(L,19); 插入列表(L,16); Noptr L4 = SumValues(L); 利斯塔(L4); 返回0; } Noptr SumValues(Noptr&L) { 如果(L == NULL){ 返回 L; } Noptr L1 = NULL; Noptr L2 = NULL; Noptr aux1 = L; 布尔偶数=假; 而(辅助1!= NULL) { 如果(!甚至) { InsertLista(L1,aux1->Value); } 别的 { InsertLista(L2,aux1->Value); } 偶数 = !偶数; aux1 = aux1->下一步; } L2 = InverterLista(L2); Noptr LReturn = NULL; 辅助1 = L1; Noptr aux2 = L2; 而(辅助1!= NULL){ InsertList(LReturn ,(aux1->Value+aux2->Value)); aux1 = aux1->下一步; aux2 = aux2->下一步; } 免费(L1); 免费(L2); 免费(辅助1); 免费(辅助2); 返回L返回; }我期望数组:17, 21, 18, 16, 16, 13, 10, 9;
相反,我得到了:17, 18, 16, 10, 9, 13, 16, 21
为了更好地可视化,我创建了一个表格
[00] [01] [02] [03] [04] [05] [06] [07] INDEX
17 21 18 16 16 13 10 09 EXPECTED
17 18 16 10 09 13 16 21 RESULT
我做错了什么?
【问题讨论】:
-
无法复制。相反,我得到 11 个编译器错误。
-
使用更小、更容易分析的测试用例。
-
通过准备列表
L1和L2,你是不是违反了这个条件-不允许创建一个辅助列表来多次读取数据。 ? -
您似乎将此练习与其他练习混淆了。没有提到偶数和奇数元素,只是前半部分添加到后半部分的反面。
-
@H.S.该规则是为了防止创建类似的东西:Lcopy = Loriginal;尽可能多地阅读 Lcopy,因为它不是 Loriginal。对不起,如果它令人困惑。 Molbdnilo,代码只是我的尝试之一,因为列表可以包含任意数量的元素,只要它有偶数个,我认为将它们分成 2 个子列表会有所帮助。