Operacje na stosie. Co to za komunikat ?

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


/*Dynamiczna lista jednokierunkowa-stos*/
typedef struct lista
{
    int liczba;
    struct elem *nastepny;
} lista;


/************************************************/
/*Funkcja dodajaca liczbe na stos*/

void push(lista **stos, int element)
{
    lista* biezacy;
    if((biezacy=(lista*)malloc(sizeof(lista)))==NULL)
        return ;
    else
        {biezacy -> liczba=element;
            biezacy->nastepny=*stos;
            *stos=biezacy;
        }
}

/*************************************************/
/*Funkcja zdejmująca element ze szczytu stosu*/

void pop(lista **stos,int element)
{
    lista *tmp;
    if(stos!=NULL)
    {
        tmp=*stos;
        element=tmp->liczba;
        *stos=tmp->nastepny;
        free(tmp);
        return ;
    }
    else
    {
        fprintf(stderr,"Blad brak danych\n");
    }
}

/*************************************************/
/*Funkcja wyswietlajaca na wyjscie cały stos*/

void print(lista *stos)
{
    if(stos==NULL)
        printf("Na stosie nie ma zadnych liczb\n");
    else
        while (stos!=NULL)
        {
            printf("%d\n",stos->liczba);
            stos=stos->nastepny;
        }
    
}

/**************************************************/
/*Funkcja sprawdzająca czy stos nie jest pusty*/
void empty(lista *stos)
{
    if(stos==NULL)
        printf("Stos jest pusty\n");
    else
        printf("Stos nie jest pusty\n");
}

/**************************************************/




int main()
{
    lista *stos=NULL;
    char wybor[2]; /* jest jeszcze znak konca linii \0 */
    int element=0;
    
    printf("Dostepne operacje:\n ? - wyswietl liczby znajdujace sie na stosie\n p - dodaj liczbe na szczyt stosu\n # - usun liczbe ze szczytu stosu\n e - sprawdz czy stos jest pusty\n q - wyjscie z programu\n");

    while(wybor[0]!='q')
    {
        printf("Twoj wybor: ");
        scanf("%s",&wybor[0]);
        switch(wybor[0])
        {
            case '?':
                print(stos);
                break;
            case 'p':
                printf("Podaj liczbe:");
                scanf ("%d",&element);
                push(&stos,element);
                break;
            case '#':
                pop(&stos,element);
                break;
            case 'e':
                empty(stos);
                break;
        }
    }
    printf("Program zakonczyl dzialanie\n");
    return 0;
}

Ktoś wie czemu przy takich fragmentach kodu jak:

 biezacy->nastepny=*stos;

*stos=tmp->nastepny;

stos=stos->nastepny;

pojawia mi się komunikat: Incompatible pointer types assigning to 'lista ' (aka 'struct lista') from 'struct elem *'
???????????

0

Wujek google przetłumaczy wszystko, nawet język programowania ;)

3

Masz błąd koncepcyjny. Co to jest elem i gdzie jest zadeklarowane.
Lista zawiera elementy a nie wskaźniki na listę (co chciałeś zrobić w kodzie).

Po prostu albo zrób tę strukturę albo zmień strukturę lista na wskaźnik na następny int.

Widzisz.. wpisałem w WG (Wujek Goole) hasło: "list c implementation". Pierwszy odnośnik...
http://www.learn-c.org/en/Linked_lists

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