所以我正在关注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;
我们将新节点的地址分配给现有节点旁边。如果将新节点插入到链表的中间,它可以很好地工作,但如果它在开头插入,则列表会被反转。
所以我想知道,我怎样才能摆脱这种反转,哪种方式是正确的?
答案 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