В начале вашей функции:
trade_list *prev = NULL;
На каждой итерации в вашем цикле перед newnode = newnode->next;
добавьте prev = newnode
.
Затем удалите:
if (prev == NULL) /* replace the head */
head = newnode->next;
else
prev->next = newnode->next;
/* free newnode? */
Довольно просто.
РЕДАКТИРОВАТЬ : у вас действительно должны быть некоторые функции, такие как list_create
, list_add
, list_remove
, связанные с вашей структурой данных, а не просто бросок какудалить код в функцию печати.Это первое, что я делаю, когда создаю какую-либо структуру данных.
Другой вариант - иметь связанный список, например:
typedef struct trade_node {
char* trader_msg;
u_int32_t id_of_sender;
int sender_timer;
int local_time;
struct trade_node *next;
} trade_node;
typedef struct trade_list {
trade_node *head;
/* trade_node *foot; ? */
size_t length;
} trade_list;
EDIT2 : что касаетсяизмените print_trades
на что-то вроде:
void print_trades()
{
trade_list *prev = NULL, *next;
trade_list *newnode = head;
while (newnode) {
if ((elapsed - newnode->local_time >= 8)) {
printf ("%s\n", newnode->trader_msg);
/* temp variable for newnode->next */
next = newnode->next;
if (prev == NULL) /* replace the head */
head = next;
else
prev->next = next;
/* free newnode->trader_msg? */
free(newnode);
/* don't update prev */
newnode = next;
}
else {
prev = newnode;
newnode = newnode->next;
}
}
}
В вашем коде previous
никогда не будет NULL
, так как вы установили его в newnode
в начале цикла, и newnode
также не должно равняться newnode->next
до тех пор, пока newnode
не будет полностью обработано.Вы также используете newnode
после того, как free
d.