在第n个插入一个节点与C

时间:2017-11-04 18:44:15

标签: c pointers linked-list

所以我正在关注C中的链接列表this video series,并且正在抨击我的头,以了解它的逻辑。

我想在这里指出的是,在视频(6)中关于如何在开始时插入节点我们有这个:

void Insert(int input)
{
 struct Node *newNode = malloc(sizeof(struct Node));
 newNode->data = input;
 newNode->next = start;
 start = newNode;
}

它完成了工作并且在打印时我们得到了这个:

  Insert(10);
  Insert(20);
  Insert(30);
  Insert(40);
  Print();

40 30 20 10

在关于在第n个位置插入笔记的视频(7)中,我们有:

void Insert(int input, int position)
{
  struct Node *newNode = malloc(sizeof(struct Node));
  newNode->data = input;

  if (position == 1)
  {
    newNode->next = start;
    start = newNode;
    return;
  }

  struct Node *runner = start;

  for (int i = 1; i < position-1; i++)
  {
    runner = runner->next;
  }

  newNode->next = runner->next;
  runner->next = newNode;

}

打印我们有这个:

  Insert(10,1);
  Insert(20,2);
  Insert(30,3);
  Insert(40,4);
  Print();
10 20 30 40

哪个倒了! 我试图追踪为什么会发生这种情况并发现错误在这里:

runner->next = newNode;

我们将新节点的地址分配给现有节点旁边。如果将新节点插入到链表的中间,它可以很好地工作,但如果它在开头插入,则列表会被反转。

所以我想知道,我怎样才能摆脱这种反转,哪种方式是正确的?

1 个答案:

答案 0 :(得分:0)

实际上这是我的逻辑误解。 当一个人在第n个位置插入节点时,根据@WeatherVane,list实际上与插入顺序相反。 (先进先打印)

要按顺序获取“首先打印到最后打印”,我们需要在开头堆叠点头:

  Insert(10,1);
  Insert(20,1);
  Insert(30,1);
  Insert(40,1);
  Print();
40 30 20 10

而不是:

  Insert(10,1);
  Insert(20,2);
  Insert(30,3);
  Insert(40,4);
  Print();
10 20 30 40