Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Rekursives Suchen in Queue » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Rekursives Suchen in Queue
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Rekursives Suchen in Queue Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo zusammen,

ich hätte wiedermal eine Frage bezüglich einer Aufgabe in meinem Studium und zwar soll ich in einer Queue Rekursiv nach einem Element gesucht werden kann und dabei darf die Queue beim Suchen zerstört werden.

Vielleicht könnt ihr mir weiterhelfen.

Danke schon mal für eure Hilfe.


Vg,

Chris



Meine Ideen:
Wir haben bereits Funktionen in der Vorlesung implementiert:

append(); -> fügt ein Element hinten an der Queue an
top(); -> liefert erstes Element der Queue
rest(); -> entfernt vorderstes Element aus der Queue
isempty(); -> prüft ob Queue leer ist

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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
// Queue.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int puffergroesse = 20;

void queueerror(char *c)
{
	printf_s("Queuefehler: ");
	printf_s("%s", c);
	printf_s("\n");
	system("PAUSE");
	exit(1);
};

typedef struct queue /* Queue, implementiert als Ringpuffer mit 20 Elementen */
{
	int puffer[puffergroesse]; /* Ringpuffer */
	unsigned int anfang; /* Index des ersten Elements der Queue im Ringpuffer   */
	unsigned int ende;   /* Index des letzten Elements der Queue im Ringpuffer  */
	unsigned int anzahl; /* Anzahl der aktuell im Puffer gespeicherten Elemente */
	/* Anzahl muss gemerkt werden, da sonst voller Puffer  */
	/* nicht von einem leeren Puffer unterschieden werden  */
	/* kann                                                */
};

queue* emptyqueue() /* Erzeugen einer leeren Queue auf dem Heap*/
{
	queue *q = (queue *)malloc(sizeof(queue));
	/* Index für Anfang und Ende und Anzahl auf 0 setzen */
	if (q == NULL)
	{
		queueerror("Speichermangel, Anlegen einer neuen Queue auf Heap nicht möglich");
		return NULL;
	}
	else {
		q->anfang = 0;
		q->ende = 0;
		q->anzahl = 0;
		return q;
	};
};

int isempty(queue *q) /* Prüfen ob Queue leer     */
{
	if (q == NULL)
	{
		queueerror("isempty aufgerufen mit Nullpoiner");
		return 0;
	}
	else {q->anzahl==0;
		return 0;
	}
};

queue* rest(queue *q) /* Funktion, die vorderstes Element aus Queue entfernt */
{
	if (q == NULL)
	{
		queueerror("Rest mit Nullpointer aufgerufen");
		return NULL;
	}
	else if (isempty(q))
	{
		queueerror("Rest mit leerer Queue aufgerufen");
		return q;
	}
	else { q->anfang = (q->anfang+1)%puffergroesse;
	q->anfang--;
		return q;
	};
};

queue* append(queue *q, int i) /* fügt i hinten an der Queue an */
{
	if (q == NULL)
	{
		queueerror("Append mit Nullpointer aufgerufen");
		return NULL;
	}

	else if (q->anzahl == puffergroesse)
	{queueerror("Append mit vollem Puffer aufgerufen");
	return q; }
	else {
		q->puffer[q->ende] = i;
		q->ende = (q->ende + 1) % puffergroesse;
		q->anzahl++;
		return q;
	};
};

int top(queue *q) /* liefert erstes Element der Queue */
{
	if (q == NULL)
	{
		queueerror("Top mit Nullpointer aufgerufen");
		return 0;
	}
	else if (isempty(q))
	{
		queueerror("Top mit leerer Queue aufgerufen");
		return 0;
	}
	else {
		return q->puffer[q->anfang];
	};
};

void print(queue *q)
{
	if (q == NULL)
		queueerror("Queueausgabe mit Nullpointer aufgerufen");
	else if (isempty(q))
		printf_s("Queue ist leer\n");
	else { /* Hier Code einfügen und printf( ... ) entfernen*/
		printf_s("die Funktion wurde noch nicht implementiert\n");
	};
};

void loeschequeue(queue *q)
{
	if (q != NULL) free(q);
};


void queuetest()
{
	char c = 'x';
	int i;
	queue* q = NULL;
	while ((c != 'e') && (c != 'E'))
	{
		printf_s("Bitte Queueoperation eingeben: l = leere Queue, r = Rest, a = Append, t = Top,\n");
		printf_s("                               i = Isemepty, p = Ausgabe, e = Ende\n");
		fflush(stdin);
		c = getchar();
		switch (c)
		{
		case 'e':
		case 'E': break;
		case 'a':
		case 'A': printf_s("Append gewaehlt\n");
			printf_s("Bitte Zahl eingeben\n");
			scanf_s("%d", &i);
			q = append(q, i);
			break;
		case 'r':
		case 'R': printf_s("Rest gewaehlt\n");
			q = rest(q);
			break;
		case 'l':
		case 'L': printf_s("Erzeugen einer leeren Queue gewaehlt\n");
			loeschequeue(q);
			q = emptyqueue();
			break;
		case 't':
		case 'T': printf_s("Top gewaehlt\n");
			i = top(q);
			printf_s("%s%d\n", "Erstes Element der Queue: ", i);
			break;
		case 'i':
		case 'I': printf_s("Isempty gewaehlt\n");
			i = isempty(q);
			if (i != 0) printf_s("Queue ist leer\n");
			else printf_s("Queue ist nicht leer\n");
			break;
		case 'p':
		case 'P': printf_s("Ausgabe gewaehlt\n");
			print(q);
			break;
		default: break;
		};
	};
};

int main(void)
{
	queuetest();
	system("PAUSE");
	return 0;
}


Edit: [code]-Umgebung -- Karlito
05.01.2016 11:25 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

ich würde so vorgehen (ungetestet):
code:
1:
2:
3:
4:
5:
search(queue* q, int i) {
    if (isempty(q)) return 0; //nicht gefunden
    if (top(q) == i) return 1; //gefunden
    return search(rest(q), i);
}


__________________
Syntax Highlighting fürs Board (Link)
05.01.2016 11:35 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Chirs
Mitglied


Dabei seit: 23.12.2015
Beiträge: 26

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Dankeschön für die schnelle Hilfe :-)

Ich denke einfach immer viel zu kompliziert Zunge raus
05.01.2016 15:15 Chirs ist offline E-Mail an Chirs senden Beiträge von Chirs suchen Nehmen Sie Chirs in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Rekursives Suchen in Queue