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

Nie mogę przypisać wartości danych do wskaźnika struktury listy dwukierunkowej

Cloud VPS
+1 głos
822 wizyt
pytanie zadane 1 lutego 2022 w C i C++ przez BG23 Nowicjusz (130 p.)
edycja 1 lutego 2022 przez BG23
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

struct Dane{

    char *imie;
    char *nazwisko;
    int wiek;
    long pesel;    
    char plec;

    struct Dane* next;
    struct Dane* prev;
};

void wyswietl_liste_od_przodu(Dane *head)
{
    struct Dane *tymczasowy = head;

    while (tymczasowy!=NULL)
    {
        printf(" - /n");
        printf("%s, %s, %d, %ld, %c ", tymczasowy->imie, tymczasowy->nazwisko, tymczasowy->wiek, tymczasowy->pesel, tymczasowy->plec);
        tymczasowy = tymczasowy->next;
    }

}

void wyswietl_liste_od_tylu(Dane **head)
{
    Dane* tymczasowy = *head;

    while (tymczasowy->next != NULL) {
        tymczasowy = tymczasowy->next;
    }

    while (tymczasowy != *head) {
        printf("%d - ", tymczasowy->wiek);
        tymczasowy = tymczasowy->prev;
    }
    printf("%d - ", tymczasowy->wiek);
}

Dane* dodawanie_elementu(Dane *current){

     Dane* wynik  = (Dane*)malloc(sizeof(Dane));

     strcpy_s(wynik->imie, current->imie);

    wynik->prev = NULL;
    wynik->next = NULL;

    return wynik;

    free(wynik);

}
Dane* dodawanie_na_gore(Dane **head, Dane *do_dodania)
{
    do_dodania->next = *head;

    if (*head != NULL)
    {
        (*head)->prev = do_dodania;
    }
    
    *head = do_dodania;
    do_dodania->prev = NULL;
    return do_dodania;

}

Dane* znajdowanie(Dane* head, char *nazwisko)
{
    Dane* tmpp = head;

    while (tmpp != NULL)
    {
        
        if (strcmp(nazwisko, tmpp->nazwisko)==true)
        {
            return tmpp;
        }
        tmpp = tmpp->next;
    }

    return NULL;
}

void usuwanie_elementu(Dane **head, Dane *do_usuniecia)
{
    if (*head == do_usuniecia) {
        *head = do_usuniecia->next;

        if(*head != NULL)
        {
            (*head)->prev = NULL;
        }

    }
    else
    {
        
        if(do_usuniecia->next!=NULL)
        {
            do_usuniecia->next->prev = do_usuniecia->prev;
        }
        do_usuniecia->prev->next = do_usuniecia->next;
    }
    
    do_usuniecia->next = NULL;
    do_usuniecia->prev = NULL;

    return;
}

int main()
{

    Dane* head = NULL;
    Dane* tmp;
    Dane *current;
    
   
    int wybor = 0;
    int wybor2;
    char imie[20];
    char nazwisko[20];
    int wiek=0;
    long pesel=0;
    char plec;

    for (;;)
    {

        printf("Wybierz opcje: \n");
        printf("1.Dodaj osobe do listy: \n");
        printf("2.Wyszukaj osoby po nazwisku lub imieniu: \n");
        printf("3.Kasowanie osoby po nazwisku: \n");
        printf("4.Wyświetlanie listy: \n");
        printf("5.Odczytaj liste z pliku: \n ");
        printf("6.Zapisz liste do pliku: \n");
        printf("7.Sortuj liste po nazwisku: \n");
        printf("8.Zakończ program: \n");
        
        scanf_s("%d", &wybor);

        if (wybor == 1)
        {
            printf("Podaj dane: \n");
            printf("\n");
            gets_s(current->imie,sizeof(current->imie));
            scanf_s("%d", &wiek);
            

            tmp = dodawanie_elementu(current);
            dodawanie_na_gore(&head, tmp);

        }
        else if(wybor==2)
        {

            printf("Podaj wiek: \n");
            scanf_s("%s", nazwisko);

            tmp = znajdowanie(head, nazwisko);

            if (strcmp(nazwisko, tmp->nazwisko)==true)
            {
                printf("Znaleziono uzytkownika : %s", tmp->nazwisko);
                break;
            }
        

        }
        else if(wybor == 3)
        {
            //printf("Podaj wiek: \n");
            //scanf_s("%d", &wiekk);

            //tmp = znajdowanie(head, wiekk);
            //usuwanie_elementu(&head, tmp);

        }
        else if (wybor == 4)
        {
            printf("Wybierz: \n");
            printf("1.Od przodu:\n");
            printf("2.Od tylu: \n");
            scanf_s("%d", &wybor2);

            if (wybor2 == 1)
            {
                wyswietl_liste_od_przodu(head);
            }
            else if (wybor2 == 2)
            {
                wyswietl_liste_od_tylu(&head);
            }

        }
        else if (wybor == 8)
        {
            break;
        }

    
    }

}

 funckja dodawanie_elementu cały czas wyrzuca mi błąd że wynik jest NULLEM i nie przypisuje wartości , w mainie przy ifie (wybor==1) podaje wartości z klawi które maja isc do funkcji dodawanie elementu

komentarz 1 lutego 2022 przez Marak123 Stary wyjadacz (11,190 p.)
Wybierz C++ "ISO C++ 20" jeżeli nie to 17

A C wybierz "ISO C17"

I w tedy skompiluj i zobacz błędy
komentarz 1 lutego 2022 przez tkz Nałogowiec (42,040 p.)

Standard nie ma nic do rzeczy. 


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
 
struct Dane{
 
    char *imie;
    char *nazwisko;
    int wiek;
    long pesel;    
    char plec;
 
    struct Dane* next;
    struct Dane* prev;
};
 
void wyswietl_liste_od_przodu(struct Dane *head)
{
    struct Dane *tymczasowy = head;
 
    while (tymczasowy!=NULL)
    {
        printf(" - /n");
        printf("%s, %s, %d, %ld, %c ", tymczasowy->imie, tymczasowy->nazwisko, tymczasowy->wiek, tymczasowy->pesel, tymczasowy->plec);
        tymczasowy = tymczasowy->next;
    }
 
}
 
void wyswietl_liste_od_tylu(struct Dane **head)
{
    struct Dane* tymczasowy = *head;
 
    while (tymczasowy->next != NULL) {
        tymczasowy = tymczasowy->next;
    }
 
    while (tymczasowy != *head) {
        printf("%d - ", tymczasowy->wiek);
        tymczasowy = tymczasowy->prev;
    }
    printf("%d - ", tymczasowy->wiek);
}
 
struct Dane* dodawanie_elementu(struct Dane *current){
 
    struct Dane* wynik  = (struct Dane*)malloc(sizeof(struct Dane));
 
    strcpy(wynik->imie, current->imie);
 
    wynik->prev = NULL;
    wynik->next = NULL;
 
    return wynik;
 
    free(wynik);
 
}
struct Dane* dodawanie_na_gore(struct Dane **head, struct Dane *do_dodania)
{
    do_dodania->next = *head;
 
    if (*head != NULL)
    {
        (*head)->prev = do_dodania;
    }
     
    *head = do_dodania;
    do_dodania->prev = NULL;
    return do_dodania;
 
}
 
struct Dane* znajdowanie(struct Dane* head, char *nazwisko)
{
    struct Dane* tmpp = head;
 
    while (tmpp != NULL)
    {
         
        if (strcmp(nazwisko, tmpp->nazwisko)==true)
        {
            return tmpp;
        }
        tmpp = tmpp->next;
    }
 
    return NULL;
}
 
void usuwanie_elementu(struct Dane **head, struct Dane *do_usuniecia)
{
    if (*head == do_usuniecia) {
        *head = do_usuniecia->next;
 
        if(*head != NULL)
        {
            (*head)->prev = NULL;
        }
 
    }
    else
    {
         
        if(do_usuniecia->next!=NULL)
        {
            do_usuniecia->next->prev = do_usuniecia->prev;
        }
        do_usuniecia->prev->next = do_usuniecia->next;
    }
     
    do_usuniecia->next = NULL;
    do_usuniecia->prev = NULL;
 
    return;
}
 
int main()
{
 
    struct Dane* head = NULL;
    struct Dane* tmp;
    struct Dane *current;
     
    
    int wybor = 0;
    int wybor2;
    char imie[20];
    char nazwisko[20];
    int wiek=0;
    long pesel=0;
    char plec;
 
    for (;;)
    {
 
        printf("Wybierz opcje: \n");
        printf("1.Dodaj osobe do listy: \n");
        printf("2.Wyszukaj osoby po nazwisku lub imieniu: \n");
        printf("3.Kasowanie osoby po nazwisku: \n");
        printf("4.Wyświetlanie listy: \n");
        printf("5.Odczytaj liste z pliku: \n ");
        printf("6.Zapisz liste do pliku: \n");
        printf("7.Sortuj liste po nazwisku: \n");
        printf("8.Zakończ program: \n");
         
        scanf("%d", &wybor);
 
        if (wybor == 1)
        {
            printf("Podaj dane: \n");
            printf("\n");
            gets(current->imie);
            scanf("%d", &wiek);
             
 
            tmp = dodawanie_elementu(current);
            dodawanie_na_gore(&head, tmp);
 
        }
        else if(wybor==2)
        {
 
            printf("Podaj wiek: \n");
            scanf("%s", nazwisko);
 
            tmp = znajdowanie(head, nazwisko);
 
            if (strcmp(nazwisko, tmp->nazwisko)==true)
            {
                printf("Znaleziono uzytkownika : %s", tmp->nazwisko);
                break;
            }
         
 
        }
        else if(wybor == 3)
        {
            //printf("Podaj wiek: \n");
            //scanf("%d", &wiekk);
 
            //tmp = znajdowanie(head, wiekk);
            //usuwanie_elementu(&head, tmp);
 
        }
        else if (wybor == 4)
        {
            printf("Wybierz: \n");
            printf("1.Od przodu:\n");
            printf("2.Od tylu: \n");
            scanf("%d", &wybor2);
 
            if (wybor2 == 1)
            {
                wyswietl_liste_od_przodu(head);
            }
            else if (wybor2 == 2)
            {
                wyswietl_liste_od_tylu(&head);
            }
 
        }
        else if (wybor == 8)
        {
            break;
        }
 
     
    }
 
}

Nie używam kompilatora od MS, więc mogą być jakieś warningi. 

komentarz 1 lutego 2022 przez BG23 Nowicjusz (130 p.)
No więc zrobiłem tak:
w main:

char imie[20];

            printf("\n");
            scanf_s("Imie: %s", &imie);

 

 

I dalej jest ten  sam błąd , linijka 63 wynik wynosi NULL
komentarz 1 lutego 2022 przez Oscar Nałogowiec (29,360 p.)
W strukturze Dane pola tekstowe (imie nazwisko) masz zadeklarowane jako same wskaźniki, a nie allokujesz im pamięci. strcpy() nie ma gdzie wpisac danych. Możesz użyć strdup() - ta funkcja allokuje pamięć i robi kopię napisu, tylko że potem musisz gdzieś tą pamięć zwolnić.

Skoro już używasz strcpy to po prostu zmień deklaracje ze wskaznika na tablicę jakiejś sensownej wielkości a strcpy zmień na strncpy.
komentarz 1 lutego 2022 przez BG23 Nowicjusz (130 p.)
okej dzięki

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
4 odpowiedzi 565 wizyt
0 głosów
1 odpowiedź 1,857 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
1 odpowiedź 402 wizyt

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,909 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

Kursy INF.02 i INF.03
...