临时>下一个 = PTR;临时>下一个>上一页 = PTR;请告诉我在指定位置之后插入节点的双链接列表中这段代码在说什么?



这是代码

这是一个在指定位置后插入节点的函数。这里有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 │
└───────────┘                         └───────────┘    

相关内容

  • 没有找到相关文章

最新更新