Проблема в том, что ваша функция addRecords
не изменяет заданный указатель head
, когда создает новый список (т.е. при первом вызове)! Вместо этого вы должны сделать следующее:
void addRecords(sNums** head)
{
sNums* temp_new = createRecord();
sNums* fst_position;
fst_position = *head;
// printf("%d\n", fst_position);
printf("%p\n", (void*)(fst_position));/// Let's keep the format/argument arrangement cool!
if (fst_position == NULL) {
// fst_position = temp_new; // This WON'T change the 'head' pointer...
*head = temp_new; // ... but this will!
return;
}
while (fst_position->ptr != NULL) {
fst_position = fst_position->ptr;
}
fst_position->ptr = temp_new;
// Here, we don't change the 'head' pointer, so its OK!
}
Примечание. Посмотрите на изменение, которое я внес в вашу строку отчетности по указателю: использование спецификатора формата %d
для аргумента указателя является неопределенным поведением и вызовет все виды уродливых проблемы на платформах, где размер указателя не совпадает с размером int
.
Примечание 2. Чтобы избежать предупреждений (и возможных ошибок) на строгих, соответствующих стандарту компиляторах, вы должны добавить void
внутри Скобки для вашей createRecord
функции, чтобы указать, что она не принимает параметров:
sNums* createRecord(void);
Без этого компилятор clang-cl
(например) даст вам такой совет:
сообщение: это объявление не является прототипом; добавьте 'void', чтобы сделать его прототипом для функции с нулевым параметром
И, наконец:
Но он ничего не печатает.
Это потому, что вы никогда не звоните prinrecords
! Добавьте вызов к вашей функции main
:
int main(int argc, char const* argv[])
{
sNums* head = NULL;
printf("%p\n", (void*)(&head));// Keep format/agument cool!
for (int i = 0; i < 3; ++i) {
addRecords(&head);
}
prinrecords(head); // You forgot this!
system("pause");
return 0;
}