Lista dwukierunkowa w C

0

mam nastepujące pytanie, mam czesc kodu, który usuwa i dodaje elementy do listy dwukierunkowej, teraz chcialabym usunąc element który ma okreslona wartosc, nie wiem jak sie zabrac za to

 #include <stdio.h>
#include <stdlib.h>


struct kolejka
{
   int x;
   struct kolejka *prev;
   struct kolejka *next;




};


void wypisz(struct kolejka *a)
{
if(a==NULL)
{
   printf("lista jest pusta\n");
}
do
{
   printf("%d\n",a->x);
   a=a->prev;
}
while(a!=NULL);
}

struct kolejka *push_front(struct kolejka *a, int z)

{
   struct kolejka *tmp=(struct kolejka *)calloc(1,sizeof(struct kolejka));
   tmp->x=z;
   if (a==NULL)
   {
      tmp->prev=NULL;
      tmp->next=NULL;
   }
   else
   {
      tmp->next=NULL;
      tmp->prev=a;
      a->next=tmp;
   }
   return tmp;



}

struct kolejka * pop_front(struct kolejka *a)
{
   
   if (a==NULL)
   {
      printf("error:kolejka jest pusta\n");
      return NULL;
   }
   else
   {
      struct kolejka *tmp;
      tmp=a->prev;
      free(a);   
      tmp->next=NULL;

      return tmp;
   }




}


struct kolejka *push_back(struct kolejka *a, int z)
{

struct kolejka *tmp=(struct kolejka *)calloc(1,sizeof(struct kolejka));

   struct kolejka *tmp2;
   tmp->x=z;

   if (a==NULL)
   {
      
      tmp->prev=NULL;
      tmp->next=NULL;
      tmp2=tmp;
   }
   else
   {   
      tmp2=a;
      while(a->prev!=NULL)
         a=a->prev;
      

      
      tmp->next=a;
      a->prev=tmp;
      tmp->prev=NULL;
   
      
   }
   
   return tmp2;



}

struct kolejka * pop_back(struct kolejka *a)
{
struct kolejka *tmp;
   tmp=a;

   if (a==NULL)
   {
      printf("error:kolejka jest pusta\n");
      return NULL;
   }
   else
   {
      
   
      while(a->prev!=NULL)
      a=a->prev;
      (a->next)->prev=NULL;
      free(a);
   
   
   }
   
   return tmp;


}


int main(int argc, char **argv)

{


int i;

struct kolejka *lifo=NULL;
for(i=0;i<5;i++)   
   lifo=push_front(lifo, i);
wypisz(lifo);

    for(i=0;i<3;i++)
        lifo=pop_front(lifo);
    wypisz(lifo);

   
struct kolejka *livo=NULL;
for(i=0;i<5;i++)
    livo=push_back(livo, i);
wypisz(livo);
   
for(i=0;i<2;i++)
lifo=pop_back(livo);
wypisz(livo);
   
   

   



}
1

Masz minusa za nieumiejętność szukania informacji w internecie.
Nawet na Wiki masz pseudokod: http://en.wikipedia.org/wiki/Doubly_linked_list#Removing_a_node

0

szukałam, szukałam, ale to dla mnie niezrozumiałe co tam jest dlatego pytam

0

Z czym masz problem?
Językiem angielskim czy gotowym psedukodem tam podanym?

0

Gotowym kodem

0

To z kolei czego tutaj nie rozumiesz:

 function remove(List list, Node node)
   if node.prev == null
       list.firstNode := node.next
   else
       node.prev.next := node.next
   if node.next == null
       list.lastNode := node.prev
   else
       node.next.prev := node.prev
   destroy node

Wszystko jest właściwie podane na tacy...

0

Pierwszy semestr z programowaniem, nie ma lekko haha
Chodzi bardziej o wkomponowanie go w to co juz mam.
Mam juz cos takiego, ale jest błąd hmm

 struct kolejka *pop(struct kolejka *a, int z)
{
    struct kolejka *tmp;
    tmp=a;
    if(tmp==NULL)
    {
        printf("error:kolejka jest pusta\n");
        return NULL;
    }
    else
    {
        while((tmp!=z) && (tmp!=NULL))
            tmp=tmp->prev;
        
        if (tmp==z)
        {
            (tmp->next)->prev=tmp->prev;
            (tmp->prev)->next=tmp->next;
            free(tmp);
        }
        else
        {
            printf ("nie masz tego elementu w kolejce!");
        }
    }
    return a;
    
}
0
while((tmp!=z) ...)

1.Przypatrz się temu kodowi.
2.Spójrz na typ zmiennej tmp.
3.Spójrz na typ zmiennej z.
4.Jeżeli wciąż nie wiesz, co tutaj jest bezsensownego, wróć do punktu pierwszego.

0

okok, ma być tmp->x=z

1 użytkowników online, w tym zalogowanych: 0, gości: 1