lista jednokierunkowa

0

Proszę o pomoc w znalezieniu błędów

#include <stdio.h>
#include <stdlib.h>
#include "fun_stack.h"
#include <string.h>

static strucstack stack = NULL;
static char  tmpchar[BUF];

int top_of_funstack( void ) 
{
    strucstack tmp = stack;
    if (stack == NULL)
    {
        fprintf(stderr, "Stos jest pusty");
        exit(EXIT_FAILURE);
    }
    while (tmp->next != NULL )
            tmp = tmp->next;
        

    return tmp->levelint;  
} /* zwraca par_level - "zagłębienie nawiasowe" przechowywane na szczycie */
void put_on_fun_stack( int par_level, char *funame )
{

    if (stack == NULL) {
        strucstack nw = malloc( sizeof *nw );
        nw->levelint = par_level;
        nw->funnamechar = malloc((strlen(funame)+1) * sizeof * (nw->funnamechar));
        if(nw->funnamechar == NULL) {
            printf("Za mało pamięci");
            exit(EXIT_FAILURE);
        }
        strcpy(nw->funnamechar, funame);
        nw->next = NULL;
        stack = nw;
    }
    else
    {
        strucstack tmp =stack;
        while (tmp->next != NULL )
            tmp = tmp->next;
        tmp->next = malloc (sizeof * (tmp->next));
            if(tmp->next == NULL) {
                printf("Za mało pamięci");
                exit(EXIT_FAILURE);
            }
        tmp->next->levelint = par_level;
        tmp->next->funnamechar = malloc( (strlen(funame) + 1 ) * sizeof * (tmp->next->funnamechar));
            if(tmp->next->funnamechar == NULL) {
                printf("Za mało pamięci");
                exit(EXIT_FAILURE);
            }
        strcpy(tmp->next->funnamechar, funame);
        tmp->next->next= NULL;
    }
}

    /* odkłada na stos parę (funame,par_level) */
char *get_from_fun_stack( void )
{
   strucstack tmp = stack;
    if (stack == NULL)
    {
        fprintf(stderr, "Stos jest pusty");
        exit(EXIT_FAILURE);
    }
    while (tmp->next != NULL )
            tmp = tmp->next;
    free(tmp->next);
    strcpy(tmpchar, tmp->funnamechar);
    free(tmp->funnamechar);
    tmp = NULL;

    return tmpchar;  
} /* usuwa z wierzchołka parę (funame,par_level), zwraca zdjętą funame

 */
int main()
{
	int a;
	int numer;
	int test=1;
	char napis[200];
	while (test){
		scanf( "%d", &numer);
		switch (numer){
		case 1: 
			scanf( "%d %s", &a, napis);
			put_on_fun_stack(a,napis);
			break;
		case 2: printf("%d \n",top_of_funstack());
			break;
		case 3: printf("%s \n",get_from_fun_stack());
			break;
		default: test = 0;
			break;
		}
    }
    
return 0;
}
#ifndef _FUN_STACK_H_IS_INCLUDED_
#define _FUN_STACK_H_IS_INCLUDED_

#define BUF 1000 /* Maksymalna wartość kopiowanego stringa */

typedef struct e {
    int levelint;
    char *funnamechar;
    struct e *next;
} * strucstack;

int top_of_funstack( void );  /* zwraca par_level - "zagłębienie nawiasowe" przechowywane na szczycie */
void put_on_fun_stack( int par_level, char *funame ); /* odkłada na stos parę (funame,par_level)*/
char *get_from_fun_stack( void ); /* usuwa z wierzchołka parę (funame,par_level), zwraca zdjętą funame*/

#endif
0

ok uwaga POMAGAM

wez debugger i idz linijka po linijce i zobacz co jest zle (pomoc adekwatna do pytania)

1
  1. Pomyliła ci się zasada tworzenia stosu, po wrzuceniu nowego elementu ten nowy element musi być na górze (nie na dole)
  2. Poczytaj o zasadzie DRY i zrób sobie funkcje jak tu: http://4programmers.net/Forum/1084469 owszem to C++ ale zasada ta że
  3. Poczytaj o funkcji strdup
  4. Do tych funkcji przekazuj adres struktury zawierającej jedynie wskaźnik do strucstack ewentualnie podwójny wskaźnik do strucstack (tak jak zrobiłeś nie da się mieć dwóch stosów).
    W sumie - wywalić i napisać od nowa.
0

Mam taki oto kod:
Wiem że nie powinienem powtarzać fragmentów kodu i użyć procedury.
Teraz wydaje mi się bardziej to przypomina stos.
Myślałem że jeśli deklaruje wskaźnik do tablicy znaków to muszę mu za alokować pamięć ale tak też działa wiec jak powinno być poprawnie ?
Lub używać funkcji podanej wyżej strdup lub strcpy teraz też działa kopiowanie wiec też nie wiem jak powinno być ?
Jak powinienem poprawić funkcję get_from_fun_stack ? Jeśli coś wczytam na stos a później chce za pomocą tej funkcji zabierać element z góry to cały czas wyświetla mi element z góry ale jak np wczytam 3 elementy to po trzech wywołaniach tej funkcji podaje że stos jest pusty.

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

static stack_t * stack = NULL;

int top_of_funstack( void )
{
	if( stack == NULL ) 
	{
		fprintf(stderr, "ERROR: The stack is empty!\n");
		exit(-1);
	}

	return stack->par_level;
}

void put_on_fun_stack( int par_level, char *funame )
{
	if( stack == NULL )
	{
		stack = malloc(sizeof(struct stack_elem));
		stack->next = NULL;
		if( stack == NULL )
		{
			fprintf(stderr, "ERROR: Can't malloc new stack element!\n");
			exit(-2);
		}
	}
	else
	{
		struct stack_elem * element = malloc(sizeof(struct stack_elem));
		if( element == NULL )
		{
			fprintf(stderr, "ERROR: Can't malloc new stack element!\n");
			exit(-2);
		}

		element->next = stack;
	
		stack = element;
	}	

	stack->par_level = par_level;
	stack->funame = funame;
}

char * get_from_fun_stack( void )
{
	if( stack == NULL )
	{
		fprintf(stderr, "ERROR: The stack is empty!\n");
		exit(-1);
	}
	
	char * funame = stack->funame;
	
	struct stack_elem * tmp = stack;
	stack = stack->next;

	free(tmp);

	return funame;
}

int main()
{
	int a;
	int numer;
	int test=1;
	char napis[200];
	while (test){
		scanf( "%d", &numer);
		switch (numer){
		case 1: 
			scanf( "%d %s", &a, napis);
			put_on_fun_stack(a,napis);
			break;
		case 2: printf("%d \n",top_of_funstack());
			break;
		case 3: printf("%s \n",get_from_fun_stack());
			break;
		default: test = 0;
			break;
		}
    }
    
return 0;
}
1
  1. Tak nie działa, tak wszystkie elementy stosu mają ten sam napis, taki sam jak ostatnio wprowadziłeś, użyj strdup
  2. strcpy razem z malloc może być ale strdup krótszy, prostszy i na 100% poprawny
  3. Wyjaśnienie w pkt 1.
    Z 4-ch punktów tylko jeden zastosowałeś?! Ten kod jeszcze na nic nie wygląda - ten przypominający stos będzie zajmował połowę tego kodu.

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