2014-11-01 119 views
0

我想反轉鏈接列表,並且我的代碼似乎不起作用。我不知道它有什麼問題。我使用了我在這裏找到的reverse()函數,我甚至在紙上測試了它,所以我非常確定代碼是好的,但我仍然錯過了一些東西。我很想知道什麼是錯的。這裏是我的代碼:C - 我想要反轉鏈接列表

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


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

void push(int val, node **head){ 
    node* temp=(node*)malloc(sizeof(node)); 
    node* current=*head; 
    temp->val=val; 
    if(*head==NULL) 
     {*head=temp; 
     temp->next=NULL;} 
    else 
     {while(current->next!=NULL) 
      current=current->next; 
    current->next=temp; 
    temp->next=NULL;} 
} 
int reverse(node * head){ 
    node *previous = NULL; 
    node *current = head; 
    node *forward; 
    while (current != NULL) { 
     forward = current->next; 
     current->next = previous; 
     previous = current; 
     current = forward; 
     } 
    return previous; 

    } 
void print(node *new_head){ 

    node* current2=new_head; 
    current2=current2->next; 
    while(current2!=NULL) 
    { 
     printf("%d", current2->val); 
     current2=current2->next; 
     }} 

int main() 
{ node * head= NULL; 
    int n; 
    node * new_head; 
    scanf("%d", &n); 
    push(n,head); 
    scanf("%d", &n); 
    push(n,head); 
    scanf("%d", &n); 
    push(n,head); 
    new_head=reverse(head); 
    print(new_head); 

    return 0;} 

我只是想反轉一個輸入,如:1,2,3。所以輸出將是3,2,1。

+1

是否編譯?錯誤消息說什麼? – wildplasser 2014-11-01 18:36:14

+0

你需要雙向鏈表嗎? – 2014-11-01 18:37:45

+1

'previous'不是'int'。 – ooga 2014-11-01 18:37:46

回答

0

請嘗試以下

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

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

void push(node **head, int val) 
{ 
    node **current = head; 

    while (*current) current = &(*current)->next; 

    *current = (node *)malloc(sizeof(node)); 

    (*current)->val = val; 
    (*current)->next = NULL; 
} 

node * reverse(node * head) 
{ 
    node *new_head = NULL; 
    node *current = head; 

    while (current) 
    { 
     node *next = current->next; 
     current->next = new_head; 
     new_head = current; 
     current = next; 
    } 

    return new_head; 
} 

void print(const node *head) 
{ 
    for (; head; head = head->next) printf("%d ", head->val); 
    printf("\n"); 
} 

void delete(node *head) 
{ 
    while (head) 
    { 
     node *tmp = head; 
     head = head->next; 
     free(tmp); 
    } 
} 

int main() 
{ 
    node *head = NULL; 
    int n; 

    scanf("%d", &n); 
    push(&head, n); 

    scanf("%d", &n); 
    push(&head, n); 

    scanf("%d", &n); 
    push(&head, n); 

    print(head); 

    head = reverse(head); 

    print(head); 

    delete(head); 

    return 0; 
} 

如果進入1 2 3的輸出將是

1 2 3 
3 2 1 
0

其實,你的反向工作。這是符合規範的push方法:它將新元素移動到列表的末尾,而不是在當前頭部之前。所以你在調用reverse方法之前已經有了反向列表(反過來迅速反轉)。

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

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

void push(int val, node **head){ 
    node* temp=(node*)malloc(sizeof(node)); 
    node* current=*head; 

    temp->val=val; 
    temp->next=NULL; 
    if(*head==NULL){ 
     *head=temp; 
    } else { 
     while(current->next!=NULL) 
      current=current->next; 
     current->next=temp; 
    } 
} 
node *reverse(node * head){ 
    node *rev = NULL; 
    node *current = head; 
    node *temp; 

    while (current != NULL) { 
     temp = current->next; 
     current->next =rev; 
     rev = current; 
     current = temp; 
    } 
    return rev; 
} 
void print(node *new_head){ 
    node* current2=new_head; 
    while(current2!=NULL){ 
     printf("%d ", current2->val); 
     current2=current2->next; 
    } 
    printf("\n"); 
} 

int main(){ 
    int n; 
    node * head= NULL; 
    node * new_head; 
    scanf("%d", &n); 
    push(n, &head); 
    scanf("%d", &n); 
    push(n, &head); 
    scanf("%d", &n); 
    push(n, &head); 
    //print(head); 
    new_head=reverse(head); 
    print(new_head); 

    return 0; 
} 
0

push(n, &head);是你必須爲了通過指針傳遞head指針做什麼。否則在push方法node* current=*head;將導致分段錯誤,因爲您正在傳遞空指針本身而不是指向它的指針。