矢量元素插入链表?

时间:2013-10-24 00:22:51

标签: c++ vector linked-list token tokenize

我正在尝试创建一个函数,它接受一个令牌向量,这是我教授定义的类型,并将向量的每个元素输入到链表中,我返回第一个元素的头部。 new_list最后一部分中的cout语句表明我确实将向量的元素插入到链表中。所以当我输入时:

new a 9 2 3

9 2 3正在插入

print_list_cmd由我的教授定义,并且假定我通过调用new a创建的列表, 所以, 打印应该返回 9 2 3 但是当我输入print时,我只得到链表的最后一个元素是3.

我有两个问题我的代码不是很优雅有没有更好的方法将标记向量插入链表?两个为什么print命令只返回链表中的最后一个元素?另外还有一个lexer类来标记输入,但它有很多代码所以我没有插入它,如果它有用或者你需要我插入它我会。

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 个答案:

答案 0 :(得分: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;
}