-1

私は適切に機能するnode_add関数を作成してきましたが、node_delete関数を作成するのに苦労しています。

これが私が書いたものです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
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;
void node_delete(); // The deleting node function
friend* head; // Definging the head of the linked list
void node_delete() // Deleting a node
{
 char name[256];
 printf ("Please enter the friend's name you want to delete: \n");
 fgets (name, 256, stdin);
 fgets (name, 256, stdin); // Getting the name of the person that the user wants to delete
 while (head -> next != NULL) // As long the node isnt the last one
 {
       if (0 == (strcmp(head -> name, name))) // If the name that the user entered matchs a name in the linked list,
       { // It'll skip it
             head -> next = head -> next -> next; // Deletes a node from the linked list
       }
       head -> next; // Going to the next node
}
 free(head); // Freeing the deleted node
}

ノードの削除機能にのみ問題があります

4

3 に答える 3

1
if (head) {
  if (strcmp(head->name, name) == 0) {
    to_free = head;
    head = head->next;
    free(to_free);
  } else {
    list = head;
    while (list->next) {
      if (strcmp(list->next->name, name) == 0) {
        to_free = list->next;
        list->next = list->next->next;
        free(to_free);
        break; // if only one
      }
      list = list->next;
    }
  }
}
于 2012-05-05T07:16:25.093 に答える
1
struct friend **tmp = &head;
while (*tmp != NULL && (0 != (strcmp((*tmp)->name, name)))) {
  tmp = &((*tmp)->next);
}
if (*tmp) {
  struct friend *freeme = (*tmp);
  (*tmp) = (*tmp)->next;
  free(freeme);
}
于 2012-05-05T08:05:43.663 に答える
0

これをもう少し詳しく見てください。

while (head -> next != NULL) // As long the node isnt the last one
 {
       if (0 == (strcmp(head -> name, name))) // If the name that the user entered matchs a name in the linked list,
       { // It'll skip it
             head -> next = head -> next -> next; // Deletes a node from the linked list
       }
       head -> next; // Going to the next node
}

リンクリストを実際にトラバースすることはありません

  head -> next; // Going to the next node

おそらくhead=head->nextにする必要があります

また、「head」がリンクリストの先頭を保持している唯一のものである場合、head = head-> nextとすると、リストの一部が失われます。temp=headとなるように一時ポインタを作成することをお勧めします。次に、一時ポインタをトラバースします。

于 2012-05-05T06:13:56.300 に答える