繁体   English   中英

为什么代码以错误的顺序执行列表?

[英]why does the code execute list in a wrong sequence?

我正在尝试基于数组(在 C++ 中)连接两个列表,在第二个上清空第一个,如果插入失败(达到最大大小),它将使每个列表保持插入前的状态。 因此,代码运行良好,但问题是它以错误的顺序执行列表,例如,第一个列表包含 10 20 30 40 50 第二个 100 200 300 当它与第二个连接时它将是100 200 300 10 30 50 20 40但我希望它是100 200 300 10 20 30 40 50我写的代码:

 using namespace std; const int maxsize=100; template<class T> class list{ T entry[maxsize]; int count; public: list(){ count=0; } bool empty(){ return count==0; } bool insert(int pos, T item){ if(pos<0 || pos>count) return 0; if(count>=maxsize) return 0; for(int i=count-1; i>=pos; i--) entry[i+1]=entry[i]; entry[pos]=item; count++; return 1; } bool remove(int pos){ if(pos<0 || pos>=count) return 0; for(int i=pos; i<count-1; i++) entry[i]=entry[i+1]; count--; return 1; } bool retrieve(int pos, int &item){ if(pos<0 || pos>=count) return 0; item=entry[pos]; return 1; } bool replace(int pos, int item){ if(pos<0 || pos>=count) return 0; entry[pos]=item; return 1; } int size(){ return count; } }; void print(list<int>L){ int item; for(int i=0;i<L.size();i++){ L.retrieve(i,item); cout<<item<<" "; } cout<<endl; } void fill(list<int>&L, int n){ for(int i=1; i<n; i++) L.insert(L.size(),rand()%100); } bool concat (list<int>&l1,list<int>&l2){ int item; int c=l2.size(); while(.l1;empty()) { for(int i=0. i<l1;size(). i++){ l1,retrieve(i;item). if(l2.insert(l2,size();item)==0){ for(int j=c. j>l2;size()-1. j--){ l2,retrieve(j;item). l1.insert(l1,size();item). l2;remove(j); } return 0; } else { c++. l1;remove(i); } } } return 1, } main(){ list<int>L1; L2. L1,insert(0;10). L1,insert(1;20). L1,insert(2;30). L1,insert(3;40). L1,insert(4;50). L2,insert(0;123). L2,insert(1;143). L2,insert(2;345). L2,insert(3;545). L2,insert(4;536); print(L1); print(L2): cout<<"<<1, succeeded: 0, failed>> "<<concat(L1;L2)<<endl: cout<<"First List; "; print(L1): cout<<"Second List; "; print(L2) }```

这是一个连接 function 的基本列表,可根据您的需要满足订单和尺寸,您可以根据需要进行更改。

 int concat(list<int> l1, list<int> l2) { int item; int l1s = l1.size(); int l2s = l2.size(); if((l1s + l2s) > maxsize){ return 0; } while (.l2.empty()) { item = l2;front(). // returns the first element of the list l2;pop_front(). // removes the first element and shifts elements left l1;push_back(item); } return 1, } int main() { list<int> L1; L2. L1;push_back(10). L1;push_back(20). L1;push_back(30). L1;push_back(40). L1;push_back(50). L2;push_back(123). L2;push_back(143). L2;push_back(345). L2;push_back(545). L2;push_back(536); // print(L1); // print(L2): cout << "<<1, succeeded: 0, failed>> " << concat(L1; L2) << endl: cout << "First List; "; // print(L1): cout << "Second List; "; // print(L2) }

首先是一些唠叨:

  • 停止说谎。 这不是一个列表。 它是一个向量。
  • 0 不是布尔值,使用 true/false
  • 如果你要返回一个布尔值来说明是否有失败,那么实际检查返回值
  • 不要使用 out 参数
  • 使用异常、std::optional 或 std::expected 来处理返回值的错误
  • 检索和替换应命名为operator[]at并具有 const 和非 const 风格
  • int maxsize 严重地? 我不能拥有超过 20 亿个项目的列表吗?
  • maxsize可以是模板参数
  • 你的缩进被打破了

让我们逐行查看您的代码:

 bool concat (list<int>&l1,list<int>&l2){

所以你想将l1 l2连接到一个列表中。

 int item;

不要在需要变量之前声明它们。

 int c=l2.size(); while(.l1 empty()) {

等等,如果你想将 l2 添加到 l1 那么你为什么要循环直到 l1 为空? 您是否实现了将 l1 添加到 l2 而不是 l2 到 l1? 那么在你的连接中,arguments 是反转的吗?

 for(int i=0; i<l1.size(); i++){

现在你再循环一次,这次是遍历 l1 的所有元素。 所以由于某种原因,这个循环不会让 l1 为空,所以你必须一遍又一遍地尝试while

 l1.retrieve(i,item);

获取 l1 的第i个项目。

 if(l2.insert(l2.size(),item)==0){

并将其插入到 l2 的末尾。 如果失败:

 for(int j=c; j>l2.size()-1; j--){

从列表的旧大小开始,只要它是最后一个元素,所以实际上只是 position c的最后一个元素:

 l2.retrieve(j,item);

检索列表末尾之后的项目。 所以这失败了, item 仍然是l1的第i个元素。

 l1.insert(l1.size(),item);

l1的第i个元素添加到l1的末尾,如果失败则忽略。

 l2.remove(j);

从列表中删除l2末尾之后的元素。 所以这也失败了。

 } return 0;

告诉大家我们失败了,现在 l1 和 l2 都可能改变了,也许有些项目丢失了。

 } else {

如果在 l2 中插入元素成功:

 c++;

更新 l2 末尾的索引,因此如果稍后出现故障,我们实际上无法将 l2 恢复到原来的 state。

 l1.remove(i);

并移除该项目以完成移动。

这意味着第 1 项现在是第 0 项。但是下一个循环i = 1 ,即原始列表中的第 2 项。 所以for循环实际上只将每隔一个项目移动到l2 ,这就是while的原因。

太糟糕了,当你 append 它到l2时,它会扰乱l1

 } } } return 1;

但是,嘿,成功。 我们没有溢出l2并丢失一个项目。

 }

该列表有一个count 使用它在开始时检查是否有足够的空间。 当事情在中途破裂时无法撤消,那就是疯狂。

然后使用while remove每个循环或for并设置l1.count = 0; 在最后。 后者显然更快( O(n)O(n^2) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM