簡體   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