2016-04-11 5 views
0

У меня проблема с объединением 2-х списков, так что я (думаю) делаю. присвойте список A текущему, перейдите к последнему узлу текущего, добавьте список B в текущий, назначьте ток head2 и, наконец, распечатайте. но когда я запускаю его ничего не выходит, список head2 еще нулевойслияние двух связанных списков

#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: голова списка А и head1 является список B, уже есть некоторые данные. он будет удерживать только последний узел A ex. А = 1 2 3, В = 4 5 6 Обратно 3 4 5 6

+0

Я полагаю, что 'head2 = слияние (голова, head1);' '.. на merge':' возвращения головы, ' – BLUEPIXY

+0

мой метод не так, как я держать оба списка? – Hary

+0

Чтобы создать новый список (каждый элемент) результатов. – BLUEPIXY

ответ

0

два вопроса:

слияние проходит копию head2, поэтому head2 в главное не изменится. Вам нужно передать указатель на head2.

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; 
} 

Кроме того, это действительно операция добавления не слияния.

+0

Да, я был неправ, это не слияние. как это сделать? – Hary

0

Я видел проблемы с слиянием:
* Это было бы segfault, если левая голова была NULL.
* Он вернул точку слияния, а не настоящую новую общую голову.

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; 
} 
Смежные вопросы