2013-12-17 190 views
0

有2個列表source={3,2,1}dest ={4,5,6,7}其中鏈接列表的頭指針分別位於3和4中。刪除源頭節點,將數據3移動到目標列表,並將其作爲目標列表中的新頭節點。鏈接列表:將節點從一個列表移動到另一個列表

所以在第一輪source ={2,1} dest ={3,4,5,6,7}之後,現在head的源代碼指向2,head代表dest指向3.最後,我必須製作source = NULL and Dest = {1,2,3,4,5,6,7} head => 1。每次我都可以通過調用移動節點函數來實現。但是當我在一個循環中運行時,它會保持循環。這是錯誤的代碼。請告訴我爲什麼會出現循環問題。

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

    void push(Node** headRef, int data){ 
Node* newNode = (Node*) malloc(sizeof(newNode)); 
newNode->data = data; 
newNode->next = *headRef; 
*headRef = newNode; 
    } 
    Node* pushtop(){ 
Node* head = NULL; 
int i; 
for(i = 1; i<=3; i++){ 
push(&head,i); 
} 
return head; 
    } 

    Node* pushbottom(){ 
Node* head = NULL; 
int i; 
for(i=7; i>=4; i--){ 
push(&head,i); 
} 
return head; 
    } 

    void moveNode(Node** source,Node** dest){ 
Node* ptr = *source; 
Node* current = NULL; 
while(ptr!=NULL){ // here the continuous looping occurs 
    current=ptr; 
    current->next = *dest 
    *dest = current;  
    *source = ptr->next; 
    ptr = ptr->next; 
    } 
    Node* test = *dest; 
    printf("\nthe then moved list is\n\n"); 
    while(test!=NULL){ 
     printf("%d\n",test->data); 
     test = test->next; 
     } 
     } 
    int main(){ 
Node* headA = pushtop(); 
Node* headB = pushbottom(); 
moveNode(&headA, &headB); 
    return 0; 
} 

請檢查移動節點While循環部分。

+0

邏輯上我的代碼必須工作。我錯過了可視化的東西,導致循環。它在Source的頭部和dest頭部之間循環。 – bks4line

+3

你確定不會崩潰嗎?我在移動中看到的第一件事是current = NULL; ptr =當前; ptr-> next = * dest; ---->分段故障<---- –

+0

費爾南多編輯哥們!對不起,錯誤 – bks4line

回答

0

答案與@zavg的答案有點不同。一點點調整使它工作正常。

正如我所說的源指針也應該改變。所以我會粘貼代碼。感謝@zavg的幫助。

 while(ptr != NULL) { // here is the correct code. 
     current = ptr->next; 
     ptr->next = *dest; 
     *dest = ptr;  
     ptr = current; 
     *source = ptr; 
     } 

     printf("%p\n",*source); //it will print Nil. 

     Node* test = *dest; 
     printf("\nthe then moved list is\n\n"); 

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

啊,我不認爲'dest'和'source'是'Node **'中的你的情況。我只是發佈一般算法的想法:) – zavg

1
Node* ptr = NULL; 
Node* current = *source; 
while(current != NULL) { // here the continuous looping occurs 
    ptr = current->next; 
    current->next = dest; 
    dest = current;  
    current = ptr; 
} 
+0

我收到分割代碼!此外源指針也應該移動。請幫幫我。謝謝!我可以給出正確的答案。它的工作與微調。 – bks4line

+0

完美!謝謝哥們!我意識到我的錯誤。我用ptr指針連接目標指針而不是當前指針!按我的預期工作。萬分感謝! :) – bks4line

+0

如果您喜歡它,請將其標記爲答案,並將其歸功於以下方面:-) –

相關問題