我有这个结构列表,我需要一次删除其中一个元素,我搜索过类似的问题,但我仍然不知道如何做到这一点。 缺点是代码,有人可以告诉我该怎么做吗?
//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);
}
答案 0 :(得分:0)
看看定义:
void borraLista(int i, int numero)
和电话:
borraLista(i,true);
你正在调用borraLista i =(for循环后的值) numero = true, 所以borraLista中的这一行永远不会成真:
if(i == numero)