有人可以說明為什么這個deleteB函式在洗掉后最后會留下一個尾隨 0。我出于好奇嘗試了這種方法。
我試圖訪問 head 的前一個指標并使其成為下一個指標指向head->next而不是head.
之后,我將更改前一個指標 ofhead->next并使其指向head->prev而不是head.
最后我改變free了.temphead
也許方法是錯誤的......如果我錯了,請指導我。

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *prev;
struct Node *next;
} Node;
void deleteB(Node **head)
{
if (*head != NULL)
{
if ((*head)->next == *head)
{
*head = NULL;
return;
}
Node *temp = *head;
(*head)->prev->next = (*head)->next;
(*head)->next->prev = (*head)->prev;
*head = (*head)->next;
free(temp);
// Node *curr = *head;
// while (curr->next != *head)
// {
// curr = curr->next;
// }
// curr->next = (*head)->next;
// (*head)->next->prev = curr;
// *head = (*head)->next;
// free(temp);
}
}
void prepend(Node **head, int value)
{
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->prev = NULL;
newNode->next = NULL;
newNode->data = value;
if (*head == NULL)
{
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
return;
}
Node *temp = *head;
while (temp->next != *head)
{
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
newNode->next = *head;
*head = newNode;
}
void append(Node **head, int value)
{
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->prev = NULL;
newNode->next = NULL;
newNode->data = value;
if (*head == NULL)
{
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
return;
}
Node *temp = *head;
while (temp->next != *head)
{
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
newNode->next = *head;
}
void display(Node *head)
{
printf("\nPrinting the list: ");
Node *temp = head;
do
{
printf("-->%d", temp->data);
temp = temp->next;
} while (temp != head);
}
int main()
{
Node *head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
append(&head, 4);
// insertAtN(&head, 9, 1);
deleteB(&head);
display(head);
printf("\n");
return 0;
}
uj5u.com熱心網友回復:
在(非空,回圈)雙向鏈表中插入節點時,需要設定 4 個指標。兩個指向遠離新節點,兩個指向它。您錯過了后兩者之一:
(*head)->prev = newNode;
其他一些評論:
prepend具有與 相同的代碼append,只是在其后多了一條陳述句。所以避免代碼重復,讓prependcallappend.創建一個單獨的函式,僅用于構建新節點
不要將
prevandnext成員初始化為NULL,因為這絕不是它們在回圈串列中應該具有的值。為什么不用自我參考來初始化它們......那么至少有可能這將是最終值,并且您永遠不必檢查它們的值是否為NULL.在
append(and ) 中,當您有從頭節點到該尾節點的直接prepend參考時,您沒有充分的理由temp沿著串列的所有節點向前走以找到最后一個節點!( )prev不要強制轉換回傳的值
mallocdisplay將空串列傳遞給它時將具有未定義的行為。所以加了一個后衛。
更新代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *prev;
struct Node *next;
} Node;
void deleteB(Node **head)
{
if (*head != NULL)
{
if ((*head)->next == *head)
{
*head = NULL;
return;
}
Node *temp = *head;
(*head)->prev->next = (*head)->next;
(*head)->next->prev = (*head)->prev;
*head = (*head)->next;
free(temp);
}
}
// Separate function, just to construct a node
Node *newNode(int value)
{
Node *node = malloc(sizeof(Node)); // Don't cast
node->prev = node; // Circular list never has NULL here, so don't put it
node->next = node;
node->data = value;
return node;
}
void append(Node **head, int value)
{
Node *node = newNode(value);
if (*head == NULL)
{
*head = node;
return;
}
// We can find the tail with one step
Node *tail = (*head)->prev;
tail->next = node;
node->prev = tail;
node->next = *head;
(*head)->prev = node; // This was missing
}
void prepend(Node **head, int value)
{
append(head, value); // Code reuse
*head = (*head)->prev;
}
void display(Node *head)
{
printf("Printing the list: ");
if (head == NULL) // Guard!
{
return;
}
Node *temp = head;
do
{
printf("-->%d", temp->data);
temp = temp->next;
} while (temp != head);
printf("\n");
}
int main()
{
Node *head = NULL;
append(&head, 1);
append(&head, 2);
append(&head, 3);
append(&head, 4);
deleteB(&head);
display(head);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487784.html
下一篇:在結構中初始化陣列
