2
我知道有關於同樣的問題上有多個問題。但在某個地方,我無法獲得邏輯。扭轉一個單一的鏈接列表
能逆轉鏈表中的功能如下:
void reverse()
{
struct node *curr=head, *prev=NULL;
while(curr!=NULL)
{
curr->next = prev;
prev = curr;
curr = curr->next;
}
head = prev;
}
我使用鏈表中的一個全局頭指針和節點的結構是:
struct node
{
int data;
struct node *next;
};
struct node *head = NULL;
這裏,每當curr
節點將指向prev
節點,並且在curr
節點遍歷列表的最後,prev
節點將指向列表中作爲頭指針的最後一個節點。
但是,此邏輯不會反轉列表並僅打印第一個節點。所以,我認爲代碼只執行一次,但我無法捕捉到這個錯誤。
其他功能,使程序完整:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
struct node *head = NULL;
void add(int n)
{
struct node *temp = (struct node*)malloc(sizeof(struct node));
temp->data = n;
temp->next = NULL;
if(head == NULL)
{
head = temp;
return;
}
temp->next = head;
head = temp;
}
void print()
{
struct node *temp = head;
printf("\n The List is : ");
while(temp!=NULL)
{
printf(" %d ",temp->data);
temp = temp->next;
}
}
void reverse()
{
struct node *curr=head, *prev=NULL;
while(curr!=NULL)
{
curr->next = prev;
prev = curr;
curr = curr->next;
}
head = prev;
}
int main(void)
{
add(1);
add(2);
add(3);
add(4);
add(5);
print();
reverse();
print();
return 0;
}
強烈建議您完成打印'()用'的putchar(「\ n」)'函數;'或結束輸出線的其他方式。否則,您的輸出可能不會及時顯示。 –
@JonathanLeffler你能否詳細說明一下? –
許多程序以行緩衝輸出模式運行,這意味着直到末尾有換行符纔會顯示輸出。在Windows上它可能不那麼重要,但在Unix上,這絕對是一個問題。功能完成其輸出線通常也更加整潔。其他函數可以假定它們的輸出將在一行的開始處開始。換行符之前和之後的空格也不是最理想的,但這是另一個問題。通常,確保在輸出結束時打印換行符,而不是在開頭。 –