Как я могу определить, что указатель головы показывает первый связанный элемент списка? Компилятор показывает ошибку на месте:
голова = domino-> Информация;
struct dominopart {
int number1;
int number2;};
struct dominoone {
dominopart info;
struct dominoone *next;
};
Сначала я определил это как нулевой указатель, потому что связанный список сначала пуст.
struct dominoone* next= NULL;
struct dominoone* head=NULL;
Затем информация из файла читается построчно.
int readDomino (){
FILE *datei;if((datei=fopen("datei.dat", "r") )==NULL) {
std::cout<<"File can't be opened"<<std::endl;
return 0;
}else {
int beginning;
int temp;
fscanf(datei, "%d", &beginning);
for(int i=0; i<beginning; i++) {
dominoone *domino= new dominoone;
fscanf(datei, "%i", &temp);
domino->info.number1=temp;
fscanf(datei, "%i", &temp);
domino->info.number2=temp;
printf("[%d:%d]", domino->info.number1, domino->info.number2);
domino->next=0;
if(i==1) {
head=domino->info; //The compiler shows mistake here
}
}
}return 0;
}
Файл читается и показывает это, что я правильно записал в файл, но я не могу удалить весь список, потому что моя голова указателя по-прежнему пуста:
void del () {
dominoone* tmp;
while(head != 0) {
tmp=(head)->next;
delete head;
head=tmp;
}
}
В этом коде есть несколько ошибок.
Первое задание head=domino->info
не может быть выполнено, так как типы левой и правой сторон несовместимы.
Во-вторых, при чтении списка домино вам нужно следить за хвостом списка.
Так что вам нужно объявить
struct dominoone* tail=NULL;
затем, после заполнения структуры, замените if (i==1) ...
с
if (i == 0 ) head = domino;
else tail->next = domino;
tail = domino;
Финальная версия readDomino()
функция может выглядеть так:
int readDomino (){
FILE *datei;
struct dominoone* tail=NULL;if((datei=fopen("datei.dat", "r") )==NULL) {
std::cout<<"File can't be opened"<<std::endl;
return -1;
}
int list_size;
fscanf(datei, "%d", &list_size);
for(int i=0; i<list_size; i++) {
dominoone *domino= new dominoone;
fscanf(datei, "%i", &domino->info.number1);
fscanf(datei, "%i", &domino->info.number2);
printf("[%d:%d]\n",
domino->info.number1,
domino->info.number2);
domino->next=NULL;
if (i == 0 ) head = domino;
else tail->next = domino;
tail = domino;
}
}
return 0;
}