2016-10-23 22 views
0

所以我有一個任務,涉及在C++中創建一個虛構的內存管理器。下面是說明從C++的鏈接列表中刪除一個特定的項目

編寫一個C++程序,模擬操作系統的責任,將 內存分配給某些程序。這將是一個非常簡單的基於頁面的內存管理視圖。啓動時,您的程序將擁有32頁連續的,未使用的內存 。每頁將是4 KB長

我的問題是,當涉及到從鏈接列表中刪除特定的「程序」。這是我目前的DestroyProgram方法

void DestroyProgram(string proName) { //Deletes 
    Node* iterator = head; 
    while (iterator != NULL) { 
     if (iterator->programName == "FREE") { 
      int count = 0; 
      while (iterator != NULL && iterator->programName == "FREE") { 
       iterator->programName = "FREE"; 
       iterator = iterator->nextProgram; 

      } 
      return; 
      count++; 
     } 
     else { 
      iterator = iterator->nextProgram; 
     } 
    } 
    cout << iterator->programName << " is not there."; 
} 

如果內存沒有被使用,它被標記爲FREE。所以即時通訊試圖說,如果程序名等於用戶輸入的程序名稱然後它被刪除。我只是困惑,爲什麼它不是工作

+0

使用正確的工具隨時隨地解決這樣的問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

第7行是不必要的......'iterator-> programName =「FREE」;',你已經檢查過它是否免費 – amanuel2

+0

我們沒有看到'iterator-> programName'的類型。如果它是'char *',並且不起作用,那很正常。 –

回答

0

我正在猜測這裏,但做這些假設:
*您鏈接列表包含您的內存管理器管理的所有內存塊
*如果節點代表一個內存塊是免費的,然後programName被設置爲「免費」
*如果該節點是由程序採取然後programName設置爲程序的名稱
*您實際上不刪除任何節點,只是重新標記爲「免費」

void DestroyProgram(string proName) { //Deletes 
    Node* iterator = head; 
    while (iterator != NULL) { 
     if (iterator->programName == proName) { 
      int count = 0; 
      while (iterator != NULL && iterator->programName == proName) { 
       iterator->programName = "FREE"; 
       iterator = iterator->nextProgram; 
      } 

      // If you return here, you're assuming that programs always have memory allocated in consecutive blocks 
      // If they request memory more than once, the memory blocks may not be together 
      // In that case, you have to keep searching through to the end of the list 
      return; 

      count++; 
     } 
     else { 
      iterator = iterator->nextProgram; 
     } 
    } 
    cout << proName << " is not there."; 
} 
0

好吧,米只是給你一個通用的版本從鏈接列表中刪除節點。從列表中刪除節點時,必須提出三種情況。

  1. 如果列表爲空
  2. 如果你想刪除的節點是頭
  3. 如果節點是其他
void DestroProgram(string proName) //Deletes 
    { 
    Node *iterator = head; 
    if(head == NULL) 
    { 
    cout << "List is empty" << endl; 
    } 
    else if(iterator->programName == proName) 
    { 
     head = head->nextProgram //point to your new head 
     delete iterator; //delete your old head 
    } 
    else 
    { 
     Node *previousNode = head; 
     while(head != NULL) 
     { 
     if(iterator->programName == proName) 
     { 
      previousNode->next = iterator->next //make the new connection between nodes 
      delete iterator 
     } 
      previousNode = iterator; //sets previousNode one node behind iterator 
      iterator = iterator->nextProgram; 
     } 
    } 
    }