简体   繁体   English

链表返回单链表中的根节点 C

[英]Linked list returning root node in singly-linked list C

I am writing a program to delete the nodes greater than x.我正在编写一个程序来删除大于 x 的节点。 I want to return the root node of the linked list after deleting.我想删除后返回链表的根节点。 I save the new root node in variable "root".我将新的根节点保存在变量“root”中。 But unfortunately, when I get root in the main function, the value seems to be 0. Can anyone please help me identify the issue?**但不幸的是,当我在主 function 中获得 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;
}

For starters do not mix in one translation unit two languages C and C++.对于初学者,不要在一个翻译单元中混合两种语言 C 和 C++。

Either write a C or C++ program.编写 C 或 C++ 程序。

For example this declaration in C例如 C 中的这个声明

// structure of a node
struct Node {
    int data;
    Node* next;
};

is incorrect, You have to write不正确,你必须写

// structure of a node
struct Node {
    int data;
    struct Node* next;
};

There is no great sense to declare the static variable root声明 static 变量root没有太大意义

static Node *root;

and then one more variable head .然后又是一个可变head

// Create list: 7->3->4->8->5->1
Node* head = getNode(7);

Your function deleteGreaterNodes is too complicated and as any complicated function it contains a bug in this code snippet您的 function deleteGreaterNodes太复杂了,与任何复杂的 function 一样,它在此代码段中包含一个错误

    // If required value node was not present
    // in linked list
    if (temp == NULL)
        return 0;

because it returns a null pointer instead of returning the pointer head_ref .因为它返回一个 null 指针而不是返回指针head_ref

Here is your updated program that was adjusted according to the C language that contains a modified function deleteGreaterNodes .这是根据 C 语言调整的更新程序,其中包含修改后的 function deleteGreaterNodes

#include <stdio.h>
#include <stdlib.h>

// structure of a node
struct Node {
    int data;
    struct Node* next;
};

// function to get a new node
struct Node* getNode(int data)
{
  
    struct Node* newNode = ( struct 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

struct Node *deleteGreaterNodes( struct Node* head_ref, int x )
{
    while ( head_ref && x < head_ref->data )
    {
        struct Node *tmp = head_ref;
        head_ref = head_ref->next;
        free( tmp );
    }
    
    if ( head_ref )
    {
        for ( struct Node *current = head_ref; current->next != NULL; )
        {
            if ( x < current->next->data )
            {
                struct Node *tmp = current->next;
                current->next = current->next->next;
                free( tmp );
            }
            else
            {
                current = current->next;
            }
        }
    }
    
    return head_ref;
}

// function to a print a linked list
void printList(struct Node* head)
{
    while (head) {
       
        printf("%d ",head->data);
        head = head->next;
    }
}

// Driver program to test above
int main()
{
    struct 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: " );
    // printf("Original List: "); 
    printList(head);

   head = deleteGreaterNodes(head, x);

    
     printf("\nModified List: "); 
    printList( head );

    return 0;
}

The program output is程序 output 是

Original List: 7 3 4 8 5 1 
Modified List: 3 1

A simple way of implementing deleteGreaterNodes is to use an extra level of indirection to access the Node * links.实现deleteGreaterNodes的一种简单方法是使用额外的间接级别来访问Node *链接。

// 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 **link = &head_ref; // Point to the pointer to the first node.
    Node *cur;

    while ((cur = *link) != NULL) {
        if (cur->data > x) {
            // The current node needs to be deleted from the list.
            // Change the link pointing to the current node to point to the next node.
            *link = cur->next;
            // Delete the current node.
            free(cur);
        } else {
            // The current node is to be kept on the list.
            // Get a pointer to the link to the next node.
            link = &cur->next;
        }
    }
    return head_ref;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM