在链表中的第 n 个位置插入节点

Inserting a node in nth position in a linked list

本文关键字:位置 插入 节点 链表      更新时间:2023-10-16
#include<iostream>
using namespace std;
struct node {
    int data;
    node *link;
};
node *head = NULL;
void insert(int data, int n)
{
    node *temp = new node();
    temp->data = data;
    if (n == 1)
    {
        temp->link = head;
        head = temp;
    }
    else 
    {
        node* ptr = head;
        for (int i = 1; i <= n - 1; i++)
            ptr = ptr->link;
        temp->link = ptr->link;
        ptr->link = temp;
    }
}
void print()
{
    cout << "list is: ";
    node *temp = head;
    while (temp != NULL)
    {
        cout << temp->data << " ";
        temp = temp->link;
    }
    cout << endl;
}
int main()
{
    insert(2, 1);
    insert(3, 2);
    insert(4, 3);
    insert(5, 4);
    insert(6, 5);
    print();
    return 0;
}

这是在第 n 位实现在链表中插入的代码。数据和位置是从主位置传递的。

我不明白我可能犯的错误是什么,这与for loop有关。

它不会执行,但是如果我进行以下更改:

for(int i=0;i<n-2;i++)

它工作正常。

第一个insert(2,1)工作正常。所以你有这样的链表

(2)->NULL
 |
head

在第二个插入中,让我们按照代码,

1. else 
2. {
3.    node* ptr = head;
4.    for (int i = 1; i <= n - 1; i++)
5.        ptr = ptr->link;
6.    temp->link = ptr->link;
7.    ptr->link = temp;
8. }

第 3 行,ptr指向headn为 2

(2)->NULL
 |
head
 |
ptr

第 4 行,1 <= (2-1) true因为1 == 1,所以 for 循环运行一次

第 5 行,ptr移动一步,因此指向NULL

(2)->NULL
 |    |
head  |
      |
     ptr

6号线,ptr->link叫,NULL->link。所以它在这里崩溃了。


当你做for(int i=0;i<n-2;i++)时,n是2,所以0 < (2-2)false,所以它运行良好。注意:仅当按示例所示的顺序进行插入调用时才有效。如果以错误的顺序调用它们,它将不起作用。

将第 6 行更改为 temp->link = ptr; ,也应该在不更改循环的情况下工作。

"在链表中的第n个位置插入节点":

使用std::list而不是自己滚动。然后使用 std::list::insert。

另外;考虑只使用std:: vector。列表是一种可怕的(指针追逐,缓存未命中诱导)数据结构,用于现代CPU。std::vector几乎总是会击败它(不管你的教科书对理论表现怎么说)。