Listy dodawanie pierwszego el.

0

Witam , mam problem z dodawaniem pierwszego el do listy (add_first) i nie potrafie znaleźć błędu , widzicie coś ?
#include <stdio.h>
#include <stdlib.h>

typedef struct lista
{
int val;
struct lista *next;
}lista;

void add(lista *poczatek,int wartosc)
{
lista element;
element=(lista
) malloc (sizeof(lista));
element->val=wartosc;
while(poczatek->next)
{
poczatek=poczatek->next;
}
poczatek->next=element;
element->next=NULL;
}

void show(lista *poczatek)
{
while(poczatek)
{
printf("%d\n",poczatek->val);
poczatek=poczatek->next;
}
}

void add_first(lista *poczatek,int wartosc)
{
lista tmp;
tmp=(lista
) malloc (sizeof(lista));
if (tmp==NULL)
{ printf("BRAK PAMIECI !");
return 1;
}
tmp->val=wartosc;
tmp->next=poczatek;
poczatek=tmp;
}
int main()
{
lista poczatek= (lista) malloc (sizeof(lista));
poczatek->val=25;
poczatek->next=NULL;
add(poczatek,20);
add_first(poczatek,289);
show(poczatek);

return 0;

}

2

Jeżeli stworzysz sensowną strukturę to dużo zyskujesz:

  • Wszystko zapisuje się w parą wierszy
  • Złożoność operacji dodawania na koniec staje się O(1) zamiast O(N)
#include <stdio.h>
#include <stdlib.h>

typedef struct node
  {
   int value;
   struct node *next;
  } node;
  
typedef struct
  {
   node *head,*tail;
  } list;

node *makenode(int value,node *next)
  {
   node *tmp=(node*)malloc(sizeof(node));
   tmp->value=value;
   tmp->next=next;
   return tmp;
  }

void addtail(list *lst,int value)
  {
   node *tmp=makenode(value,NULL);
   if(lst->tail) lst->tail->next=tmp;
   else lst->head=tmp;   
   lst->tail=tmp;
  }

void addhead(list *lst,int value)
  {
   node *tmp=makenode(value,lst->head);
   if(!lst->tail) lst->tail=tmp;
   lst->head=tmp;
  }  
  
void clean(list *lst)
  {
   while(lst->head)
     {
      lst->tail=lst->head;
      lst->head=lst->head->next;
      free(lst->tail);
     }
   lst->tail=NULL;
  }

void show(list *lst)
  {
   node *i;
   printf("{ ");
   for(i=lst->head;i;i=i->next) printf("%d ",i->value);
   printf("}\n");
  }

int main()
  {
   int i;
   list lst={NULL,NULL};
   show(&lst);
   for(i=0;i<5;++i) addtail(&lst,i);
   show(&lst);
   for(i=1;i<5;++i) addhead(&lst,-i);
   show(&lst);
   clean(&lst);
   return 0;
  }
0

Jak możesz się domyślić dopiero się ucze , wole zrozumieć to i potem probować udoskonalać niż po prostu przepisać. A co do mego pytania , wiesz co źle zrobiłem?

0

Tak i napisałem to w komentarzu, masz ten sam problem co tu: http://ideone.com/FSRV9k

#include <stdio.h>

void foo(int x)
  {
   printf("x=%d\n",x);
   x=666;
   printf("x=%d\n",x);
  }

int main(void)
  {
   int a=13;
   foo(a);
   printf("a=%d <- czemu nie 666?\n",a);
   return 0;
  }
0

Rozumiem , funkcja nie zmienia wartości w mainie , a jak zrobić zeby zmieniała ?

0

Jedno z:

  1. Stworzyć sensowną strukturę - przykład podałem, ale jak rozumiem uczyć się nie chcesz;
  2. Zwrócić i złapać nową wartość;
  3. Przekazać przez wskaźnik;
  4. (w C++) przekazać przez referencje.
0

Zrozumiałem , czyli w przykladzie który podałeś (obrazujący mój błąd) na początku trzeba go zmienić na typ który zwraca (w tym przypadku int) i zamienić a z zmienną zwracaną , tylko teraz pytanie - jak zrobić żeby złapać zwracaną zmienną?

0
#include <stdio.h>
 
int foo(int x)
  {
   if(x<100) x=666;
   return x;
  }
 
int main(void)
  {
   int a=13;
   a=foo(a);
   printf("a=%d\n",a);
   return 0;
  }

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