Vlad Drakula
Потому, что сессия не за горами, потому, что требуют на языке Си использовать списки, С++ нельзя использовать, шаблоны здесь не пойдут.
Задачу решил следующим образом, функция views() правильно отображает данные из списка.
Код:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#define TRUE 1
#define FALSE 0
#define FILE_DB "db1.dat"
struct expt{int expert;char sport[20];int mesto;};
struct record{expt sps; record *prior;record *next;};
void clr (char a[]);
void printmenu(void);
void views(void);
void save(char a[],record *begin);
void load(char a[],record *begin);
void clr (char a[]){
FILE *f;
if((f=fopen(a,"w"))==NULL)printf("\n Error !\nFile could not be create\\opened.\n Press any key...");
else printf(" \n Data base clear successfully!\n Press any key...");
getch();
fclose(f);
}
void printmenu(){
clrscr();
printf("|----------------------------------|\n| Menu:\t\t\t\t |\n|------------\
----------------------|\n| 1 - Clear file data base \t |\n| 2 - Input data\t\t |\n| 3 - View db data\t\t\t |\n| 4 - Form file \
expert questioning |\n| 5 - Form file best sportsmans |\n| 0 - Exit\t\t\t |\n|-------\
---------------------------|\n\n Selection item: ");
}
void views(record *begin){
clrscr();
printf("\n Out spicok bd:\n");
while(begin){
printf("(expert%d---%s---mesto-%d\n",begin->sps.expert,begin->sps.sport,begin->sps.mesto);
begin=begin->next;
}
getch();
}
void save(char a[],record *begin){
FILE *f;
if((f=fopen(a,"w"))==NULL){printf("File could not be opened\n Press any key...");
getch();return;}else{
while(begin!=NULL){
fprintf(f,"%d",begin->sps.expert);
fprintf(f,"%s",begin->sps.sport);
fprintf(f,"%d",begin->sps.mesto);
begin=begin->next;
}
}
fclose(f);
}
void main (){
record *begin=NULL, /*Указатель начала списка*/
*last=NULL, /*Указатель на очередную запись*/
*list; /*Указатель на элементы списка*/
char c;
FILE *f;
if((f=fopen("db1.dat","a+"))==NULL){printf("File could not be opened\n Press any key...");
getch();return;}else{
while(fgetc(f)!=EOF){
last=(struct record*)malloc(sizeof(struct record));
if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;}
fscanf(f,"%d",&last->sps.expert);
fscanf(f,"%s",&last->sps.sport);
fscanf(f,"%d",&last->sps.mesto);
if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;}
else{list=begin;
while(list){
if(list->next==NULL){
last->next=NULL;
last->prior=list;
list->next=last;
break;
}
list=list->next;
}
}
}
}
fclose(f);
while(1){printmenu();
scanf("%s",&c);
switch(c){
case '1':{clr("db1.dat");break;}
case '2':{
int b=TRUE,extemp,count,c;
while(b!=FALSE){ //цикл ввода данных
clrscr();
printf("\n Input namber expert (1-10): ");
scanf("%d",&extemp);
for(count=3;count>0;count--){
last=(struct record*)malloc(sizeof(struct record));
if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;} /*проверка, выделена ли память?*/
(*last).sps.expert=extemp;
(*last).sps.mesto=count;
printf("\n Input family srortsmen: ");
scanf("%s",&(*last).sps.sport);
if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;} //списка ещё нет
else{list=begin; /*cписок уже существует*/
while(list){ /*цикл просмотра списка-поиск места для новой записи*/
if(list->next==NULL){ /*Включить запись в конец списка*/
last->next=NULL;
last->prior=list;
list->next=last;
break; /*выход из списка просмотра цикла*/
}
list=list->next;
}
}
}
printf("\n Next input? 1 - Yes \\ 0 - No\n"); //ввод нового эксперта
scanf("%d",&b);
}
printf("\n Data save? 1 - Yes \\ 0 - No\n"); /*записать данные в db.dat?*/
scanf("%d",&c);
if(c==TRUE)save(FILE_DB,begin);
else ;
break;}
case '3':{views(begin);break;}
case '4':break;
case '0':return;
default:{printf("\n Error !\n Can't no right selection item\n Press any key...");getch();break;}
}
}
}
Теперь возник новый вопрос. Данные записываются с помощью функции save(), в файл db1.dat.
При запуске программы, данные из файла db1.dat (конечно, если, они на этот момент существуют), должны
должны загружаться в оперативную память. Вот участок кода:
Код:

FILE *f;
if((f=fopen("db1.dat","a+"))==NULL){printf("File could not be opened\n Press any key...");
getch();return;}else{
while(fgetc(f)!=EOF){
last=(struct record*)malloc(sizeof(struct record));
if(last==NULL){printf("\n Error !\n No find memory\n Press any key...");getch();return;}
fscanf(f,"%d",&last->sps.expert);
fscanf(f,"%s",&last->sps.sport);
fscanf(f,"%d",&last->sps.mesto);
if(begin==NULL){last->prior=NULL;begin=last;last->next=NULL;}
else{list=begin;
while(list){
if(list->next==NULL){
last->next=NULL;
last->prior=list;
list->next=last;
break;
}
list=list->next;
}
}
}
}
fclose(f);
Но просматривая функцией views(), вижу, что данные отображаются неверно. Значит, я их неверно извлекаю из файла.
В чём заключается ошибка? Как это реализовать?