【问题标题】:C: Problems with Reversing a linked listC:反转链表的问题
【发布时间】:2017-12-23 03:01:16
【问题描述】:

我正在编写一个程序来创建一个链表(一个节点),然后将其反转。链表包含数据和下一个地址。

typedef struct node{
    int data;
    struct node *next;
}node;

首先,我创建了链表。

struct node *Insert_value(int dataInput,node* head)
{
    node *new_node=NULL;
    new_node = malloc(sizeof(node));
    new_node -> next = head;
    new_node -> data = dataInput;
    head = new_node;
    return head;
}

之后,我创建了一个函数来打印这些数据。 (我称它为 PrintNode)

    while(head!= NULL)
        {
            printf("%d\t",head->data);
            head= head->next;
        }
        printf("\n");
}

最后,创建了一个用于反转链表的函数。

struct node* Reversing(node **head)
{
    node *current, *previous, *first;
    current = previous = first = *head;

    first = first->next->next;
    current = current->next;
    previous ->next = NULL;
    current->next = previous;

    while(first != NULL)
    {
        previous = current;
        current = first;
        first = first -> next;
        previous->next = current;
    }

    return current;
}

这是我的完整程序。

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

typedef struct node{
    int data;
    struct node *next;
}node;

struct node *Insert_value(int dataInput,node* head);
struct node * Reversing(node **head);
void PrintNode(node *head);

main()
{
    node *head = NULL;
    int i=0,dataInput;
    while(i!=5)
    {
        printf("input your elements: ");
        scanf("%d",&dataInput);
        head = Insert_value(dataInput,head);
        i++;
    }
    PrintNode(head);
    head = Reversing(&head); 
    PrintNode(head);


}               

struct node *Insert_value(int dataInput,node* head)
{
    node *new_node=NULL;
    new_node = malloc(sizeof(node));
    new_node -> next = head;
    new_node -> data = dataInput;
    head = new_node;
    return head;
}

struct node* Reversing(node **head)
{
    node *current, *previous, *first;
    current = previous = first = *head;

    first = first->next->next;
    current = current->next;
    previous ->next = NULL;
    current->next = previous;

    while(first != NULL)
    {
        previous = current;
        current = first;
        first = first -> next;
        previous->next = current;
    }

    return current;
}

void PrintNode(node* head)
{
    while(head!= NULL)
        {
            printf("%d\t",head->data);
            head= head->next;
        }
        printf("\n");
}

经过多次调试,我知道这些功能都很好。但是,在反向函数之后,head 变量的下一个节点的地址为 NULL。你能解释一下并给我一些建议吗?

【问题讨论】:

  • 别忘了free你的名单,例如while (head != NULL) { node *victim = head; head = head-&gt;next; free (victim); }

标签: c


【解决方案1】:

将解决您的问题的一行更改将是(您将其可视化有点错误)。

current->next =previous;

代替

previous->next = current;

您的代码会因单元素链表而崩溃。在函数Reversing() 中添加适当的检查。如果有单个元素 first-&gt;next 将是 NULL。但是您写了first-&gt;next-&gt;next,如果first-&gt;nextNULL,这将是未定义的行为。


在之前的情况下,您只是在 Reversing() 中创建一个链接列表,链接未更改,但 head 指向最后一个节点。所以它的nextNULL

【讨论】:

    【解决方案2】:

    修改Reversing 以便在末尾附加新节点。遍历列表时需要提前保存下一个节点(node *next = current-&gt;next

    struct node* Reversing(node **head)
    {
        node *current = *head;
        node *reverse = NULL;
    
        while(current)
        {
            node *next = current->next;
    
            if(!reverse)
            {
                reverse = current;
                reverse->next = NULL;
            }
            else
            {
                current->next = reverse;
            }
            reverse = current;
    
            current = next;
        }
    
        return reverse;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2019-06-14
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多