Структура, связанный список, заголовок, нулевой указатель, переполнение стека

Как я могу определить, что указатель головы показывает первый связанный элемент списка? Компилятор показывает ошибку на месте:

голова = 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;
}

}

0

Решение

В этом коде есть несколько ошибок.

Первое задание 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;
}
0

Другие решения


По вопросам рекламы [email protected]