这是代码
这是一个在指定位置后插入节点的函数。这里有temp和ptr节点。Temp节点将存储节点,之后需要插入新节点,ptr节点存储新节点的数据。
在这里,在定位temp节点之后,这是分配temp和next节点的指针细节。
此处临时节点下一个指针存储新节点ptr
ptr前一指针存储temp节点的地址
ptr下一个指针存储temp节点的下一指针的地址
但这句话的意思是我不理解temp->下一个->prev=ptr
void randomInsert()
{
struct node *ptr, *temp;
int item, loc, i;
ptr = (struct node *)malloc(sizeof(struct node));
if (ptr == NULL)
{
cout << "overflow" << endl;
}
else
{
temp = head;
cout << "Enter the location" << endl;
cin >> loc;
for (i = 1; i < loc; i++)
{
temp = temp->next;
if (temp == NULL)
{
cout << "There are less then " << loc << " elements" << endl;
return;
}
}
cout << "Enter value" << endl;
cin >> item;
ptr->data = item;
ptr->next = temp->next;
ptr->prev = temp;
temp->next = ptr;
temp->next->prev = ptr;
cout << "Node Inserted" << endl;
}
}
完整代码的链接https://www.javatpoint.com/doubly-linked-list
该代码是错误的。
temp->next = ptr;
temp->next->prev = ptr;
在temp->next = ptr;
之后,下面的行等效于:
ptr->prev = ptr;
这使它成为一个自我参考。
任一分配都应该交换,到此:
temp->next->prev = ptr;
temp->next = ptr;
或者,ptr
应用于较长的分配:
temp->next = ptr;
ptr->next->prev = ptr;
可视化
要理解这一点,有助于将其可视化。
循环结束后,temp
将引用之后的节点,新节点(由ptr
引用(应插入该节点。
因此,就在这之前,我们有一个可以像这样可视化的情况:
ptr
↓
┌───────────┐
│ value: 3 │
│ next: null│
│ prev: null│
└───────────┘
temp
↓
┌───────────┐ ┌───────────┐
│ value: 2 │ │ value: 4 │
│ next: ───────> │ next: ───────> ...
... <─────── :prev │ <─────── :prev │
└───────────┘ └───────────┘
当我们应用以下两种说法时:
ptr->next = temp->next;
ptr->prev = temp;
我们得到这个:
ptr
↓
┌───────────┐
│ value: 3 │
│ next: ────────┐
┌──────── :prev │ │
│ └───────────┘ │
temp │ │
↓ │ │
┌───────────┐ │ │ ┌───────────┐
│ value: 2 │ <┘ └> │ value: 4 │
│ next: ────────────────────────────> │ next: ───────> ...
... <─────── :prev │ <──────────────────────────── :prev │
└───────────┘ └───────────┘
然后用temp->next = ptr;
我们得到:
ptr
↓
┌───────────┐
│ value: 3 │
│ next: ────────┐
┌──────── :prev │ │
│┌> └───────────┘ │
temp ││ │
↓ ││ │
┌───────────┐ ││ │ ┌───────────┐
│ value: 2 │ <┘│ └> │ value: 4 │
│ next: ────────┘ │ next: ───────> ...
... <─────── :prev │ <──────────────────────────── :prev │
└───────────┘ └───────────┘
因此,缺少一个更新。现在做temp->next-prev = ptr;
是错误的。正确的分配是ptr->next->prev = ptr;
,这导致最终状态:
ptr
↓
┌───────────┐
│ value: 3 │
│ next: ────────┐
┌──────── :prev │ <┐│
│┌> └───────────┘ ││
temp ││ ││
↓ ││ ││
┌───────────┐ ││ ││ ┌───────────┐
│ value: 2 │ <┘│ │└> │ value: 4 │
│ next: ────────┘ │ │ next: ───────> ...
... <─────── :prev │ └──────── :prev │
└───────────┘ └───────────┘