odwracanie listy

0

Witam. Moglibyście pokazać jak poprawić ten kawałek kodu? Nie odwraca mi pierwszej liczby, dopiero drugą i kolejne a pierwszą pozostawia bez zmian.

void odwroc (element *head){
    element *a=head->next; 
    element *p=NULL;
    element *n=NULL; 
 
    while (a!=NULL){
        n=a->next;
        a->next=p;
        p=a;
        a=n;    
    }
    head->next=p;
}
  
0

Przy obracaniu listy zmienia zawsze zmienia się pierwszy element (no chyba że lista zawiera tylko jeden element.
Z nagłówka funkcji jasno wynika że nie może ona zmienić pierwszego elementu.

void odwroc(element **head)
  {
   element *i,*n=NULL,*h=NULL;
   for(i=*head;i;i->next=h,h=i,i=n) n=i->next;
   *head=h;
  }
0

Próbowałem tą funkcję użyć w moim programie, ale niestety nie chcę działać. Wywala program na tej funkcji.

  #include <stdio.h>
#include <stdlib.h>
 
typedef struct element element;
 
struct element
{
   int klucz; // przechowywana wartość 
   struct element *nast; // wskaźnik na kolejny element listy 
};
 
 
void dodaj(element **lista, int x)
{
     element *e, *tmp;
     e = malloc(sizeof(element)); // alokowanie pamieci    
     e->klucz=x;
     if (*lista == NULL)   // sprawdzamy czy to pierwszy element listy  
      {
        e->nast = *lista;
        *lista = e;
         // jeżeli tak to nowy element jest teraz początkiem listy
      }
      else
       { 
            // w przeciwnym wypadku wędrujemy na koniec listy
         tmp = *lista;
         while (tmp->nast != NULL)
                     // znajdujemy wskaźnik na ostatni element

            tmp=tmp->nast;          
            tmp->nast = e; // ostatni element wskazuje na nasz nowy
            e->nast = NULL;  // ostatni nie wskazuje na nic
       }
}

 
 void wypisz_liste(element *lista)
 {
   element *wsk=lista;          //Ustaw wskaźnik roboczy na pierwszym elemencie listy
   while( wsk != NULL )          //Jeśli wskaźnik ma wartość NULL, przerwij
     {
     printf ("%lu\n", wsk->klucz); //Wypisz element wskazywany przez wskaźnik
     wsk = wsk->nast;            //Przesuń wskaźnik na element, który jest wskazywany przez pole nast
     } 
     printf("\n");                          
 }
 
void odwroc(element **head)
  {
   element *i,*n=NULL,*h=NULL;
   for(i=*head;i;i->nast=h,i=n) 
   n=i->nast;
   *head=h;
  } 
 

 
main ()
{
     element *lista, *e;
     int i, h, n;
     lista=NULL;
     printf("Podai ilosc liczb");
     scanf("%i", &n);
     for (i=0; i<(n); i++)
     {
       printf("Podaj liczbe: \n");
       scanf("%i", &h);
       dodaj(&lista, h);
     }
     wypisz_liste(lista); 
     odwroc(lista);  
}
0

Nie program wywala, zaś kompilator na ciebie krzyczy ponieważ nie umiesz tej funkcji użyć. Porównaj z wywołaniem funkcji dodaj()

To samo, lecz po ludzku:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct _node snode,*node,**list;
 
struct _node
  {
   int key;
   node next;
  };
  
void add(list head,int key)
  {
   node n;
   n=(node)malloc(sizeof(snode));
   n->key=key;
   n->next=*head;
   *head=n;
  }
 
void show(list head)
  {
   node n;
   for(n=*head;n;n=n->next) printf(" %d",n->key);
   printf("\n");
  }
 
void reverse(list head)
  {
   node i,n=NULL,h=NULL;
   for(i=*head;i;i->next=h,h=i,i=n) n=i->next;
   *head=h;
  }
 
int main ()
  {
   node lst=NULL;
   int key;
   for(;;)
     {
      printf("Podaj liczbe (!-koniec): ");
      if(scanf("%d",&key)!=1) break;
      reverse(&lst);
      add(&lst,key);
      show(&lst); 
      reverse(&lst);
      show(&lst); 
     }
   return 0;
  }
0

zapomniałem dodać &. teraz wywołuje przez

 odwroc(&lista);

Tylko że nie wypisuje mi żadnych liczb, tak jakby w liście nie znajdował się żadne liczby

0

Dzięki za program, jak będę mieć jakiś problem z jego interpretacją to napiszę.

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