2013-02-21 2 views
0

У меня есть следующий код, который отлично работает, за исключением того, что при удалении элемента он удаляется из родительской структуры. Мне нужна родительская структура (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 *

+0

'curr_name = curr_name-> next;' сразу после 'free (curr_name);' не определено поведение. Кроме того, что такое 'first_name' и что делает' validate_name'? –

+0

validate_name возвращает 0 или 1, и это не относится к этому вопросу. моя проблема связана с структурами и как их обрабатывать, поскольку я опубликовал – ShaMora

+0

, что именно вы подразумеваете под «сохранить исходную структуру в first_name», хотите ли вы, чтобы голова остальных элементов после удаления была указана с помощью first_name? – 75inchpianist

ответ

1

Вот ваше решение?.

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); 
+1

Это C, no 'new' здесь, должно быть' malloc'. И 'memcpy' должен использовать' sizeof * curr_name', но почему бы не просто '* temp_node = * curr_name'? –

+0

хороший вызов на вещь С, мозги спят. Что касается memcpy, вы хотите размер структуры, не так ли? Таким образом, это должно быть структуры. * curr_name будет одним и тем же, но менее очевидным, так как вы должны использовать типы с sizeof. и вы правы, назначение памяти гораздо более сжато с помощью оператора =. отредактированный как таковой. Благодаря! – 75inchpianist

+0

это повлияет на скорость или память? Я использовал malloc для добавления записей в структуру first_name. Есть ли другой способ сделать копию структуры без использования malloc? – ShaMora

Смежные вопросы