• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C] Co jest źle z kodem listy jednokierunkowej?

VPS Starter Arubacloud
0 głosów
186 wizyt
pytanie zadane 22 kwietnia 2016 w C i C++ przez programmero Bywalec (2,420 p.)

Forumowicze mam problem z implementacją prostej listy jednokierunkowej w C. Wydaje mi się że kod napisałem dobrze ale jednak po skompilowaniu i uruchomieniu lista jest pusta! :) Zobaczcie, bo mnie się wydaje że nie ma błędu.

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

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

// List of elements

void insert(node*, int);
void printlist(node*);

// Main Function

int main()
{
	node *mylist = NULL;
	int i, n = 3;

	for (i = 0; i < n; i++)
		insert(mylist, i);

	printf("My list:\n");
	printlist(mylist);
	free(mylist);
	return 0;
}

// Add a new element to list

void insert(node *head, int value)
{
	node *ptr = (node*)malloc(sizeof(node));
	ptr->val = value;
	ptr->next = head;
	head = ptr;
}

// Print all elements from list

void printlist(node *head)
{
	node *ptr = head;
	while (ptr != NULL)
	{
		printf("%d\n", ptr->val);
		ptr = ptr->next;
	}
}

 

2 odpowiedzi

+1 głos
odpowiedź 23 kwietnia 2016 przez LislaV Bywalec (2,400 p.)
wybrane 23 kwietnia 2016 przez programmero
 
Najlepsza

Po pierwsze, do funkcji musisz przekazać nie wskaźnik do listy, a adres wskaźnika do niej. Taki wskaźnik na wskaźnik :) Dlaczego tak? Ponieważ w Twojej obecnej funkcji działasz na kopii tego wskaźnika. To tak, jakbyś napisał coś takiego:
 

void zmien(int x)
{
    x = 10;
}

int main()
{
    int liczba = 1;
    zmien(liczba);
    printf("%d", liczba); //wypisze 1
}

W powyższym przykładzie musiałbyś podać wskaźnik do tej zmiennej i poprzez ten wskaźnik zmienić wartość zmiennej, czyli funkcja musiałaby wyglądać w ten sposób

void zmien(int* x)
{
    *x = 10;
}

a wywołanie

zmien(&liczba);

Tak samo w przypadku twojej funkcji. Jej deklaracja powinna wyglądać tak: void insert(node**, int); W niej operujesz na wskaźniku tak jak na powyższym przykładzie, np. *head = ptr; Nie zapomnij też o poprzedzeniu zmiennej ampersandem przy wywołaniu funkcji: insert(&myList, i);

Po drugie, to co napisał Vim - musisz najpierw przejść do końca listy, a potem dodać element.

komentarz 23 kwietnia 2016 przez programmero Bywalec (2,420 p.)
Hmmm sprawdzę twoją sugestię jak dobiorę się do kompa :) Jeśli chodzi o dodawanie elementu do listy, zależy mi na prostej implementacji tak jak jest to na stosie, dodawanie na początek (dodawanie na koniec zrobię osobno), ale z tym już sobie poradzę :)
komentarz 23 kwietnia 2016 przez LislaV Bywalec (2,400 p.)
W takim razie Twój kod jest ok, wystarczy wprowadzić te zmiany, które opisałem i będzie działać :)
+1 głos
odpowiedź 23 kwietnia 2016 przez Vim Nowicjusz (240 p.)

Na pierwszy rzut oka wydaje mi się, że funkcja insert powinna najpierw dojść do końca listy, a następnie dodać nowy element.

void insert( node *head, int value ) {
        if( head == NULL ) {                       
                head= (node*)malloc( sizeof (node) );
                head->val = value;                    
                head->next= NULL;                                    
        } else {   
                node *tmp = head;                        
                while( tmp->next != NULL )      
                        tmp= tmp->next;         
                tmp->next= (node*)malloc( sizeof (node) );
                tmp->next->val= value;                       
                tmp->next->next= NULL;                                                     
        }                                                 
}

 

komentarz 23 kwietnia 2016 przez programmero Bywalec (2,420 p.)
Nie o to mi chodziło, gdyż powyższy kod dodaję element na koniec listy a ja implementuję dodawanie na początek (jak stos) :) ale dzięki za zainteresowanie. Przy implementacji dodawania na koniec na pewno skorzystam z twojej propozycji :)

Podobne pytania

0 głosów
1 odpowiedź 547 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 590 wizyt
0 głosów
1 odpowiedź 311 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez Agnes Użytkownik (990 p.)

92,843 zapytań

141,782 odpowiedzi

320,858 komentarzy

62,174 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...