• 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?

Object Storage Arubacloud
0 głosów
166 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ź 473 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez Dyali56 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 466 wizyt
0 głosów
1 odpowiedź 256 wizyt
pytanie zadane 20 stycznia 2020 w C i C++ przez Agnes Użytkownik (990 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...