Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Sonstige Fragen (http://www.informatikerboard.de/board/board.php?boardid=25)
--- Kellerspeicher C (http://www.informatikerboard.de/board/thread.php?threadid=2676)


Geschrieben von Grule9 am 08.12.2015 um 15:34:

  Kellerspeicher C

Meine Frage:
Ich möchte einen Kellerspeicher in C bauen. Die Zahlen (integer reichen) sollen im Heap gespeichert werden, deshalb möchte ich Zeiger benutzen. Bei push(x) soll die Zahl x im Heap gespeichert werden und bei pop() die letzte gespeicherte Zahl aus push() ausgegegeben werden.

Meine Ideen:
Idee bei der Funktion push(x):

int push(x){
*zeiger = malloc(sizeof(int);
*zeiger = x;
}

Wie kann ich dieses x nun in einer anderen Funktion pop() aufrufen? ich habe *zeiger ja nur in push.

Bisheriger Quelltext:

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


int push(x){
int *zeiger = malloc(sizeof(int));
*zeiger = x;
}


int pop(void){
printf("%d\n", ???);
}


int main(void) {
push(5);
push(20);
pop();

return EXIT_SUCCESS;
}



Geschrieben von eulerscheZahl am 08.12.2015 um 17:28:

 

Sollte laufen. Es fehlen noch Prüfungen, ob malloc Speicher reservieren kann und ob bei pop noch etwas auf dem Stack steht.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
#include <stdio.h>
#include <stdlib.h>

struct entry {
	int value;
	struct entry* prev;
};

struct entry* push(struct entry* top, int value) {
	struct entry* newEntry = (struct entry*)malloc(sizeof(struct entry));
	newEntry->value = value;
	newEntry->prev = top;
	top = newEntry;
	return newEntry;
}

int pop(struct entry** top) {
	int value = (*top)->value;
	*top = (*top)->prev;
	return value;
}

int main() {
	struct entry* stack = (struct entry*)malloc(sizeof(struct entry));
	stack = push(stack, 1);
	stack = push(stack, 2);
	stack = push(stack, 3);
	printf("%d\n", pop(&stack));
	printf("%d\n", pop(&stack));
	printf("%d\n", pop(&stack));
}



Geschrieben von Grul9 am 08.12.2015 um 18:25:

 

Dankeschön smile



Geschrieben von Karlito am 09.12.2015 um 14:19:

 

Hallo Grul9,

mein Ansatz ist ein wenig schwieriger zu verstehen, sollte aber für's Lernen gut sein. Es ist noch eher am echten Stack angelehnt, da hier auch mit einem Adressbereich gearbeitet wird und nicht mit einer verketteten Liste. Auch hier alles ohne Prüfung.

main.c:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
#include <stdlib.h>
#include <stdio.h>

#include "stack.h"

int main(int argc, char **argv){
	int i;

	init(100);

	for (i=0; i<100; i++){
		push(i);
	}

	for (i=0; i<100; i++){
		printf("%d, ", pop());
	}
	printf("\n");
	
	destroy();

	return 0;
}


stack.h
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#ifndef _STACK_H_
#define _STACK_H_

void init(int);
void destroy();
void push(int);
int pop();

#endif //_STACK_H_


stack.c:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
#include <stdio.h>
#include <stdlib.h>

#include "stack.h"

static int *basePointer = NULL;
static int *stackPointer = NULL;

void init(int elements){
	stackPointer = basePointer = (int *)realloc(basePointer, elements * sizeof(int));
}

void destroy(){
	free(basePointer);
	stackPointer = basePointer = NULL;
}


void push(int value){
	*(stackPointer++) = value;
}

int pop(){
	return *(--stackPointer);
}


Falls es dazu Fragen gibt, gerne hier stellen.

Gruß,

Karlito


Forensoftware: Burning Board, entwickelt von WoltLab GmbH