well, the way things are set up you can't really delete items very easily (since you're using a single structure as opposed to an array, linked list, etc.). to be honest, there's too much wrong with the code to come up with a simple fix - I'm afraid you're on your own there. not sure if this helps any but perhaps looking at a similar program might be useful.
Code:
struct info {
char data[MAX+1];
struct info * next;
};
struct info * newInfo(const char * buffer) {
struct info * info = (struct info*)malloc(sizeof(struct info));
strncpy(info->data, buffer, MAX);
info->next = NULL;
return info;
}
void deleteInfoList(struct info ** list) {
struct info * goner, * iterator = *list;
while(iterator != NULL) {
goner = iterator;
iterator = iterator->next;
free(goner);
}
*list = NULL;
}
void readInfo(const char * filename, struct info ** list) {
struct info * info, * iterator;
char buffer[MAX+1];
FILE * fp = fopen(filename, "r");
if(fp != NULL) {
deleteInfoList(list);
while(fgets(buffer, MAX, fp)) {
info = newInfo(buffer);
if(*list == NULL) {
*list = iterator = info;
} else {
iterator->next = info;
iterator = iterator->next;
}
}
}
}
void writeInfo(const char * filename, struct info * list) {
FILE * fp = fopen(filename, "w");
if(fp != NULL) {
chsize(fileno(fp), 0);
while(list != NULL) {
fprintf(fp, "%s", list->data);
list = list->next;
}
}
}
void printInfo(struct info * list) {
int index = 1;
printf(" ***** Database *****\n");
while(list != NULL) {
printf(" %d) %s", index++, list->data);
list = list->next;
}
printf("\n");
}
void deleteInfo(struct info ** list) {
char temp[MAX];
unsigned which, index = 1;
struct info * iterator, * prev = NULL;
printf(" Enter the item # to delete: ");
which = atoi(fgets(temp, MAX, stdin));
for(iterator = *list; iterator != NULL; prev = iterator, iterator = iterator->next, ++index) {
if(index == which) {
if(prev != NULL) {
prev->next = iterator->next;
} else {
*list = iterator->next;
}
free(iterator);
break;
}
}
}
void addInfo(struct info ** list) {
char buffer[MAX+1];
struct info * info, * iterator = *list;
printf(" Enter the new data: ");
fgets(buffer, MAX, stdin);
info = newInfo(buffer);
if(*list == NULL) {
*list = info;
} else {
while(iterator->next) {
iterator = iterator->next;
}
iterator->next = info;
}
}
int menu(void) {
int ch;
char buffer[MAX+1];
printf(
" ***** Main Menu *****\n"
" a) Add Info\n"
" d) Delete Info\n"
" p) Print Info\n"
" x) Exit\n"
);
ch = tolower(fgets(buffer, MAX, stdin)[0]);
printf("\n");
return ch;
}
int main() {
const char * file = "info.txt";
struct info * list = NULL;
int choice;
readInfo(file, &list);
while((choice = menu()) != 'x') {
switch(choice) {
case 'p' :
printInfo(list);
break;
case 'a' :
addInfo(&list);
writeInfo(file, list);
break;
case 'd' :
deleteInfo(&list);
writeInfo(file, list);
break;
default:
printf("Invalid Selection\n");
}
}
return 0;
}