Wyswietlenie listy jednokierunkowej

Skromny Mleczarz
2018-01-26 23:04
Skromny Mleczarz
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;
}

Pozostało 580 znaków

2018-01-26 23:09

Rejestracja: 3 lata temu

Ostatnio: 43 minuty temu

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ć.

Pozostało 580 znaków

Skromny Mleczarz
2018-01-26 23:11
Skromny Mleczarz
0

ok dzieki, zaraz wyprobuje.

Pozostało 580 znaków

Skromny Mleczarz
2018-01-27 18:27
Skromny Mleczarz
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;
}

Pozostało 580 znaków

2018-01-27 18:31

Rejestracja: 3 lata temu

Ostatnio: 43 minuty temu

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.

Pozostało 580 znaków

Skromny Mleczarz
2018-01-27 18:42
Skromny Mleczarz
0

zrobione dzieki, teraz potrzebuje wskazowki do funkcji

 void insertSorted (int val)

Pozostało 580 znaków

2018-01-27 18:59

Rejestracja: 3 lata temu

Ostatnio: 43 minuty temu

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);

Pozostało 580 znaków

2018-01-27 19:47

Rejestracja: 2 lata temu

Ostatnio: 2 lata temu

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

Pozostało 580 znaków

2018-01-27 19:54

Rejestracja: 3 lata temu

Ostatnio: 43 minuty temu

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.

Pozostało 580 znaków

2018-01-27 20:43

Rejestracja: 2 lata temu

Ostatnio: 2 lata temu

0

super, dzieki za pomoc :-)

Pozostało 580 znaków

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