我有一個程序在c從不同的客戶端和服務器接收消息。當消息進入時,它將消息添加到該列表中。將消息添加到列表後,我將其打印在屏幕和其他服務器上。但是我想在打印後刪除包含消息的節點,所以當打印函數被調用時只打印新消息。如何在打印後刪除節點?如何在打印內容後從鏈表中刪除節點?
這裏是我的結構:
typedef struct trade_list {
char* trader_msg;
u_int32_t id_of_sender;
int sender_timer;
int local_time;
struct trade_list *next;
}trade_list;
trade_list *head = NULL;
這裏是我的打印方式:
void print_trades()
{
trade_list * newnode = head;
trade_list *previous = NULL;
while (newnode) {
previous = newnode;
if ((elapsed - newnode->local_time >= 8))
printf ("%s\n", newnode->trader_msg);
newnode = newnode->next;
if (previous == NULL)
head = newnode->next;
else
{
previous->next = newnode->next;
free(newnode);
}
}
}
因此給了我分割故障。我試着改變newnode-> next在else部分中的newnode。 previous->next = new node;
它沒有給我一個錯誤,但它並沒有刪除節點,因爲它不停地在每次打印功能被稱爲
是的,我有功能添加和排序。我只是不認爲我需要打印,因爲我認爲我足夠簡單,可以在打印功能內完成。你上面提到的代碼正是我以前使用過的,但是對於prev-> next = newnode-> next part不斷出現分段錯誤@AusCBloke –
@AdamAdamou你有沒有檢查'prev == NULL'的情況,頭正在被刪除?如果你沒有,你會從'prev-> next'得到段錯誤,因爲'prev'是'NULL'。 – AusCBloke
是的,我做了檢查。讓我編輯上面的代碼,以便我可以看到我所做的。 –