私はリンクされたリスト(ノード)を作成するプログラムを書いています。リンクされたリストには、データと次のアドレスが含まれます。C:リンクされたリストを反転する際の問題
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です。あなたは私に説明してアドバイスをくれますか?
(
node *next = current->next
)事前に次のノードを保存する必要があり、例えば、 'あなたのリストをfree'することを忘れないでください。 'while(head!= NULL){node * victim = head; head = head-> next;無料(被害者)。 } ' –