从c中的链表中删除节点

时间:2013-03-04 01:10:54

标签: c

我正在尝试在C中创建一个简单的聊天服务(套接字编程)。 服务器是并发的,可以接受多个连接。我使用线程作为服务器和链表来保存套接字ID。除了用于从链表中删除节点的删除功能外,一切正常。每当客户端键入DONE时,我必须从链表中删除其套接字ID,但它无法正常工作。有人可以帮我弄清楚删除功能我该怎么做。

这是我的结构:

struct ClientList {
    struct ClientList *Next;
    int socket;
    char username[100];
    int count;
    FILE *file;
} ;

这里是添加节点的插入功能

void insert(struct ClientList *newItem,int new_s) {
    pthread_mutex_lock(&mymutex);
    struct ClientList *temp = (struct ClientList *) malloc(sizeof(struct ClientList)) ;
    temp->socket = new_s;
    temp->Next = head;
    head = temp;
    pthread_mutex_unlock(&mymutex);
}//insert function

这里是删除功能

int del(struct ClientList *temp,struct ClientList *newItem) {
    struct ClientList *cur = head;
    if (temp == head) {
        head = temp->Next;
        free(temp);
        return 0;   
    }//if
    else {
        while (cur) {
            if (cur->Next == temp) {
                cur->Next = temp->Next;
                free(temp);
            }//if
            cur = cur->Next;
        }//while
    }//else
}//del   

对于第一个节点,我没有问题,但对于所有其他节点,它不起作用。

我必须添加我的广播功能,我用它来广播从任何clinet到所有的任何消息。 这是广播代码:

void broadcast(struct ClientList* temp,char buf[MAX_LINE],struct ClientList * newItem) {

    int len;

    pthread_mutex_lock(&mymutex); 

    for(temp = head; temp != NULL; temp  =temp->Next) {
        if (temp->socket ! =newItem->socket) {
            buf[MAX_LINE-1]= '\0';
            len = strlen(buf) + 1;
            send(temp->socket, buf, len, 0);
        }//if
    }//for

    pthread_mutex_unlock(&mymutex);
}//broadcast

3 个答案:

答案 0 :(得分:4)

你在第二次做作业,而不是比较。它应该是:

if(cur->Next == temp)

if(cur->Next=temp)

答案 1 :(得分:3)

很可能是因为在想要两个时只使用一个等号的微不足道的错误:

if(cur->Next=temp)

应该是:

if(cur->Next==temp)

(同时删除“del”不需要的额外参数!)

提示:如果您使用的是良好的编译器,例如gcc,并且启用了所有警告-Wall,那么当您犯这个错误时它会给您一个警告。

答案 2 :(得分:0)

虽然您已经回答了实际问题,但还有一些关于删除功能的其他评论:

  1. 找到要删除的条目后,没有理由继续搜索列表。我会在第二个break之后添加free语句。
  2. 您在函数末尾没有return 0语句。因此,如果要删除的条目不在列表的头部,则函数的返回值将是未定义的。
  3. 这些都不会导致您的程序出现故障(除非您检查返回值),但这些都很难纠正。