1

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

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

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;
}
4

2 回答 2

2
d->x=x;

正在覆盖以前存在的任何字符。你期望会发生什么?

0!=d

可以简化为刚刚d,无需比较0

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

至于您的 update,由于以下几行,您总是会遇到段错误:

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.
    }
  } 
于 2012-09-17T04:13:24.873 回答
1

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

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

于 2012-09-17T04:12:54.377 回答