Извините, но ваш код настолько сложен, что я предпочел не пытаться его понять
Если addWorker возвращает нового работника (а не нового заголовка списка), первым параметром должно быть местоположение, в котором запоминается заголовок, поэтому Worker ** head
. После того, как вам нужно будет перебрать список до нужной позиции, чтобы вставить нового работника.
Для сравнения строк используйте strcmp
Решение:
//first function-add a new worker to the list//
Worker * addWorker(Worker ** head, char name[], char *city, int id, float salary)
{
Worker * new = malloc(sizeof(Worker));
strcpy(new->name, name); /* hope the name is not too long to be saved in Worker */
new->city = city; /* hope the city is always a valid string */
new->id = id;
new->salary = salary;
while ((*head) && (strcmp(name, (*head)->name) > 0))
head = &(*head)->next;
new->next = *head;
*head = new;
return new;
}
Заметьте, странно, что у города и имени не одинаковое поведение, но я уважал это.
Если бы у меня были некоторые определения для полной программы, включая печать и удаление:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct Worker {
char name[10];
const char * city;
int id;
float salary;
struct Worker * next;
} Worker;
//first function-add a new worker to the list//
Worker * addWorker(Worker ** head, char name[], char *city, int id, float salary)
{
Worker * new = (Worker *)malloc(sizeof(Worker));
strcpy(new->name, name); /* hope the name is not too long to be saved in Worker */
new->city = city; /* hope the city is always a valid string */
new->id = id;
new->salary = salary;
while ((*head) && (strcmp(name, (*head)->name) > 0))
head = &(*head)->next;
new->next = *head;
*head = new;
return new;
}
void pr(Worker * l)
{
while (l != NULL) {
printf("%s %s %d %f\n", l->name, l->city, l->id, l->salary);
l = l->next;
}
}
void del(Worker * l)
{
while (l != NULL) {
Worker * w = l;
l = l->next;
free(w);
}
}
int main()
{
Worker * l = NULL;
addWorker(&l, "aze", "c1", 1, 1);
addWorker(&l, "qsd", "c2", 2, 2);
addWorker(&l, "aaa", "c3", 3, 3);
addWorker(&l, "wxc", "c4", 4, 4);
pr(l);
del(l);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra -Wall w.c
pi@raspberrypi:/tmp $ ./a.out
aaa c3 3 3.000000
aze c1 1 1.000000
qsd c2 2 2.000000
wxc c4 4 4.000000
Исполнение под valgrind :
pi@raspberrypi:/tmp $ valgrind ./a.out
==17053== Memcheck, a memory error detector
==17053== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==17053== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==17053== Command: ./a.out
==17053==
aaa c3 3 3.000000
aze c1 1 1.000000
qsd c2 2 2.000000
wxc c4 4 4.000000
==17053==
==17053== HEAP SUMMARY:
==17053== in use at exit: 0 bytes in 0 blocks
==17053== total heap usage: 5 allocs, 5 frees, 1,136 bytes allocated
==17053==
==17053== All heap blocks were freed -- no leaks are possible
==17053==
==17053== For counts of detected and suppressed errors, rerun with: -v
==17053== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
Второе предложение в случае, если addWorker возвращает новый заголовок списка, а не нового работника, новое определение для addWorker и main
Worker * addWorker(Worker * head, char name[], char *city, int id, float salary)
{
Worker ** phead = &head;
Worker * new = (Worker *)malloc(sizeof(Worker));
strcpy(new->name, name); /* hope the name is not too long to be saved in Worker */
new->city = city; /* hope the city is always a valid string */
new->id = id;
new->salary = salary;
while ((*phead) && (strcmp(name, (*phead)->name) > 0))
phead = &(*phead)->next;
new->next = *phead;
*phead = new;
return (new->next == head) ? new : head;
}
int main()
{
Worker * l = NULL;
l = addWorker(l, "aze", "c1", 1, 1);
l = addWorker(l, "qsd", "c2", 2, 2);
l = addWorker(l, "aaa", "c3", 3, 3);
l = addWorker(l, "wxc", "c4", 4, 4);
pr(l);
del(l);
}