2012-04-27 4 views
0

Я пытался написать функцию, которая удаляет узел из связанного списка, хотя у меня были проблемы.Пытается написать функцию, которая удаляет узел

Вот мой алгоритм:

  • Получить имя узла, который я хочу, чтобы удалить (каждый узел имеет 3 детали в нем: имя/возраст/пол)
  • Тогда я найти свое место в списке
  • , а затем я прохожу вперед

Например

Друг -> следующая = друга -> далее -> следующий ..

Хотя мне нужно найти первый узел в связанном списке, и я не знаю, как добраться до него. Это то, что я написал:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdlib.h> 
typedef struct friend 
{ 
    char *name; 
    int age; 
    char gender; 
    struct friend* next; 
}friend; 
void node_delete(friend* delete) 
{ 
friend* temp = malloc(sizeof(friend)); 
char name[256]; 
int i = 0, j =0; // Not being used, though I'd use it 
printf ("Please enter the friend's name you want to delete: \n"); 
fgets (name, 256, stdin); // Getting the name of the person the user wants to delete 
fgets (name, 256, stdin); 
while (0 == (strcmp(temp -> next -> name, delete -> next -> name))) // As long as the   
// name doesnt match, it'll go to the next name in the linked list 
{ 
     temp = friend -> next; // Going to the next name in the linked list 
} 
temp -> next = temp -> next -> next; // Replacing the node with the node after it.. 
// for ex. if I have 1 -> 2 -> 3, it'll be 1 -> 3 
free (delete); 
} 
+1

Цикл while останавливается, как только имя не совпадает; вы переписываете первые данные, которые вы читаете в 'name'; вы никогда не помещаете данные в «temp», просто предоставляя ему блок памяти; 'i' и' j' не используются. (Постарайтесь прочесть и объяснить * точно, что каждая строка этого кода делает для себя, что может немного помочь :)) – huon

+0

Почему вы пытаетесь получить имя дважды? – RedX

+0

Я изменил цикл на 0! =, Так что это сработает; также, я не уверен, как положить что-то в него, это был вопрос ... @Redx - У меня есть ошибка, которую я должен написать дважды, чтобы заставить ее работать. Это не проблема, так что забудьте об этом ... Редактировать: я буду добавлять заметки сразу. –

ответ

0

хорошо, что у вас была хорошая трещина.

Я не совсем уверен в вашем вопросе, но here - это то, что, я думаю, вы пытаетесь сделать.

Предполагается, что ваша функция node_delete(friend* delete) принимает человека, с некоторыми друзьями в связанном списке и удаляет друга, имя которого соответствует вводу stdin.

(я также добавил еще одну маленькую функцию, так что вы можете видеть, сколько удовольствия связанный список может быть!)

, кстати, лучше попробовать & убедитесь, что ваш код компилируется, если вы хотите, фольклорный, чтобы помочь; р например, temp = friend -> next; будет не сбор.

Удачи вам в этом проекте!

+0

Большое спасибо! –

+0

нетP. ~ так вы разобрались, как это сделать рекурсивно ?! ~ если нет, вот путь: [;)] (http://ideone.com/sYeJl) – violet313

0

Похоже, вы должны сравнить (темп -> далее -> имя) с (имя), а не (удалить -> далее -> имя)

while (0 == (strcmp(temp -> next -> name, name))) 

но вы должны присвоить темп с головой в список друзей

temp = delete; // delete should be a pointer to root list element 

и .. По какой причине вам нужно я и J? Также вы используете malloc()? Почему бы не объявить-структуру в качестве местного материала

friend* temp; 

Попробуйте

friend* temp; 
char name[256]; 

// receive node to delete 
printf ("Please enter the friend's name you want to delete: \n"); 
// omg here was two fgets!! 
fgets (name, 256, stdin); 

// delete should be a pointer to root list element 
temp = delete;  

// Check if node to be deleted is a root node 
if(strcmp(temp -> name, name)==0){ 
    delete = delete->next; 
    return; 
} 

// go throug all the list 
while (temp->next!=NULL){ 
    // if node was found - delete it 
    if(strcmp(temp -> next -> name, name)==0) 
     temp -> next = temp -> next -> next;  
    temp = temp-> next; 
} 

Существует логическая ошибка в этом коде, вы также должны проверить головной узел. В моем коде нет такой проверки. Вы можете легко добавить его самостоятельно. Сожалею. (уже зафиксировано в кодовом блоке)

Также «удалить» - это плохое имя функции parametr, попробуйте friendList или что-то в этом роде лучше). Кроме того, не удалять ключевое слово в C++?

+0

Я исправил CMP; Я не хочу, я бы им понадобился, поэтому я просто положил em в начале ... Дело в том, как мне что-то добавить в темп? –

+0

Я отредактировал ответ, отметьте его – vard

+0

Ваши '}' не совпадают. – huon