【发布时间】:2017-11-04 18:44:14
【问题描述】:
所以我正在观看this video series 中关于 C 中的链表的内容,并且正在努力理解它的逻辑。
我想在这里指出的是,在视频(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
在视频 (7) 中关于在第 n 次定位时插入注释我们有这个:
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;
我们将新节点的地址分配为现有节点的旁边。如果将新节点插入到linkedlist的中间,它可以完美地工作,但是如果它在开头插入,则列表会被反转。
所以我想知道,我怎样才能摆脱这种倒置以及哪种方式是正确的?
【问题讨论】:
-
一个简单的链表通常以相反的插入顺序排列。新节点位于列表的前面。但是为什么你认为这个列表是“倒置的”?节点被插入到特定位置。
-
为什么你认为这些印刷品是“倒置的”?他们在我看来是正确的。此外 Insert at position 可能想要检查您是否已到达列表的末尾,而不是假设用户将传递一个有效的位置。
-
@WeatherVane,我认为你是对的。当我们将现有节点的下一个分配为新插入的节点时,它似乎倒置了。但是,是的,如果我总是在第一个位置插入新的点头,它似乎工作得很好而不会被“倒置”。
-
或许应该从另一端开始计算节点,也就是从
start节点往下计算。
标签: c pointers linked-list