2016-04-11 2 views
0

Ich habe Probleme bei der Zusammenführung von 2 Liste, also was ich (denke) bin zu tun. Liste A bis aktuell zuweisen, zum letzten Knoten des aktuellen gehen, Liste B zur aktuellen hinzufügen, Kopf2 zuweisen und schließlich drucken. aber wenn ich es nichts laufen herauskommt, die head2 Liste noch nullMerging zwei verknüpfte Liste

#include<stdio.h> 
#include<stdlib.h> 
typedef struct node { 
int val; 
struct node * next; 
} node_t; 

void print_list(node_t * head); 
node_t* merge(node_t *head,node_t *head1); 

int main(){ 
int number; 
node_t * head = NULL; 
node_t * head1 = NULL; 

//inputA 
//inputB 

printf("merged list is : \n"); 
print_list(merge(head,head1)); 
printf("\n"); 
return 0; 
} 

node_t *merge(node_t *head,node_t *head1){ 
    node_t * current = head; 
    while(current->next != NULL){ 
    current = current->next; 
    } 
    current->next = head1; 
    return current;  
} 
void print_list(node_t * head) { 
node_t * current = head; 

while (current != NULL) { 
    printf("%d ", current->val); 
    current = current->next; 
    } 
} 

EDIT: der Kopf der Liste A und head1 ist Liste B, bereits einige Daten haben. Es behält nur den letzten Knoten von A ex. A = 1 2 3, B = 4 5 6 Rück 3 4 5 6

+0

Ich schlage vor, dass 'head2 = merge (Kopf, head1);' .. bei 'merge':' Rückkehr Kopf; ' – BLUEPIXY

+0

meine Methode ist falsch, wie verhindere ich, beide Liste? – Hary

+0

Um eine neue Liste (jedes Element) der Ergebnisse zu erstellen. – BLUEPIXY

Antwort

0

Zwei Punkte:

merge ist eine Kopie von head2 vorbei, so dass die in Haupt head2 wird sich nicht ändern. Sie müssen einen Zeiger auf head2 übergeben.

void merge(struct node *head,struct node *head1,struct node **head2) 
{ 
    //the merge is ok, but the beginning of the list 
    //is head not head1 

    // dereference the pointer to head2 to change 
    // the value of head2 in main. 
    *head2 = head; 
} 

Auch das ist wirklich eine Append-Operation keine Zusammenführung.

+0

Ja, ich habe mich geirrt, das ist keine Zusammenführung. wie macht man das? – Hary

0

Ich sah Probleme mit der Zusammenführung:
* Es würde segfault, wenn der linke Kopf war NULL.
* Es gab den Merge-Point zurück, und nicht den echten neuen gemeinsamen Kopf.

node_t *merge(node_t *head,node_t *head1){ 
    if (head == NULL) 
     return head1; 
    node_t * current = head; 
    while(current->next != NULL){ 
    current = current->next; 
    } 
    current->next = head1; 
    return head; 
}