2012-05-06 3 views
0

Я написал этот код, и я хотел бы знать, в чем моя проблема, если вы можете помочь мне исправить мой код, который навязывает один из урских, это мне очень помогло. . Edit: Я изменил его к этому, и теперь оно не дает мне ошибку во время выполнения, но когда я печатаю имя, или проверить, если узел существует, то он говорит, что это ...Какая ошибка? удаление узла, связанного списка,

void node_delete(friend *amit) // Deleting a node 
{ 
friend* temp; 
int flag = 0; 
while (head != NULL) // As long the node isnt the last one 
{ 
     if (0 == (strcmp(head -> next -> name, amit -> name))) // If the name that the user entered matchs a name in the linked list, 
     { // It'll skip it 
      temp = head -> next; 
      head -> next = head -> next -> next; // Deletes a node from the linked list 
      flag = 1; 
     } 
     if (flag == 1) break; 
     head = head -> next; // Going to the next node 
} 
free(temp); // Freeing the deleted node 
printf ("%s\n", amit -> name); 
} 

и в основном:

amit.name = "amit" 
amit.age = 16 
amit.gender = 'm' 
node_delete(&amit); 

и структура определяют:

typedef struct friend // The struct 
{ 
    char *name; 
    int age; 
    char gender; 
    struct friend* next; // A pointer that points to the next node in the linked list 
}friend; 

Большое спасибо :)

+0

Что не работаю г? –

+0

Проблема IMHO в том, что у вас слишком много переменных, плавающих вокруг, и ваша программа становится жонглирующим актом, чтобы держать их в курсе последних событий. Также: вы только сравниваете имя; было бы намного проще, если бы функция удаления приняла в качестве аргумента строку. – wildplasser

+0

Что это значит? как insted of senting & amit, отправлено только amit -> name? –

ответ

1

Вот некоторые комментарии в течение первых нескольких строк:

head = amit; 
head -> next = amit; // same as amit->next = amit; 
amit -> next = NULL; // same as head->next = null; 
while (head -> next != NULL) // will never do anything since head->next is null 
+0

Разве что об этом ... так как я могу это исправить? –

+0

извините, такой же вопрос, как http://stackoverflow.com/questions/10459332/how-can-i-make-a-delete-node-функция. мой ответ: возьмите книгу и изучите концепцию указателей и связанных списков (все это объясняется в библии: программирование K & R в C) –

+0

ха-ха, я читал в Интернете, хотя каждый раз, когда я просматриваю новую тему , Мне нелегко в первые несколько раз, пока я не получу «уловку» ... –

0
void node_delete(char *name) 
{ 
friend *tmp, **p; 

for (pp = &root; (tmp = *pp) ; pp = &tmp->next) 
{ 
    if (strcmp(tmp->name, name)) continue; // No match: walk on 
    printf("Deleted %s\n", tmp->name); 
    *pp = temp->next; 
    free(tmp); 
    break; 
}  
} 

(предполагается, что глобальный корневой указатель на начало связанного списка) Чтобы быть называется так:

node_delete("Amit"); 
0
friend *head = NULL; 

... 

add(data) { 
    friend *next = malloc(sizeof(bla)); 
    fill(next, data); 

    if (head == NULL) 
    head = next; 
    else { 
    next->next = head; 
    head = next; 
    } 
} 

del(data) { 
    if (head) { 
    if (your_check(head, data)) { 
     to_free = head; 
     head = head->next; 
     free(to_free); 
    } else { 
     friend *list = head; 
     while (list->next) { 
     if (your_check(list->next, data)) { 
      to_free = list->next; 
      list->next = list->next->next; 
      free(to_free); 
     } 
     list = list->next; 
     } 
    } 
    } 
} 
Смежные вопросы