【问题标题】:insert element at nth position in the linked list - C在链表中的第 n 个位置插入元素 - C
【发布时间】:2017-05-26 04:24:22
【问题描述】:

我的程序显示列表为空。我认为我在将节点重新链接到头部时犯了错误。帮我弄清楚。

void insert(struct node** headRef, int index, int Data)
{
  int i, distanceFromHead = 1;
  struct node* head = *headRef;
  struct node* temp1 = (struct node*)malloc(sizeof(struct node)); //node to be inserted.
  temp1->data = Data;
  if(index == 0)
  {
    temp1->next = head;
    head = temp1;
    return;
  }
  while(head != NULL)
  {
    if(distanceFromHead == index)
    {
        temp1->next = head->next;
        head->next = temp1;
        *headRef = head;
        return;
    }
    head = head->next;
    distanceFromHead++;
  }

}

【问题讨论】:

  • 你认为head = temp1; 是做什么的?
  • temp1的@pat地址分配给head
  • 那么head会发生什么?
  • head 是函数的局部变量,在函数返回时终止。你应该分配给*headRef
  • 请注意,如果要求您在具有 3 个节点的列表中的第 10 位添加一个节点,则代码会泄漏新分配的节点。

标签: c linked-list


【解决方案1】:

你有两个条件:

  • 在链接列表中查找要插入的位置
  • 不会掉出链接列表的末尾

当然,您必须分配给*headRef,而不是某些局部指针变量。在您确定自己确实需要内存之前,您不应该调用 malloc。

您可以在一个循环中组合这两个条件:


void insert1(struct node **headRef, int index, int Data)
{
  struct node *temp1;
  int distanceFromHead = 0;

  for( ; *head; head = &(*head)->next) {
    if(distanceFromHead == index) break;
    distanceFromHead++;
  }

  if (distanceFromHead != index) return; // index not found: list too short

  temp1 = malloc(sizeof *temp1); //node to be inserted.
  temp1->data = Data;
  temp1->next = *head;
  *head = temp1;
}

你不需要 distanceFromHeadvarable;你也可以减少索引:

void insert2(struct node **headRef, int index, int Data)
{
  struct node *temp1;

  for( ; *head; head = &(*head)->next) {
    if(!index) break;
    index--;
  }
  if (index) return; // index not found: list too short

  temp1 = malloc(sizeof *temp1); //node to be inserted.
  temp1->data = Data;
  temp1->next = *head;
  *head = temp1;
}

现在,index!=0 的测试在循环之后重复。这可以通过在循环内移动插入,然后跳出来避免:

void insert3(struct node **headRef, int index, int Data)
{

  for( ; *head; head = &(*head)->next) {
    struct node *temp1;
    if(index--) continue;

    temp1 = malloc(sizeof *temp1); //node to be inserted.
    temp1->data = Data;
    temp1->next = *head;
    *head = temp1;
    break; // or : return;
  }

  return;
}

【讨论】:

    【解决方案2】:

    您正在使用head 遍历链表,如果索引与距离匹配,则更新headref

    问题是*headRef = head in while..if

    if(index == 0) 中将temp1 分配给*headref*headref=temp1

    【讨论】:

    • 那行*headRef = head; 我认为没有任何区别.. 如果我删除它,问题仍然存在.. 当我使用签名功能struct Node* insert(Node *head,int index, int data) 代码工作正常.. 我当我将头部作为参考传递时遇到问题
    • 是的,这就是重点。您正在更新头引用,并且在插入头后引用第 n 个节点或 NULL
    • @Jonathan Leffler 如何防止此程序中的内存泄漏?
    • @Surjit 如果您在 Linux 上运行该应用程序,您可以使用 Valgrind 来帮助您查找内存泄漏。对于 Windows,您可以查看 this 讨论。
    • Windows 怎么样??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2016-07-15
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多