【发布时间】: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