c - 从结构中删除元素

标签 c struct pthreads

我有以下代码,该代码工作正常,除了当删除元素时,它会从父结构中删除。我需要父结构(first_name)与所有元素保持完整:

struct names_list {
    char username[20];
    struct names_list * next;
};
pthread_mutex_t name_list;

int retu = 0;
char username[20];
struct names_list * curr_name = first_name;
struct names_list * temp_name = NULL;
while( curr_name != NULL )
{
    pthread_mutex_lock(&name_list);
    strncpy(username, curr_name->username, sizeof( username ) - 1 );
    pthread_mutex_unlock(&name_list);
    //validate
    retu = validate_name(sock,buff,sizeof(buff),username,domain);
    switch ( retu )
    {
    case 0:
        pthread_mutex_lock(&name_list);
        if (temp_name == NULL)
             first_name = curr_name->next;  //this is used for removing when current is first record
        else
            temp_name->next = curr_name->next; //this is used for removing current record from mid-list

        free(curr_name);//Freeing should be needed
        curr_name = curr_name->next;
        pthread_mutex_unlock(&name_list);
        break;

    case 1:
        pthread_mutex_lock(&name_list);
        temp_name = curr_name;
        curr_name = curr_name->next;
        pthread_mutex_unlock(&name_list);
        break;
    }

    if (retu == 2)
        break;
}

pthread_mutex_lock(&name_list);
curr_name = first_name;
pthread_mutex_unlock(&name_list);

*如何仅从 curr_name 中删除元素并保留 first_name 中的原始结构?*

最佳答案

这是您的解决方案。

struct names_list {
        char username[20];
        struct names_list * next;
};
pthread_mutex_t name_list;


int retu = 0;
char username[20];
struct names_list * temp_list_head=NULL;
struct names_list * prev_list_node=NULL;
struct names_list * curr_name = first_name;
struct names_list * temp_name = NULL;

//make a copy of your list
while (curr_name){
    struct names_list *tempNode = malloc(sizeof( struct names_list));
    *tempNode = *curr_name;
    if (temp_list_head== NULL)
        temp_list_head = tempNode;
    if (prev_list_node!=NULL)
        prev_list_node->next = tempNode;
    prev_list_node = tempNode;
    curr_name = curr_name->next;
}

curr_name = temp_list_head;

while( curr_name != NULL )
{
    pthread_mutex_lock(&name_list);
    strncpy(username, curr_name->username, sizeof( username ) - 1 );
    pthread_mutex_unlock(&name_list);
    //validate
    retu = validate_name(sock,buff,sizeof(buff),username,domain);
    switch ( retu )
    {
       case 0:
         pthread_mutex_lock(&name_list);
         if (temp_name == NULL)
              temp_list_head = curr_name->next;  //this is used for removing when current is first record
         else
              temp_name->next = curr_name->next; //this is used for removing current record from mid-list
         free(curr_name);//Freeing should be needed
        // curr_name = curr_name->next; //not needed, its removed from the list
         pthread_mutex_unlock(&name_list);
         break;
       case 1:
         pthread_mutex_lock(&name_list);
         temp_name = curr_name;
         curr_name = curr_name->next;
         pthread_mutex_unlock(&name_list);
         break;
    }
    if (retu == 2)
         break;
}
pthread_mutex_lock(&name_list);
curr_name = temp_list_head;
pthread_mutex_unlock(&name_list);

关于c - 从结构中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009734/

相关文章:

c - pthread/uthread类型变量

c - 尝试为文件 IO : 创建多个线程时出现段错误

我可以有条件地定义 openMP 并行区域吗?

c - 声明结构和结构大小相关的数组

c++ - mem_fun 失败,pthread 和类 ptr

c - 多线程:何时启动和退出线程

c - 变量名作为宏参数

c - C 中带有字符串列表的最后 N 行

c++ - 如何增量编码 C/C++ 结构以通过套接字传输

c - 指向结构体数组的指针