Implementacja listy jednokierunkowej w C

0

Cześć.
Muszę zaimplementować listę jednokierunkową w C, jednak przy wyoływaniu funkcji PrintList, wyskakuje mi "Segmentation fault(core dumped". Wklejam kod i proszę o pomoc :(

#include <stdio.h>
#include <stdlib.h>
#include "zad2.h"
List *Start=NULL;
 
List* AddOnStart (List *Start, int data)
{
    List *new_one;
    new_one = ( List * ) malloc(sizeof(List));
    new_one->data=data;
    new_one->next = Start;                        //pare operacji w jednej funkcji
    Start = new_one;
    return new_one;
}
List* AddSomewhere (List *actual, int data)
{
    List *new_one;
    new_one = ( List*)malloc(sizeof(List));
    new_one->data=data;
    new_one->next=actual->next;
    actual->next=new_one;
    return new_one;
}
 
void RemoveFirstElement(List *Start)
{
        List *new_one;
        new_one=Start;
        Start=new_one->next;
        free(new_one);
 
}
void RemoveNextOne(List *before)
{
    List *new_one;
    new_one=before->next;
    before->next=new_one->next;
    free(new_one);
}
void PrintList (List *Start)
{
    List *new_one;
    new_one=Start;
    if(new_one==NULL)
    {
        int f=2;
        printf("%p %d\n", f, new_one);
        printf("%d \n", new_one->data);
    }
    else
    {
        printf("%p", new_one->next);
    }
}
 
int main (void)
{
    int w=5;
    int c=4;
    int k=9;
        AddOnStart(*&Start, k);
        printf("%p \n", AddSomewhere(AddOnStart(*&Start, c), c));
 
 
        AddOnStart(*&Start, c);
        AddOnStart(*&Start, w);
        AddSomewhere(AddOnStart(*&Start, k), w);
        AddSomewhere(AddOnStart(*&Start, c), c);
        PrintList(*&Start);
        return 0;
} 

Header:

 #ifndef _LIST_H
#define _LIST_H

typedef struct List
{
	int data;
	struct List *next;

}List;


#endif
0

Serio o_O Przecież debugger OD RAZU powiedziałby gdzie jest problem...

    if(new_one==NULL)
    {
        int f=2;
        printf("%p %d\n", f, new_one); 
        printf("%d \n", new_one->data);
    }

Jeśli new_one JEST NULLEM to... wypisz adres wskaźnika (czyli 0) a potem zrób new_one->data o_O i czego się spodziewasz w takiej sytuacji? No ja widzę tutaj dereferencje wskaźnika który jest NULLem.

0

Poprawiłam funkcję, jednak nie wyswietla calej listy. Drukuje tylko jeden adres.

void PrintList (List *Start)
{
	List *new_one;
	new_one=Start;
	for(new_one=Start; new_one!=NULL; new_one=new_one->next)
	{
		printf("Adres: %p \n", new_one);
		printf("Wartosc elementu: %d \n", new_one->data);
	}
} 
0

Masz zbędną zmienną, wystarczy:

void PrintList (List *Start)
  {
   for(;Start;Start=Start->next) printf("Adres: %p\nWartosc elementu: %d\n",Start,Start->data);
  }

lista się nie "zepsuje", do dostajesz kopię.

Na 100% masz źle z dodawaniem.

0

Niebieski króliczku zaglądałeś(aś) do tematu
https://4programmers.net/Forum/C_i_C++/268882-lista_jednokierunkowa_zmiana_typu_danych
Tutaj masz działającą listę dla typu int
Bardziej przydatna byłaby gdybyś zamienił(a) typ danych int na void*

Jak przepisywałem listę bezpośrednio z Pascala
(gdzieś znalazłem hiszpańskojęzyczne video z modułem listy w Pascalu )
to też mi wyskakiwał segmentation fault

_

Tutaj też napisali jakąs tam listę w C

0

Nie wiem, czy to najlepszy i najbardziej optymalny sposób. Również się uczę.

Zrobiłbym to w ten sposób :

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

struct el
{
	int x;
	struct el* next;
};

void AddOnStart(struct el** node, int data)
{
	struct el* newNode = malloc(sizeof(struct el));
	newNode->x = data;
	if(*node == NULL)
	{
	    newNode->next = NULL;
		*node = newNode;
		return;
	}
	newNode->next = *node;
	*node = newNode;
}

void PrintElements(struct el *node)
{
	while(node != NULL)
	{
		printf("%d ", node->x);
		node = node->next;
	}
}

int main(void) {

	struct el* node = NULL;

	AddOnStart(&node, 4);
	AddOnStart(&node, 6);
	AddOnStart(&node, 9);
	AddOnStart(&node, 12);

	PrintElements(node);

	return 0;
}

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