【问题标题】:How can I delete multiple structs in linked list?如何删除链表中的多个结构?
【发布时间】:2020-09-05 23:00:29
【问题描述】:

我有一个问题:我有一个包含“电影”数据的结构。我需要按“导演”(字符)搜索,如果“电影”数据与我通过键盘输入的相同“导演”匹配,则删除任何记录。一切都很酷,我输入“导演”,它会删除与之关联的“电影”数据,没问题。但是当有多个“电影”数据具有相同的“导演”时,它只删除遇到的第一个。并在那里停止该功能。我需要它继续并删除每个“电影”数据,与用户输入的导演相匹配。 感谢您的阅读,我希望有人能帮助我,我相信这很简单,只是我不太擅长编程(几个月前开始)。祝你今天过得愉快! 它可能需要一个while循环,但我试过了,但没有用。也许我没有做对。 再次感谢阅读,保重!

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

struct info_movies
{
    int nomenclature_number;
    char movie_name[50];
    char director[50];
    int year;
};
typedef struct info_movies MOVIES;

struct list
{
    MOVIES Data;
    struct list* pNext;
};
typedef struct list LIST;

MOVIES Enter_Movies_Data();
LIST* Add_New_Movie_At_The_Beggining(LIST* pF, MOVIES newMovie);
void Print_Movies_List(LIST* p);
LIST* Delete_By_Director(LIST* pF);

MOVIES Enter_Movies_Data()
{
    MOVIES NewMovie;
    printf("\nPlease enter movie's nomenclature number:\n");
    scanf("%d", &NewMovie.nomenclature_number);
    printf("\nPlease enter the movie's name: \n");
    scanf("%s", NewMovie.movie_name);
    printf("\nPlease enter the movies's director:\n");
    scanf("%s", NewMovie.director);
    printf("\nPlease enter the year of production of the movie:\n");
    scanf("%d", &NewMovie.year);
    printf("\nSaved.\n");
    return NewMovie;
}

LIST* Add_New_Movie_At_The_Beggining(LIST* pF, MOVIES newMovie)
{
    LIST* pNew = pF;

    if (pF == NULL)
    {
        pNew = (LIST*)malloc(sizeof(LIST));
        pNew->Data = newMovie;
        pNew->pNext = pF;
    }
    else
    {
        pNew = (LIST*)malloc(sizeof(LIST));
        pNew->Data = newMovie;
        pNew->pNext = pF;
    }
    return pNew;
}

void Print_Movies_List(LIST* p)
{
    if (p == NULL)
    {
        printf("the best movie!\n");
        return;
    }
    printf("\n---------------MOVIE---------------\n");
    printf("\nMovie's nomenclature number: %d\n", p->Data.nomenclature_number);
    printf("\nMovie's name: %s\n", p->Data.movie_name);
    printf("\nMovie's director:%s\n", p->Data.director);
    printf("\nMovie's year of production: %d\n", p->Data.year);
    printf("\n---------------MOVIE---------------\n");
    Print_Movies_List(p->pNext);
}

LIST* Delete_By_Director(LIST* pF)
{

    LIST* pCurrent;
    LIST* prev;
    char tmpDirector[50];

    printf("Enter the director's name:");
    scanf("%s", tmpDirector);

    for (pCurrent = pF, prev = pF; pCurrent != NULL; prev = pCurrent, pCurrent = pCurrent->pNext)
    {
        if (strcmp(pCurrent->Data.director, tmpDirector) == 0)
        {
            printf("\n------DELETED------\n");
            printf("\nnomenclature number: %d\n movie name: %s\n movie director: %s\n year of production: %d\n", pCurrent->Data.nomenclature_number, pCurrent->Data.movie_name, pCurrent->Data.director, pCurrent->Data.year);
            printf("\n------DELETED------\n");

            if (prev == pCurrent)
            {
                pF = pF->pNext;
                free(pCurrent);
                return pF;
            }
            prev->pNext = pCurrent->pNext;
            free(pCurrent);

            return pF;
        }
    }
    printf("\nNO MOVIES FOUND BY DIRECTOR: '%s'\n", tmpDirector);

    return pF;
}

int main() {

    LIST* pFirst = NULL;
    MOVIES newMovie;
    int mode;






    do {
        system("cls");

        printf("       M  E  N  U                 \n");
        printf("1. Enter a new movie data\n");
        printf("2. Print movies list.\n");
        printf("3. Delete movie by director.\n");

        printf("0. exit.\n");

        printf("\n        !!!PLEASE ENTER COMMAND!!!\n");

        fflush(stdin);
        scanf("%d", &mode);


        switch (mode)
        {
        case 1:

            newMovie = Enter_Movies_Data();
            pFirst = Add_New_Movie_At_The_Beggining(pFirst, newMovie);
            break;
        case 2:
            Print_Movies_List(pFirst);
            system("pause");
            break;
        case 3:
            pFirst = Delete_By_Director(pFirst);
            system("pause");
            break;
        case 0:
            printf("Exiting...\n");
            system("pause");
            break;
        }
    } while (mode != 0);
    return 0;

}

【问题讨论】:

  • return 就在你删除第一个之后,所以是的。您需要做的不仅仅是删除return,但也不需要更多

标签: c struct linked-list singly-linked-list function-definition


【解决方案1】:

函数Add_New_Movie_At_The_Beggining 有一个冗余代码。它可以更简单地定义。

LIST* Add_New_Movie_At_The_Beggining(LIST* pF, MOVIES newMovie)
{
    LIST* pNew = (LIST*)malloc(sizeof(LIST));

    pNew->Data = newMovie;
    pNew->pNext = pF;

    return pNew;
}

Delete_By_Director 函数可以通过以下方式更改,如下所示,以便能够删除列表中的多个节点。

LIST* Delete_By_Director(LIST* pF)
{

    LIST* pCurrent;
    LIST* prev;
    char tmpDirector[50];

    printf("Enter the director's name:");
    scanf("%s", tmpDirector);

    size_t count = 0; 
    for (pCurrent = pF, prev = pF; pCurrent != NULL; )
    {
        if (strcmp(pCurrent->Data.director, tmpDirector) == 0)
        {
            printf("\n------DELETED------\n");
            printf("\nnomenclature number: %d\n movie name: %s\n movie director: %s\n year of production: %d\n", pCurrent->Data.nomenclature_number, pCurrent->Data.movie_name, pCurrent->Data.director, pCurrent->Data.year);
            printf("\n------DELETED------\n");

            if (prev == pCurrent)
            {
                pF = pF->pNext;
                free(pCurrent);
                prev = pCurrent = pf;
            }
            else
            {
                prev->pNext = pCurrent->pNext;
                free(pCurrent);
                pCurrent = prev->pNext; 
            }

            ++count;
        }
        else
        {
            prev = pCurrent;
            pCurrent = pCurrent->pNext;
        }
    }
    if ( count == 0 ) printf("\nNO MOVIES FOUND BY DIRECTOR: '%s'\n", tmpDirector);

    return pF;
}

【讨论】:

  • 嘿,是的,第一个函数我只是不知道我到底在做什么,我为这段代码增加了 8 个函数,而且有点混乱。我想我明白你的意思,它的工作原理!非常感谢!干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2016-04-30
  • 2019-10-19
  • 2021-05-05
  • 1970-01-01
  • 2011-05-07
相关资源
最近更新 更多