单个链表中的c ++插入节点

时间:2012-09-17 04:06:36

标签: c++

有人能帮我理解我做错了什么。我需要在链接列表中插入一个字符。

它需要像人的名字一样输入,而不是反转它。 然后它告诉用户选择一个位置来添加一个角色。

void insert_char(Node* plist, char x, int p){
  Node* d=plist;
  for (int i=1; i<p and 0!=d; i++)
    d=d->next;
  if (0 !=d)
    d->x=x;

但是,此代码会更改字符,而不是添加字符。

更新:

我还是无法弄明白。

void insert_char(Node* plist, char x, int p){
    Node* d=plist;
    Node* d2=0;
    for (int i=1; i<p and 0!=d; i++)
        d2->next=d->next;
    d->next=d2;
    if (0 !=d)
        d2->x=x;
    return;
}

我收到了分段错误。

好的,所以我想通了,我真正想要的是什么。谢谢你的帮助

  void insert_char(Node* plist, char x, int p){
  Node* d=plist;
  Node* d2= new Node();
  for (int i=1; i<p and d; i++)
    d2->next=d->next;
    d->next=d2;
  if (0 !=d)
    d2->x=x;
  return;
}

2 个答案:

答案 0 :(得分:2)

d->x=x;

覆盖以前的任何角色。你期望发生什么?

0!=d

可简化为d,无需与0进行比较。

使用大括号也可能有帮助。我知道能够用这样的一行来忽略它们很好,但有一天它会最终回来咬你。

至于您的更新,由于以下原因,您总是会遇到段错:

Node* d2=0;
d2->next=d->next;
d2->x=x;

您正在创建Node*并且从不为其分配任何内容,也没有分配内存。您正在取消引用未初始化的指针。

你确定你没有尝试这样做吗?

void insert_char(Node* plist, char x, int p){
  Node* d=plist;
  for (int i=1; i<p && d; i++)
    d=d->next;
  if (!d) // If this node is empty..
  {
    d = new Node; // Store a new node at the position.
    d->x = x; // Set the char value for the new node.
  }
  else // If this node is not empty..
  {        
    Node* next = d->next(); // Get the next node.
    d = new Node; // Create a new node and insert.
    d->x = x; // Set the char for this node.
    if(next) // If there was a mode above our insertion..
    {          
      newNode->next = next; // Store it in the next member of our new node.
    }
  } 

答案 1 :(得分:1)

目前,最终if语句的主体只是覆盖当前节点的x值。为了将新节点粘贴到链表中,您需要。 1.创建一个新节点 2.在列表中选择新节点的位置(您已经这样做了) 3.将前一个节点指向节点 4.将节点指向下一个节点

完成所有这些工作有一些细微差别,但希望这足以开始。