В вашей функции insertHeadCircular()
вы обрабатываете emp
член employeeList
, как если бы это был employeeInfo *
. Например, вы объявляете:
employeeInfo *employee;
но потом сделаем это:
employee = current->emp;
Однако ваш тип employeeList
содержит экземпляр employeeInfo
, а не указатель на него:
typedef struct employeeInfo{
char firstname[100];
char lastname[100];
int monthsEmployed;
}employeeInfo;
/* ... */
typedef struct list{
employeeInfo emp; /* see? Not a pointer. */
struct list *next;
struct list *previous;
}employeeList;
Так что в основном вам нужно исправить свой код, чтобы вы перестали назначать структуру указателю и вместо этого присваивали адрес структуры указателю.
Скорее всего, ваши printInOrder()
и printReverse()
функции должны принимать employeeList *
аргументы, а не employeeList
, а также ... и вы должны проверить код, который вы используете для них, чтобы убедиться, что вы этого не сделаете путать два в любом месте.
Также неплохо определить свои функции где-то, кроме файла заголовка, например, в отдельном .c
исходном файле. Файл заголовка должен просто содержать прототипы функций, макросы и другие объявления, которые могут понадобиться для других исходных файлов; там вам не нужны тела функций, так как компоновщик может найти их в объектных файлах, созданных из ваших других источников. Подобное определение функций в заголовочных файлах вызовет бесконечные головные боли, когда заголовочный файл #include
редактируется более чем одним файлом.
Ошибка, которую вы получаете с вашим обновленным кодом, file.c:37: error: incompatible type for argument 2 of âinsertHeadCircularâ
указывает на то, что тип аргумента, который вы передаете insertHeadCircular()
, не тот тип, который вы указали в его объявлении - и это правда. Вы объявили и определили эту функцию, чтобы принять employeeInfo
в качестве второго аргумента:
employeeList *insertHeadCircular(employeeList *head, employeeInfo emp)
... но в main()
вместо него передается указатель:
employeeInfo *insert;
...
head = insertHeadCircular(head, insert);
Так что вам нужно поменять одно или другое. Либо разыменуйте insert
при вызове функции из main, либо измените insertHeadCircular()
, чтобы вместо него взять указатель (и соответственно обновите тело). Последнее, вероятно, лучше, так как позволяет избежать копирования всей структуры в стек при вызове функции.
Некоторые другие вещи, на которые следует обратить внимание:
Вы действительно должны проверить возврат из scanf()
в вашем цикле в main()
. Это позволит вам узнать, все ли поля были прочитаны; Прямо сейчас, если это не так, ваша программа просто продолжает работать с тем мусором, который уже имел переменные (например, с тем, что читалось на предыдущей итерации, возможно). Проверка других возвращаемых значений (например, возврат из malloc()
) также является хорошей идеей, но в этом случае особенно важно возвращение scanf()
.
Вы также не освобождаете insert
в конце вашей программы; ОС (почти наверняка) очистит ее при выходе из программы, но хорошей практикой является сделать это самостоятельно, когда вы закончите с ней. Однако, как вы его используете, вам все равно не нужно было его динамически размещать; Вы могли бы просто объявить employeeInfo
и взять его адрес (работает в любом случае).