Как проект, я должен прочитать несколько табличных отдельных файлов (содержащих координаты x и y, начиная с 0,0 слева вверху) и сохранить содержимое в динамически распределенном связанном списке.С однократным чтением все нормально, но когда я читаю и пытаюсь добавить элементы второго файла в список, элементы как-то не добавляются.
Может кто-нибудь помочь мне найти причину ошибки икак это исправить?Возможно, я что-то не так делаю с указателями в списке?
Структуры:
typedef enum{
BLUME=-1, FREI
}belegung;
typedef struct position{
int zeile;
int spalte;
belegung element;
struct position* next;
}position;
typedef struct feld{
int zeilen;
int spalten;
int anzBlumen;
position* positionen;
}feld;
Функция для чтения и добавления элементов:
int read(feld* f, char* file){
FILE* in;
if((in = fopen(file, "r")) == NULL)
return -1;
int count = 0;
if (f->zeilen == 0 && f->spalten == 0 && f->positionen == NULL)
count = firstread(in, f);
else {
printf("already have flowers\n");
int a, b;
int oldS = f->spalten;
position* ptr = f->positionen; // CAUTION: p = NULL
while (ptr != NULL) {
ptr = ptr->next;
if (ptr != NULL)
printf("readA: ptr @ %p -> (%d, %d) = %d\n", ptr, ptr->zeile,
ptr->spalte, ptr->element);
}
// read first line
if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
f->zeilen = max(f->zeilen, a);
f->spalten = oldS + b;
count++;
}
// read first flower
if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
ptr = calloc(1, sizeof(position));
ptr->zeile = a;
ptr->spalte = b + oldS;
ptr->element = -1;
ptr->next = NULL;
count++;
printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
ptr->spalte, ptr);
}
// read flower lines
while (fscanf(in, "%d\t%d", &a, &b) != EOF) {
ptr->next = calloc(1, sizeof(position));
ptr = ptr->next;
ptr->zeile = a;
ptr->spalte = b + oldS;
ptr->element = -1;
ptr->next = NULL;
printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
ptr->spalte, ptr);
count++;
}
f->anzBlumen += count - 1;
}
printf("Flowerscan done\n");
// get 'next' to write element in ptr
preinitFreefeld(f);
//setFreefeld(f);
printf("setting up free field done\n");
fclose(in);
return count;
}
int firstread(FILE* in, feld* f) {
int a, b;
position* p = NULL;
int count = 0;
// read first line
if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
f->zeilen = a;
f->spalten = b;
count++;
}
// read first flower
p = calloc(1, sizeof(position));
position* ptr = p;
if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
ptr->zeile = a;
ptr->spalte = b;
ptr->element = BLUME;
ptr->next = NULL;
count++;
}
f->positionen = p;
// read flower lines
while (fscanf(in, "%d\t%d", &a, &b) != EOF) {
if (ptr->next == NULL)
ptr->next = calloc(1, sizeof(position));
ptr = ptr->next;
ptr->zeile = a;
ptr->spalte = b;
ptr->element = BLUME;
ptr->next = NULL;
count++;
}
f->positionen = p;
f->anzBlumen = count - 1;
return count;
}
Пример входного файла:
3 5
2 2
2 3
0 0
0 1
2 4
1 4
0 2
В этом входе первая строка указывает количество строк и строк для использования на экране, следующие строки, в которых элементы расположены с первым номером в строке, являются строкой.или x in (x, y).
Пример вывода:
-1 -1 -1 0 0
0 0 0 0 -1
0 0 -1 -1 -1