Ваша первая проблема, кажется, в том, что вы на самом деле никогда не устанавливаете в поле bookid
структуры book
что-либо. В результате в каждой структуре книги останется какое-то произвольное значение, что принесет удачу, если del
когда-нибудь будет работать правильно.
Ваша проблема здесь:
printf("Enter books name:\n");
gets(b[i].name);
printf("Enter author's name\n");
gets(b[i].author);
printf("Enter price:\n");
gets(ch);
b[i].price=atoi(ch);
printf("Dear User,the book has succesfully been added.The book id is %d",i);
count++;
Посмотрите на этот код и покажите мне, где вы установили значение b[i].bookid
. Ответ никуда. Поэтому попробуйте изменить последние несколько строк на:
b[i].bookid = i;
printf("Dear User,the book has succesfully been added.The book id is %d", b[i].bookid);
count++;
Теперь, это все еще имеет проблему, если вы когда-либо вызываете add
после вызова del
, потому что в цикле с одной итерацией, в котором находится этот код, i
всегда имеет значение count
. Итак, как вы заметили, если count
когда-либо изменится, что будет часто, вы назначите дубликаты ID. Одним из решений является определение в верхней части функции add
статической переменной (которая сохраняет свое значение между вызовами функции), указывающей, каким должен быть следующий идентификатор книги, например:
void add(void)
{
static int nextBookId = 0;
int i = count;
char ch[30];
/* Do not overrun the array */
if (count >= 40) return;
clrscr();
printf("Enter books name:\n");
gets(b[i].name);
printf("Enter author's name\n");
gets(b[i].author);
printf("Enter price:\n");
gets(ch);
b[i].price=atoi(ch);
/* Assign the next unique book ID to this book, then increment nextBookId,
which will retain its incremented value next time you call add() */
b[i].bookid = nextBookId++;
printf("Dear User,the book has succesfully been added.The book id is %d", b[i].bookid);
count++;
getch();
}
Обратите внимание, что я заменил ваш цикл простой проверкой границ сверху.
Таким образом, каждая добавляемая вами книга получает свой собственный уникальный идентификатор, который не обязательно соответствует ее положению в массиве или количеству книг, которые существовали на момент добавления. Этот метод не будет повторно использовать идентификаторы ранее удаленных книг, но это, вероятно, желательное поведение.