I have a problem: I got a struct with "movies" data. I need to search by "director" (char), and delete any records of "movies" data if it matches the same "director", as I entered by keyboard. Everything is cool, I enter "director" and it deletes the "movies" data associated with it, no problem. But when there are more than one "movies" data with the same "director", it deletes only the first one encountered. and stops the function there. I need it to continue and delete EVERY "movie" data, matching the director entered by the user. Thanks for reading and I hope someone helps me, I am sure it's simple, just that I am not that good at programming (started some months ago). Have a nice day! It probably needs a while loop, but I tried and it didn't work. Maybe I didn't do it right. Thanks again for reading, take care!
#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;
}
The function Add_New_Movie_At_The_Beggining
has a redundant code. It can be defined simpler.
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;
}
The function Delete_By_Director
can be changed the following way as it is shown below to be able to remove several nodes in the list.
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;
}