2013-10-24 82 views
0

我試圖創建一個函數,它接受一個由我的教授定義的類型的向量,並將該向量的每個元素輸入到鏈表中,然後返回第一個元素的頭部。 new_list的最後一部分的cout語句表明我確實將向量的元素插入到鏈表中。所以,當我輸入:插入鏈接列表的向量元素?

新9 2 3

9 2 3被插入

的print_list_cmd是我的教授定義,應該指出,我通過調用新創建的列表中, 所以, 打印一個應該返回但是當我鍵入打印我只得到鏈表是3

的最後一個元素,我有兩個問題,我的代碼是不是很優雅還有更好的將一個標記向量插入到一個方法中的方法鏈表?兩個爲什麼print命令只返回鏈表中的最後一個元素?還有一個詞法分析器類來標記輸入,但它有很多代碼,所以我沒有插入它,如果它有幫助,或者你需要我插入它,我會的。在你的代碼

struct Node { 
int key; 
Node* next; 
Node(int k=0, Node* n=NULL) : key(k), next(n) {}; 
}; 


Node* new_list(const vector<Token>& tok_vec){ 

//int key; 
Node *head; 
Node *newHead; 
Node *headPointer = NULL; 

newHead = new Node; 
newHead -> next = NULL; 
head = NULL; 

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

    // newHead -> key = tok_vec.at(i).value; 
     string myStream = tok_vec.at(i).value; 
     istringstream buffer(myStream); 
     int value; 
     buffer >> value; 
     newHead -> key = value; 

    if(!head){ 

     head = newHead; 

     }else{ 

      headPointer = newHead; 

      while(headPointer -> next){ 

       headPointer = headPointer -> next; 
       headPointer -> next = newHead; 

       } 
      } 
cout << head->key << endl; 
} 

return head->key; 

} 

void print_list_cmd(Lexer lex){ 
Token tok = lex.next_token(); 
if (tok.type != IDENT || lex.has_more_token()) 
    throw runtime_error("SYNTAX: print listname"); 
if (list_table.find(tok.value) == list_table.end()) 
    throw runtime_error(tok.value + " not defined or already destroyed"); 
print_list(list_table[tok.value]); 
} 

回答

1

看,你不回列表的頭,你從頭部節點返回值:

return head->key; 

代替:

return head; 

而且,將新項目插入列表的最有效方法是將它們插入到列表中:

/// inserts node at the head of the list and returns the new head; 
Node* insertNode(int key, Node* head) { 

Node* newHead = new Node; 
newHead->key = key; 
newHead->next = head; 
return newHead; 
} 

,你可以使用它作爲:

Node* new_list(const vector<Token>& tok_vec){ 
Node* head = NULL; 

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

     string myStream = tok_vec.at(i).value; 
     istringstream buffer(myStream); 
     int value; 
     buffer >> value; 
     head = insertNode(value, head); 
/// 
} 

return head; 

} 

更新。結果列表將與輸入有關,因此您必須將其反轉。可能性之一是創建從原來彼此列表,以便在年底的舊列表的最後一個元素將成爲新的頭:我打印出

Node* reverse(Node* list) { 
Node* reversed = NULL; 
while (list!=NULL) { 
    Node* nextNode = list; 
    list = list->next; 
    nextNode->next = reversed; 
    reversed = nextNode; 
} 
return reversed; 
} 
+0

唯一的問題是向後的向量,我不完全確定如何解決它? – user2757849

+1

啊,你必須扭轉列表。一種選擇是創建另一個列表,並開始從您的舊列表中插入所有元素,從頭開始並從舊列表中刪除它們。 – Ashalynd