2011-04-24 14 views
1

我有節點的鏈接列表,每個節點被定義爲:複製和再排序鏈表

struct Node { 
    char name[14]; 
    int counts[130]; 
    char gender; 
    Node *nextPtr; 
}; 

我複製此鏈表用下面的代碼:

// Create a copy of the current list 
    Node *tempPtr; 
    while (headPtr != NULL) { 
    tempPtr = new Node; 
    tempPtr = headPtr; 

    // Advance the list 
    headPtr = headPtr->nextPtr; 
    } // End while loop 

我需要複製列表以便我可以對其進行排序,我不想對原始列表進行排序。排序將根據counts []數組某個位置處的值進行遞減。我想知道有人可以告訴我,我正確地複製列表嗎?如果我能夠對如何處理和分類這個列表有所瞭解。我已經用Java編寫了這個程序,沒有任何問題,因爲對c編程語言知之甚少,我深表歉意。任何輸入將不勝感激。謝謝。

我很抱歉,我要用C++編程語言編寫它。但是,我不允許使用C++類。我只能使用C++ I/O流,引用參數和動態內存分配。

我的主要目標是製作指向現有節點的指針列表,然後對其進行排序而不復制節點或干擾原始列表。

+0

是,C++或C? – 2011-04-24 21:05:31

+1

爲什麼要用C++或Java編寫自己的鏈表類(或者C,請參考)? – 2011-04-24 21:09:01

+0

C++或C.選擇一個。 – 2011-04-24 21:10:20

回答

3

C中沒有這樣的東西new您是否在使用C++編譯器?

忽略了,問題是你沒有任何複製,實際上正在創造一個內存泄漏:

tempPtr = new Node; 
tempPtr = headPtr; 

您在堆上創建一個新的節點,分配指針tempPtr ...然後重新分配tempPtrheadPtr。你剛剛失去了新分配的Node(內存泄漏)。

要創建列表副本,您需要遍歷現有列表,將數據複製到要添加到新列表的新節點中。

Node *oldNode = headPtr; 
Node *newHead = malloc(sizeof(struct Node)); 
Node *tail = newHead; 

while(oldNode != NULL) 
{ 
    memcpy(tail, oldNode, sizeof(struct Node)); 
    oldNode = oldNode->nextPtr; 
    if (oldNode != NULL) 
    { 
     tail->nextPtr = malloc(sizeof(struct Node)); 
     tail = tail->nextPtr; 
    } 
} 

(未經測試,我還沒有做下一段時間,但應該這樣做)

+0

是的,我正在使用C++編譯器。有沒有辦法建立一個只包含現有節點的列表? – 2011-04-24 21:03:32

+0

@ VanDarg:那麼爲什麼要標記問題'c'? – 2011-04-24 21:10:54

+0

我相信我同時標記了 – 2011-04-24 21:12:52