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

2 に答える 2

0

さて、あなたはこれで良いクラックを持っています.

あなたの質問については完全にはわかりませんが、あなたがやろうとしていることは次のとおりです。

#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(const char* name, friend* stFriend)
{
    if (!stFriend->next) //end of list
    { 
        printf("%s is not a friend!\n", name);
    }
    else if ( !strcmp(name, stFriend->next->name) ) //name matches! remove link
    {     
        //here's where you can free your unwanted friend ptr ~NB: are you sure this friend is not a friend of someone else?
        //free(stFriend -> next);    
        stFriend->next=stFriend->next->next;
        printf("%s is no longer a friend!\n", name); 
    }
    else //name does not match -recurse
    {
        node_delete(name, stFriend->next);
    }
}


void print_friends(const friend* pstPerson)
{
    if (pstPerson->next)
    {
        printf("next friend:%s\n", pstPerson->next->name);
        print_friends(pstPerson->next);
    }
    else 
    {
        printf("no more friends :(\n\n");
    }
}

int main()
{
    friend stFriend0, stFriend1, stFriend2, stPerson;
    char name[256]={0};

    stFriend0.name="amber";
    stFriend0.next=0;

    stFriend1.name="betty";
    stFriend1.next=&stFriend0;

    stFriend2.name="catherine";
    stFriend2.next=&stFriend1;

    stPerson.name="violet";
    stPerson.next=&stFriend2;

    printf("%s's friends before:\n", stPerson.name);
    print_friends(&stPerson);

    printf("remove a friend: ");
    fgets (name, 256, stdin);
    strtok(name, "\n");

    node_delete(name, &stPerson);

    printf("\n\n%s's friends after:\n", stPerson.name);
    print_friends(&stPerson);

    printf("\n\n\ndone!\n");

    return 0;

}

オンラインデモ。

node_delete(friend* delete)あなたの関数は、リンクされたリストに何人かの友人がいる人を取り、名前がstdin入力と一致する友人を削除すると想定しています。

(別の小さな関数も追加したので、リンクされたリストがどれほど楽しいかがわかります!)

于 2012-04-27T16:14:26.350 に答える
0

(temp -> next -> name) を (delete -> next -> name) ではなく (name) と比較する必要があるようです

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

ただし、臨時雇用者にはフレンドリスト ヘッドを割り当てる必要があります

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

そして.. i と 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;
} 

このコードには論理エラーがあります。ヘッド ノードも確認する必要があります。私のコードにはこのチェックはありません。自分で簡単に追加できます。ごめん。(既にコードブロックで修正済み)

また、「delete」は関数パラメーターの悪い名前です。friendList などを試してみてください)。さらに、delete は C++ のキーワードではありませんか?

于 2012-04-27T12:38:41.810 に答える