Problema con implementazione stack

Se avete dubbi o domande sulla programmazione in generale, fatele qui
Rispondi
armando
Novello Arciere
Messaggi: 28
Iscritto il: 6 gennaio 2014, 16:05
Località: Napoli

Problema con implementazione stack

Messaggio da armando » 30 maggio 2016, 16:24

Salve a tutti sapete dirmi dove sta l'errore in questo codice?Sto impazzendo :( grazie anticipatamente.

Stack.c

Codice: Seleziona tutto

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

struct Stack{
	int info;
	struct Stack *link;
}*head,*temp,*new_node,*first;

void create(struct Stack *head){		
	head=NULL;
}

int empty(struct Stack *head){	
	if(head==NULL){	
		return 1;
	}
	else{
		return 0;
	}
}

void push(struct Stack *head,int elem){
	if(!empty(head)){
		new_node=(struct Stack *)malloc(sizeof(struct Stack));
		new_node->info=elem;
		new_node->link=head;
		head=new_node; 
	}
	else{
		head->link=NULL;
		head->info=elem;
		temp=NULL;
	}
}

int view(struct Stack *head){
	first=head;
	while(head!=NULL){
		printf("%d\n",first->info);
		first=first->link;
	}	
}

int pop(struct Stack *head){
	int elem;
	temp=NULL;		
	temp=head;
	if(temp == NULL){	
		printf("Stack Vuoto!\n");
	}
	else{		
		elem=temp->info;
		free(head);
		temp=temp->link;
		head= temp;
		return elem;
		temp=NULL;
	}			
}
stack.h

Codice: Seleziona tutto

int empty();

void create();

void push();

int pop();

int view();
main.c

Codice: Seleziona tutto

#include<stdio.h>
#include"stack.h"

int main(){
	struct Stack *pila1;
	create(&pila1);
	int e=5;
	push(&pila1,e);
	push(&pila1,15);
	int a;
	a=pop(&pila1);
	int b=pop(&pila1);
	printf("%d\n",a);
	printf("%d\n",b);	
}

Avatar utente
TheSaint
Robin Hood
Messaggi: 7919
Iscritto il: 8 settembre 2007, 7:43
Architettura: x86_64 (64bit)
Località: davanti al computer

Re: Problema con implementazione stack

Messaggio da TheSaint » 30 maggio 2016, 18:19

Beh, non vedo la funzione create().
F the saint 13 anni da questo forum ;)
Gli uomini consumano il pianeta, almeno due di queste cose si possono ridurre.

armando
Novello Arciere
Messaggi: 28
Iscritto il: 6 gennaio 2014, 16:05
Località: Napoli

Re: Problema con implementazione stack

Messaggio da armando » 30 maggio 2016, 20:01

Ciao TheSaint, scusa in che senso non vedi la funzione create()? Comunque ho risolto modificando il codice in questo modo

Codice: Seleziona tutto

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

struct Stack{
	int info;
	struct Stack *link;
}*head;

typedef struct Stack *stack;
void create(stack *head){		
	*head=(struct Stack *)malloc(sizeof(struct Stack));	
	*head==NULL;
}

int empty(stack *head){	
	if(*head==NULL){	
		return 1;
	}
	else{
		return 0;
	}
}

void push(stack *head,int elem){
	struct Stack *new_node;
	new_node=(struct Stack *)malloc(sizeof(struct Stack));	
	if(!empty(head)){
		new_node->info=elem;
		new_node->link=*head;
		*head=new_node; 
	}
	else{
		(*head)->link=NULL;
		(*head)->info=elem;		
	}
}

int view(stack *head){
	struct Stack *first;
	first=(struct Stack *)malloc(sizeof(struct Stack));	
	first=*head;
	while(first->link!=NULL){
		printf("%d\n",first->info);
		first=first->link;
	}	
}

int pop(stack *head){
	int elem;
	struct Stack *temp;
	temp=NULL;		
	temp=*head;
	if(temp == NULL){	
		printf("Stack Vuoto!\n");
	}
	else{		
		elem=temp->info;
		temp=temp->link;
		free(*head);
		*head=temp;
		return elem;
		temp=NULL;
	}			
}
Pero' adesso ho un'altro problema quando faccio il merge tra due stack, un solo valore non me lo copia e, nel ciclo while sembra che esca dopo la condizione che gli ho dato, non quando si verifica.Adesso posto il codice del main. Grazie ancora anticipatamente

Codice: Seleziona tutto

#include<stdio.h>
#include"stack.h"

int main(){
	typedef struct Stack *stack;
	stack *pila1,*pila2,*pila3;
	int p1,p2;
	create(&pila1);
	create(&pila2);
	create(&pila3);
	push(&pila2,51);
	push(&pila2,42);
	push(&pila2,18);
	push(&pila2,15);
	push(&pila1,74);
	push(&pila1,71);
	push(&pila1,58);
	push(&pila1,44);
	push(&pila1,17);
	push(&pila1,16);
	push(&pila1,11);
	push(&pila1,8);	
	p1=pop(&pila1);
	p2=pop(&pila2);	
	while((!empty(&pila1)) && (!empty(&pila2))){			
		if(p1 < p2){
			push(&pila3,p1);
			p1=pop(&pila1);			
		}
		else if(p1 > p2){
			push(&pila3,p2);
			p2=pop(&pila2);
			}	
	}
	if(empty(&pila1)){
		while(!empty(&pila2)){		
			push(&pila3,pop(&pila2));
		}
	}
	else if(empty(&pila2)){
		while(!empty(&pila1)){
			push(&pila3,pop(&pila1));
		}
	}
	view(&pila3);		
}
Questo invece e' l'output dell'esecuzione

Codice: Seleziona tutto

root /home/esercizi # ./main
0
74
71
51
44
42
18
17
16
15
11
8

Avatar utente
TheSaint
Robin Hood
Messaggi: 7919
Iscritto il: 8 settembre 2007, 7:43
Architettura: x86_64 (64bit)
Località: davanti al computer

Re: Problema con implementazione stack

Messaggio da TheSaint » 31 maggio 2016, 8:11

armando ha scritto:Ciao TheSaint, scusa in che senso non vedi la funzione create()?
Ora vedo che c'è una dichiarazione di create, nella struct stack.
Poi il resto sono ai primordi del linguaggio e faccio fatica a comprenderlo. In particolare manca molto i commenti, molto utili quando si presenta il codice ad altri.
F the saint 13 anni da questo forum ;)
Gli uomini consumano il pianeta, almeno due di queste cose si possono ridurre.

Rispondi