2014-10-19 3 views
0

Я пытаюсь удалить из единого связанного списка, однако, когда я пытаюсь удалить из первого элемента, он печатает мусор. Я думаю, проблема связана с функцией delete_node, однако я все пробовал, и я не могу понять.Удаление первого узла из одиночно связанного списка в C

#include <stdio.h>//prinf 
#include <stdlib.h>//alloc mallco callo 
typedef struct node node; 
struct node{ 
    int number; 
    node *next; 
}; 
node *new_node(int num){ 
    node *n= (node*) malloc(sizeof(node)); 
    n->number=num; 
    n->next=NULL; 
    return n; 
} 

void node_free_all(node *n){ 
    if(n != NULL){ 
     node_free_all(n->next); 
     free(n); 
    } 
} 
void print_nodes(node *n){ 
    if(n != NULL){ 
     print_nodes(n->next); 
     printf("Number is: %d\n",n->number); 
    } 
} 
void delete_node(node *n, int num){ 

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

    //delete first 
    if(n!= NULL && n->number==num){ 
     rmNode = n; 
     n=n->next; 
     free(rmNode); 
    } 
    //all but first 
    while(n != NULL){ 
     if(n->next != NULL && n->next->number == num){ 
      rmNode= n->next; 
      n->next = rmNode->next; 
      free(rmNode); 
      break; 
     } 
     n=n->next; 
    } 

} 
int main(){ 
    int i; 
    node *head= (node*) malloc(sizeof(node)); 
    node *curr; 
    head=NULL; 

    for(i=1;i<=10;i++) { 
     curr = new_node(i); 
     curr->next =head; 
     head=curr; 
    } 



    printf("Everything:\n"); 
    print_nodes(head); 
    printf("Deleting 1:\n"); 
    delete_node(head,1); 
    print_nodes(head); 
    printf("Deleting 5:\n"); 
    delete_node(head,5); 
    print_nodes(head); 
    printf("Deleting 2:\n"); 
    delete_node(head,2); 
    print_nodes(head); 
    printf("Deleting 3:\n"); 
    delete_node(head,3); 
    print_nodes(head); 
    printf("Deleting 10:\n"); 
    delete_node(head,10); 
    print_nodes(head); 
    printf("Deleting 9:\n"); 
    delete_node(head,9); 
    print_nodes(head); 

node_free_all(head); 
// node_free_all(list); 
return 0; 
} 

Что я делаю неправильно?

+1

Рассмотрим это: Где-то у вас есть указатель на голову списка. Как этот указатель обновляется, если вы удаляете первый элемент? –

+0

Другим людям было бы легче помочь, если бы вы также включили структуру 'node' :) –

+0

_Что я делаю неправильно? _ - Во-первых, http://stackoverflow.com/help/mcve –

ответ

0

Вам не нужно выделять память rmNode. Кроме того, вам нужно передать ссылку на указатель головы на функцию delete_node, потому что каждый раз, когда вы обновляете список, и если вам нужно удалить первый элемент списка, то в этом случае также будет обновлен указатель на голову.

struct node 
{ 
    int number; 
    node *next; 
}; 

void delete_node(struct node** head_ref, int num) 
{ 
    struct node* temp; 
    struct node* current = (*head_ref); 


    //delete first 

    if(current != NULL && current->number == num) 
    { 
     temp = current; 
     current = current->next; 
     free(temp); 
     (*head_ref) = current; 
    } 
    else 
    { 
     //all but first 
     while(current != NULL) 
     { 
      if(current->next != NULL && current->next->number == num) 
      { 
       temp = current->next; 
       current->next = temp->next; 
       free(temp); 
       break; 
      } 
      current = current->next; 
     } 
    } 
} 
+0

, если он сначала совпадает с номером, он пропускает остальное. Вероятно, 'delete_node' должен обновить все, что соответствует' num' – sp2danny

+0

Я согласен с вами. Моя функция удаляет только первую запись данного номера. Если нам нужно удалить весь элемент заданного числа, мне просто нужно удалить часть else. Спасибо, что указали это. – Shravan40

+0

Да, поэтому у меня не было выражения else. Тем не менее, я не понимаю, почему он работал нормально во всех других случаях, кроме первого. Не могли бы вы рассказать об этом, пожалуйста? – Santiago

0

вот версия, которая удаляет все элементы, который соответствует num, и всегда обновляет элемент головки.

void delete_node(node** head_ref, int num) 
{ 
    node* temp; 
    node* last = 0; 
    node* current = *head_ref; 

    while(current) 
    {  
     if(current->number == num) 
     { 
      temp = current; 
      if(current == *head_ref) 
       current = (*head_ref) = current->next; 
      else 
       current = last->next = current->next; 
      free(temp); 
     } else { 
      last = current; 
      current = current->next; 
     } 
    } 
} 

Вы должны назвать это как delete_node(&head,1);
, потому что ему нужен адрес для элемента головы, чтобы быть в состоянии изменить его

Смежные вопросы