Lista jednokierunkowa

0

Jest sporo tematów o liście jednokierunkowej, ale mam dość nietypowy problem i nie potrafię go rozwiązać. Otóż mam na ten moment funkcje która dodaje elementy na początek i wyświetla listę.

int add_head(struct node * head, int v)
{
	
struct node *tmp;
tmp = (struct node *)malloc(sizeof(struct node));
tmp->val=v;
tmp->next=head;
head=tmp;
return 0;
}
void show(struct node * head)
{
struct node *tmp;
int i;
tmp=head;
for(i=0;i<n;i++)
{
	printf("%d\t",tmp->val);
	tmp=tmp->next;
}
}

Problem jest taki że w VS 2012 działa program bezbłędnie. Gdy dam ten sam kod na linuxa i kompiluje gcc to też nie mam błędów jednak po uruchomieniu i wpisaniu danych, mam segmetation fault, czyli prawdopodobnie mam problem w funkcji show. Mógłby ktoś mi to powiedzieć co robię źle?

0

Próbowałeś zamiast forem wyświetlać while'em sprawdzając czy jest kolejny element w liście?

1
IceHeart napisał(a):
int add_head(struct node * head, int v) {
/* ... */
head=tmp;
return 0;
}

head = tmp zmieni tylko zmienną lokalną w funkcji add_head. Prawdopodobnie nie tego oczekiwałeś. Poza tym:

IceHeart napisał(a):
void show(struct node * head)
{
struct node *tmp;
int i;
tmp=head;
for(i=0;i<n;i++)
{
	printf("%d\t",tmp->val);
	tmp=tmp->next;
}
}

Skąd masz dostęp do zmiennej n i czym ona jest?

0

A jak uzyskać dostęp do head=tmp w innej funkcji?

2
IceHeart napisał(a):

A jak uzyskać dostęp do head=tmp w innej funkcji?

Albo zwracaj nowy wskaźnik jako wynik działania funkcji, albo przekaż podwójny wskaźnik. Ewentualnie możesz zmienić strukturę:

struct Node { /*...*/ };
struct List {
    struct Node *head;
};

i wszędzie wszędzie przekazywać struct List *.

1

@IceHeart to co zaproponował @Oak

struct List {
    struct Node *head;
};

jest znacznie wygodniejsze, metoda dodająca będzie wyglądać następująco:

void add_head(struct List *Lst, int v)

wewnątrz zmieniasz Lst->head i po sprawie.

0

Dzięki Panowie za szybką pomoc. Fajny ten pomysł z dodatkową strukturą, napisze sobie to na dwa sposoby. Przekazuje sobie podwójny wskaźnik do funkcji i nawet fajnie to wychodzi.

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