• 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

Object Storage Arubacloud
+1 głos
375 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,000 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,290 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 342 wizyt
0 głosów
1 odpowiedź 1,573 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
1 odpowiedź 267 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...