我怎样才能一次在线删除一个struct元素

时间:2014-08-13 15:07:12

标签: c struct

我有这个结构列表,我需要一次删除其中一个元素,我搜索过类似的问题,但我仍然不知道如何做到这一点。 缺点是代码,有人可以告诉我该怎么做吗?

//Estructura para guardar pid's
struct pid
{
    int numero;
    int numero_padre;
    struct pid *next;
    struct pid *ahead;
};

struct pid *head = NULL;
struct pid *curr = NULL;

// Primer Nodo
struct pid* creaLista(int numero)
{
    printf("\n Creando lista con el primer valor: [%d]\n",numero);
    struct pid *ptr = (struct pid*)malloc(sizeof(struct pid));
    if(NULL == ptr)
    {
        printf("\n Fallo al crear la lista \n");
        return NULL;
    }
    ptr->numero = numero;
    ptr->next = NULL;

    head = curr = ptr;
    return ptr;

}

struct pid* agregaALista(int numero, bool agrega_al_final)
{
    struct pid *next = NULL;
    //Si lista vacia
    if(NULL == head)
    {
        return (creaLista(numero));
    }

    if(agrega_al_final)
        printf("\n Agregando nodo al final de la lista [%d]\n", numero);
    else
        printf("\n Agregando nodo al comienzo de la lista [%d]\n",numero);

    //Reservar espacio para nuevo nodo
    struct pid *ptr = (struct pid*)malloc(sizeof(struct pid));
    if(NULL == ptr)
    {
        printf("\n Fallo al agregar nodo \n");
        return NULL;
    }
    ptr->numero = numero;
    ptr->next = NULL;

    if(agrega_al_final)
    {
        curr -> next = ptr;
        curr = ptr;
    }
    else
    {
        ptr->next = head;
        head = ptr;
    }
    return ptr;
}


void imprimeLista(void)
{
    struct pid *ptr = head;

    printf("\n -------Inicio de lista------- \n");
    while(ptr != NULL)
    {
        printf("\n [%d] \n",ptr->numero);
        ptr = ptr->next;
    }
    printf("\n -------Fin lista------- \n");

    return;

}


/*void quitardeLista(int numero, bool quita_al_final)
{
    struct pid *ptr = head;
    struct pid *del = NULL;

    //Si lista vacia
    if(quita_al_final)
        printf("\n quitando nodo al final de la lista [%d]\n", numero);
    else
        printf("\n quitando nodo al comienzo de la lista [%d]\n",numero);
    //Reservar espacio para nuevo nodo
    ptr->numero = numero;
    if(quita_al_final)
    {
        curr->ahead = ptr;
        curr = ptr;
        rmv(del);
        //free (del);
    }
    else
    {
        ptr->next = head;
        head = ptr;
        //free (del);
    }
    return ptr;
}*/
void borraLista(int i, int numero)
{

  struct pid *ptr = head;
  struct pid *del = NULL;

         while ( ptr->next != NULL)
        {

         if(i == numero)
          {
           curr -> next = ptr;
           curr = ptr;
           printf("\n Se borrará [%d] \n",ptr->numero);
           del = ptr;
           free (del->next);
           printf("\n Borrado! \n");
          }
          else
          {
           ptr->next = head;
           head = ptr;
           printf("\n Se borrará [%d] \n",ptr->next);
           del = ptr;
           free (del->next);
           printf("\n Borrado! \n");
          }
         return ptr;
           /* ptr->next = head;
            head = ptr;
            printf("\n next [%d] \n",ptr->next); */

         }

    printf("\n next [%d] \n",ptr->next); 

    return ptr;
    //ptr = ptr->ahead;
    //curr -> ahead;

}
  /*  while(ptr != NULL)
    {
        printf("\n Se borrará [%d] \n",ptr->numero);
        del = ptr;
        ptr = ptr->next;
    free (del->next);
    printf("\n Borrado! \n");
    }
    if(ptr != NULL)
    {
        printf("\n Se borrará [%d] \n",curr->numero);
        del = curr;
        curr = curr->ahead;
    free (del->ahead);
    printf("\n Borrado! \n");
    }*/

   //head = NULL;
//}

int main(void)
{
    int i = 0;
    int r = 0;
    // Inicializando contenedor
    struct pid *ptr = NULL;

    for(i; i<10; i++)
       {
         r = rand() % 9999;
         agregaALista(i,true);

       }


   imprimeLista();
   borraLista(i,true);



}

1 个答案:

答案 0 :(得分:0)

看看定义:

void borraLista(int i, int numero)

和电话:

   borraLista(i,true);

你正在调用borraLista  i =(for循环后的值)  numero = true, 所以borraLista中的这一行永远不会成真:

 if(i == numero)