【发布时间】:2021-03-26 08:32:20
【问题描述】:
我正在编写一个程序来删除大于 x 的节点。我想删除后返回链表的根节点。我将新的根节点保存在变量“root”中。但不幸的是,当我在 main 函数中获取 root 时,该值似乎为 0。有人可以帮我找出问题吗?**
// structure of a node
struct Node {
int data;
Node* next;
};
// function to get a new node
Node* getNode(int data)
{
Node* newNode = (Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// function to delete all the nodes from the list
// that are greater than the specified value x
Node *deleteGreaterNodes(Node* head_ref, int x)
{
Node *temp = head_ref, *prev;
static Node *root;
// If head node itself holds the value greater than 'x'
if (temp != NULL && temp->data > x) {
head_ref = temp->next; // Changed head
free(temp); // free old head
temp = head_ref; // Change temp
}
root = temp;
// Delete occurrences other than head
while (temp != NULL) {
// Search for the node to be deleted,
// keep track of the previous node as we
// need to change 'prev->next'
while (temp != NULL && temp->data <= x) {
prev = temp;
temp = temp->next;
}
// If required value node was not present
// in linked list
if (temp == NULL)
return 0;
// Unlink the node from linked list
prev->next = temp->next;
free (temp); // Free memory
// Update Temp for next iteration of
// outer loop
temp = prev->next;
}
return head_ref;
}
// function to a print a linked list
void printList(Node* head)
{
while (head) {
printf("%d ",head->data);
head = head->next;
}
}
// Driver program to test above
int main()
{
static Node *root;
// Create list: 7->3->4->8->5->1
Node* head = getNode(7);
head->next = getNode(3);
head->next->next = getNode(4);
head->next->next->next = getNode(8);
head->next->next->next->next = getNode(5);
head->next->next->next->next->next = getNode(1);
int x = 3;
printf("Original List: ");
printList(head);
root = deleteGreaterNodes(head, x);
printf("\nModified List: ");
printList(root);
return 0;
}
【问题讨论】:
-
您不能在 C 程序中使用
cout << "Original List: ";。不要使用 C++ 编译器来编译 C 程序。由于其余代码似乎确实是 C 而不是 C++,因此您可以简单地编辑该行(后面有一个等效的printf())。但请小心。 -
ist 中的最后一个节点的值为 1,它不大于 3。在最里面的循环中,你前进通过你想要保留的所有节点,如果你到达终点,你
return 0。所以返回 0 的代码就在你的代码中。 -
我收回了——你正在使用 C++ 的另一个特性,而不仅仅是一个流浪的
cout。你定义struct Node;在 C++ 中,它还定义了一个类型Node,但它没有在 C 中。在定义结构类型之前,您需要typedef struct Node Node;或等效项。您不应该在使用static Node *root;的任何地方使用它。在main()中,它应该是一个简单的本地(自动)变量。在deleteGreaterNodes(),应该完全删除。 -
谢谢@M Oehm。就是这样!我最后返回 0 。现在我将其更改为返回我的头节点。
标签: c struct linked-list nodes singly-linked-list