Wyswietlenie listy jednokierunkowej

0

Witam,
Probuje wyswietlic liste jednokierunkowa, ale cos to nie dziala jak trzeba, moze ktos naprowidzi mnie w czym tkwi blad :)


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

int main(){
    struct node {
        int data;
        struct node *next;
    };
    struct node *mkNode(int val){
         struct node *node = NULL;
         if((node = malloc(sizeof (struct node))) != NULL){
                node->data = val;
                node->next = NULL;
         }
             return node;
    }
    struct node *a = mkNode(3);
    struct node *b = mkNode(5);
    a->next = b;


    void printList(void){
        struct node *tmp = a;
        printf("(");
        while(tmp != NULL){
                printf(" %d", tmp->data);
                tmp = tmp->next;
        }
        printf(" )\n");
    }

    return 0;
}
2

Popraw ten kod bo masz funkcje w funkcji.
Powinieneś mieć mniej/więcej taką strukturę:

struct node
{
	int data;
	struct node *next;
};

struct node *mkNode(int val)
{
	...
}

void printList(...)
{
	...
}

int main()
{
	...
}

Poza tym nie zwalniasz pamięci za pomocą free - a powinieneś.

Po tym jak to wszystko pozmieniasz będzie działać.

0

ok dzieki, zaraz wyprobuje.

0

No i tak wyglada ta proba z dodatkiem nowej funkcji, ale niestety caly czas z bledami


#include <stdio.h>
#include <stdlib.h>
struct node {
        int data;
        struct node *next;
};
struct node *mkNode(int val){
         struct node *node = NULL;
         if((node = malloc(sizeof (struct node))) != NULL){
                node->data = val;
                node->next = NULL;
         }
             return node;
}
struct node *head;

void insertSorted (int val) {

        if(head == NULL){
                head = mkNode(val);
                return;
        }
         else if(head->data >= val){
                struct node *newNode = mkNode(val);
                newNode->next = head;
                head = newNode;
                return;
        }
        else{
                struct node *p = head;
                while(p->next != NULL && p->next->data < val){
                    p = p->next;
                }
                struct node *newNode = mkNode(val);
                newNode->next = p->next;
                p->next = newNode;
        }
}

void printList(void){
    struct node *tmp = head;
    printf("(");
    while(tmp != NULL){
        printf(" %d", tmp->data);
    tmp = tmp->next;
    }  printf(" )\n");
}


int main(){
        int n;
        struct node *a = mkNode(3);
        struct node *b = mkNode(5);
        struct node *c = mkNode(8);
        a->next = b;
        b->next = c;
        
        printList();
        printf("p = ");
        scanf("%d", &n);
        insertSorted(n);
        printList();
 
    return 0;
}
1

Nie używaj zmiennych globalnych bo tylko przysporzy to problemów
Wywal:

struct node *head;

A printList zamień na:

void printList(struct node *head) { ... }

Wtedy musisz przekazać pierwszy element do tej funkcji czyli a.

0

zrobione dzieki, teraz potrzebuje wskazowki do funkcji

void insertSorted (int val)

1

Cały czas zapominasz o zwolnieniu pamięci za pomocą free.

Aby wstawianie elementu jako pierwszy z listy musisz przekazać wskaźnik na wskaźnik. Aby tego dokonać potrzeba zmodyfikować funkcję insertSorted w poniższy sposób:

void insertSorted(struct node **head, int val)
{
    if (*head == NULL)
    {
        *head = mkNode(val);
        return;
    }
    else if ((*head)->data >= val)
    {
        struct node *newNode = mkNode(val);
        newNode->next = *head;
        *head = newNode;
        return;
    }
    else
    {
        struct node *p = *head;
        while (p->next != NULL && p->next->data < val)
        {
            p = p->next;
        }
        struct node *newNode = mkNode(val);
        newNode->next = p->next;
        p->next = newNode;
    }
}

Wywołanie jej powinno wyglądać tak:

insertSorted(&a, n);
0

dziekuje pieknie za pomoc, do zwolnienia pamici taka minifunkcja:

void freeMem(struct node *head){
  if(head){
    freeMem(head->next);
    free(haed);
  }
} 

i w ```
main

```c
freeMem(a);

ok?
Do programmu chce dodac rowniez funcje koniecznie za pomoca ```
struct

```c
struct node* Reverse(struct node *head){
    struct node* prev   = NULL;
    struct node* current = head;
    struct node* next;
    while (current != NULL){
            next  = current->next;
            current->next = prev;
            prev = current;
            current = next;
  }
    head = prev;
   return head;
}

tylko nie wiem czy tak jest poprawnie i jak to przekazac do funkcji printList

1

Funkcja do zwalniania pamięci jest ok.

Co do Reverse to zwraca ona wskaźnik więc mógłbyś zrobić tak:

// W main()
struct node *reversed = Reverse(a);
printList(reversed);

BTW - trzymaj się jednej konwencji, chodzi mi o to że większość nazw u ciebie jest camelCase za wyjątkiem Reverse gdzie używasz PascalCase.

0

super, dzieki za pomoc :-)

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