【问题标题】:Vector elements inserted into a linked list?向量元素插入到链表中?
【发布时间】:2013-10-24 00:22:51
【问题描述】:

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

新的 9 2 3

9 2 3 正在插入

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

我有两个问题我的代码不是很优雅有没有更好的方法将标记向量插入到链表中?二 为什么打印命令只返回链表中的最后一个元素?还有一个词法分析器类可以对输入进行标记,但它有很多代码,所以我没有插入它,如果它有帮助或者你需要我插入它我会的。

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]);
}

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

    • 唯一的问题是我正在向后打印矢量并且我不完全确定如何修复它?
    • 啊,你必须把列表倒过来。一种选择是创建另一个列表并开始将旧列表中的所有元素插入其中,从头部开始并从旧列表中删除它们。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多