Skip to content
Snippets Groups Projects
Commit ad284e54 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Übungsaufgaben und Musterlösung 21.1.2019

parent e3403818
No related branches found
No related tags found
No related merge requests found
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int content;
struct node *next;
} node;
void output_list (node *first)
{
for (node *p = first; p; p = p->next)
printf ("%d ", p->content);
printf ("\n");
}
void insert_into_list (node *what, node *where)
{
what->next = where->next;
where->next = what;
}
int main (void)
{
node *element3 = malloc (sizeof (node));
node *element7 = malloc (sizeof (node));
node *element137 = malloc (sizeof (node));
element3->content = 3;
element7->content = 7;
element137->content = 137;
node *first = element3;
element3->next = element7;
element7->next = element137;
element137->next = NULL;
output_list (first);
node *element5 = malloc (sizeof (node));
element5->content = 5;
insert_into_list (element5, element3);
output_list (first);
return 0;
}
File added
This diff is collapsed.
No preview for this file type
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
% Attribution-ShareAlike 3.0 Unported License along with this % Attribution-ShareAlike 3.0 Unported License along with this
% document. If not, see <http://creativecommons.org/licenses/>. % document. If not, see <http://creativecommons.org/licenses/>.
% README: Stack-Operationen, doppelt verkettete Liste, ternärer Baum % README: Stack-Operationen, einfach und doppelt verkettete Listen, ternärer Baum
\documentclass[a4paper]{article} \documentclass[a4paper]{article}
...@@ -35,13 +35,13 @@ ...@@ -35,13 +35,13 @@
Übungsaufgaben -- 21.\ Januar 2019} Übungsaufgaben -- 21.\ Januar 2019}
Diese Übung enthält Punkteangaben wie in einer Klausur. Diese Übung enthält Punkteangaben wie in einer Klausur.
Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten
unter Verwendung ausschließlich zugelassener Hilfsmittel unter Verwendung ausschließlich zugelassener Hilfsmittel
16 Punkte (von insgesamt \totalpoints) erreichen. 17 Punkte (von insgesamt \totalpoints) erreichen.
\exercise{Stack-Operationen} \exercise{Stack-Operationen}
Wir betrachten das folgende Programm (\gitfile{hp}{20180122}{aufgabe-1.c}): Wir betrachten das folgende Programm (\gitfile{hp}{20190121}{aufgabe-1.c}):
\begin{minipage}[t]{0.5\textwidth} \begin{minipage}[t]{0.5\textwidth}
\begin{lstlisting}[gobble=6] \begin{lstlisting}[gobble=6]
...@@ -136,19 +136,19 @@ ...@@ -136,19 +136,19 @@
\goodbreak \goodbreak
\exercise{Doppelt verkettete Liste} \exercise{Einfach und doppelt verkettete Listen}
In der Vorlesung wurde ein Beispiel-Programm Das Beispiel-Programm \gitfile{hp}{20190121}{aufgabe-2.c}
% (\gitfile{hp}{20180122}{lists-11.c}) demonstriert zwei Funktionen zur Verwaltung einfach verketteter Listen:
zur Verwaltung einfach verketteter Listen erstellt \lstinline{output_list()} zum Ausgeben der Liste auf den Bildschirm und
(an die Liste anhängen, in die Liste einfügen, Liste ausgeben usw.). \lstinline{insert_into_list()} zum Einfügen in die Liste.
\begin{enumerate}[\quad(a)] \begin{enumerate}[\quad(a)]
\item \item
Ergänzen Sie eine Funktion \lstinline{delete_from_list()} Ergänzen Sie eine Funktion \lstinline{delete_from_list()}
zum Löschen eines Elements aus der Liste zum Löschen eines Elements aus der Liste
mit Freigabe des Speicherplatzes. mit Freigabe des Speicherplatzes.
\points{3} \points{5}
\item \item
Ergänzen Sie eine Funktion \lstinline{reverse_list()} Ergänzen Sie eine Funktion \lstinline{reverse_list()}
die die Reihenfolge der Elemente in der Liste umdreht.\\ die die Reihenfolge der Elemente in der Liste umdreht.\\
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12 wie die Zahlen 7, 137, 3, 5, 6, 42, 1, 2 und 12
nacheinander und in dieser Reihenfolge nacheinander und in dieser Reihenfolge
in den oben beschriebenen Baum eingefügt werden in den oben beschriebenen Baum eingefügt werden
-- analog zu den Vortragsfolien (\gitfile{hp}{20190121}{hp-20980121.pdf}), -- analog zu den Vortragsfolien (\gitfile{hp}{20190121}{hp-20190121.pdf}),
Seite 43. Seite 43.
\points{3} \points{3}
% %
......
#include <stdio.h>
#define STACK_SIZE 10
int stack[STACK_SIZE];
int stack_pointer = 0;
void push (int x)
{
stack[stack_pointer++] = x;
}
int pop (void)
{
return stack[--stack_pointer];
}
void show (void)
{
printf ("stack content:");
for (int i = 0; i < stack_pointer; i++)
printf (" %d", stack[i]);
if (stack_pointer)
printf ("\n");
else
printf (" (empty)\n");
}
void insert (int x, int pos)
{
for (int i = stack_pointer - 1; i >= pos; i--)
stack[i + 1] = stack[i];
stack[pos] = x;
stack_pointer++;
}
void insert_sorted (int x)
{
int i = stack_pointer - 1;
while (i >= 0 && x < stack[i])
{
stack[i + 1] = stack[i];
i--;
}
stack[i + 1] = x;
stack_pointer++;
}
int main (void)
{
push (3);
push (7);
push (137);
show ();
insert (5, 1);
show ();
insert_sorted (42);
show ();
insert_sorted (2);
show ();
return 0;
}
#include <stdio.h>
#define STACK_SIZE 10
int stack[STACK_SIZE];
int stack_pointer = 0;
void push (int x)
{
stack[stack_pointer++] = x;
}
int pop (void)
{
return stack[--stack_pointer];
}
void show (void)
{
printf ("stack content:");
for (int i = 0; i < stack_pointer; i++)
printf (" %d", stack[i]);
if (stack_pointer)
printf ("\n");
else
printf (" (empty)\n");
}
void insert (int x, int pos)
{
for (int i = stack_pointer - 1; i >= pos; i--)
stack[i + 1] = stack[i];
stack[pos] = x;
stack_pointer++;
}
void insert_sorted (int x)
{
int i = 0;
while (i < stack_pointer && x > stack[i])
i++;
insert (x, i);
}
int main (void)
{
push (3);
push (7);
push (137);
show ();
insert (5, 1);
show ();
insert_sorted (42);
show ();
insert_sorted (2);
show ();
return 0;
}
#include <stdio.h>
#define STACK_SIZE 10
int stack[STACK_SIZE];
int stack_pointer = 0;
void push (int x)
{
stack[stack_pointer++] = x;
}
int pop (void)
{
return stack[--stack_pointer];
}
void show (void)
{
printf ("stack content:");
for (int i = 0; i < stack_pointer; i++)
printf (" %d", stack[i]);
if (stack_pointer)
printf ("\n");
else
printf (" (empty)\n");
}
void insert (int x, int pos)
{
for (int i = stack_pointer - 1; i >= pos; i--)
stack[i + 1] = stack[i];
stack[pos] = x;
stack_pointer++;
}
void insert_sorted (int x)
{
int i = stack_pointer - 1;
while (i >= 0 && x < stack[i])
i--;
insert (x, i + 1);
}
int main (void)
{
push (3);
push (7);
push (137);
show ();
insert (5, 1);
show ();
insert_sorted (42);
show ();
insert_sorted (2);
show ();
return 0;
}
#include <stdio.h>
#define STACK_SIZE 10
int stack[STACK_SIZE];
int stack_pointer = 0;
void push (int x)
{
stack[stack_pointer++] = x;
}
int pop (void)
{
return stack[--stack_pointer];
}
void show (void)
{
printf ("stack content:");
for (int i = 0; i < stack_pointer; i++)
printf (" %d", stack[i]);
if (stack_pointer)
printf ("\n");
else
printf (" (empty)\n");
}
void insert (int x, int pos)
{
for (int i = stack_pointer - 1; i >= pos; i--)
stack[i + 1] = stack[i];
stack[pos] = x;
stack_pointer++;
}
void insert_sorted (int x)
{
int i = stack_pointer - 1;
while (i >= 0 && x < stack[i])
{
stack[i + 1] = stack[i];
i--;
}
stack[i + 1] = x;
stack_pointer++;
}
int search (int x)
{
for (int i = 0; i < stack_pointer; i++)
if (stack[i] == x)
return i;
return -1;
}
int main (void)
{
push (3);
push (7);
push (137);
show ();
insert (5, 1);
show ();
insert_sorted (42);
show ();
insert_sorted (2);
show ();
printf ("%d\n", search (42));
printf ("%d\n", search (1117));
return 0;
}
#include <stdio.h>
#define STACK_SIZE 10
int stack[STACK_SIZE];
int stack_pointer = 0;
void push (int x)
{
stack[stack_pointer++] = x;
}
int pop (void)
{
return stack[--stack_pointer];
}
void show (void)
{
printf ("stack content:");
for (int i = 0; i < stack_pointer; i++)
printf (" %d", stack[i]);
if (stack_pointer)
printf ("\n");
else
printf (" (empty)\n");
}
void insert (int x, int pos)
{
for (int i = stack_pointer - 1; i >= pos; i--)
stack[i + 1] = stack[i];
stack[pos] = x;
stack_pointer++;
}
void insert_sorted (int x)
{
int i = stack_pointer - 1;
while (i >= 0 && x < stack[i])
{
stack[i + 1] = stack[i];
i--;
}
stack[i + 1] = x;
stack_pointer++;
}
int search (int x)
{
int left = 0;
int right = stack_pointer;
while (left < right - 1)
{
int middle = (left + right) / 2;
if (x < stack[middle])
right = middle;
else
left = middle;
}
if (x == stack[left])
return left;
else
return -1;
}
int main (void)
{
push (3);
push (7);
push (137);
show ();
insert (5, 1);
show ();
insert_sorted (42);
show ();
insert_sorted (2);
show ();
printf ("%d\n", search (2));
printf ("%d\n", search (4));
printf ("%d\n", search (42));
printf ("%d\n", search (67));
printf ("%d\n", search (137));
printf ("%d\n", search (1117));
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int content;
struct node *next;
} node;
void output_list (node *first)
{
for (node *p = first; p; p = p->next)
printf ("%d ", p->content);
printf ("\n");
}
void insert_into_list (node *what, node *where)
{
what->next = where->next;
where->next = what;
}
void delete_from_list (node *what, node **first)
{
if (what == *first)
*first = what->next;
else
{
node *p = *first;
while (p && p->next != what)
p = p->next;
if (p)
p->next = what->next;
}
free (what);
}
int main (void)
{
node *element3 = malloc (sizeof (node));
node *element7 = malloc (sizeof (node));
node *element137 = malloc (sizeof (node));
element3->content = 3;
element7->content = 7;
element137->content = 137;
node *first = element3;
element3->next = element7;
element7->next = element137;
element137->next = NULL;
output_list (first);
node *element5 = malloc (sizeof (node));
element5->content = 5;
insert_into_list (element5, element3);
output_list (first);
delete_from_list (element5, &first);
output_list (first);
delete_from_list (element3, &first);
output_list (first);
delete_from_list (element137, &first);
output_list (first);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int content;
struct node *next, *prev;
} node;
void check_list (node *first)
{
for (node *p = first; p; p = p->next)
{
if (p->next && p->next->prev != p)
fprintf (stderr, "List inconsistency!\n");
if (p->prev && p->prev->next != p)
fprintf (stderr, "List inconsistency!\n");
}
}
void output_list (node *first)
{
for (node *p = first; p; p = p->next)
printf ("%d ", p->content);
printf ("\n");
}
void insert_into_list (node *what, node *where)
{
what->next = where->next;
if (where->next)
where->next->prev = what;
what->prev = where;
where->next = what;
}
void delete_from_list (node *what, node **first)
{
if (what == *first)
{
*first = what->next;
if (*first)
(*first)->prev = NULL;
}
else
{
node *p = *first;
while (p && p->next != what)
p = p->next;
if (p)
p->next = what->next;
if (what->next)
what->next->prev = p;
}
free (what);
}
int main (void)
{
node *element3 = malloc (sizeof (node));
node *element7 = malloc (sizeof (node));
node *element137 = malloc (sizeof (node));
element3->content = 3;
element7->content = 7;
element137->content = 137;
node *first = element3;
element3->prev = NULL;
element3->next = element7;
element7->prev = element3;
element7->next = element137;
element137->prev = element7;
element137->next = NULL;
output_list (first);
check_list (first);
node *element5 = malloc (sizeof (node));
element5->content = 5;
insert_into_list (element5, element3);
output_list (first);
check_list (first);
delete_from_list (element5, &first);
output_list (first);
check_list (first);
delete_from_list (element3, &first);
output_list (first);
check_list (first);
delete_from_list (element137, &first);
output_list (first);
check_list (first);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int content_left, content_right;
struct node *left, *middle, *right;
} node;
void insert_into_tree (node **root, int value)
{
if (*root)
{
if ((*root)->content_right >= 0)
if (value < (*root)->content_left)
insert_into_tree (&(*root)->left, value);
else if (value < (*root)->content_right)
insert_into_tree (&(*root)->middle, value);
else
insert_into_tree (&(*root)->right, value);
else
if (value < (*root)->content_left)
{
(*root)->content_right = (*root)->content_left;
(*root)->content_left = value;
}
else
(*root)->content_right = value;
}
else
{
*root = malloc (sizeof (node));
(*root)->left = NULL;
(*root)->content_left = value;
(*root)->middle = NULL;
(*root)->content_right = -1;
(*root)->right = NULL;
}
}
void output_tree (node *root)
{
if (root)
{
output_tree (root->left);
printf ("%d\n", root->content_left);
output_tree (root->middle);
if (root->content_right >= 0)
printf ("%d\n", root->content_right);
output_tree (root->right);
}
}
int main (void)
{
node *root = NULL;
insert_into_tree (&root, 7);
insert_into_tree (&root, 137);
insert_into_tree (&root, 3);
insert_into_tree (&root, 5);
insert_into_tree (&root, 6);
insert_into_tree (&root, 42);
insert_into_tree (&root, 1);
insert_into_tree (&root, 2);
insert_into_tree (&root, 12);
output_tree (root);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment