Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as text by Master ( 17 years ago )
/* Algorithmen und Datenstrukturen Uebung 5 */
#include <stdio.h>
#include <stdlib.h>
// Globale Variablen und Typdefinitionen
typedef struct node_ {
int key;
int bf;
char *data;
struct node_ *left;
struct node_ *right;
} node;
typedef struct biTree_ {
int size;
node *root;
} biTree;
// Funktionsprototypen
node *insertNode(node *, int , char *,node *, biTree *);
node *insert(biTree *, int, char *);
void printTreeInline (node *);
void printTreeLevelOrder (node *);
node *lookup (node *, int);
int treeDepth (node *);
node *left2; //Hilfszeiger
node *right2; //Hilfszeiger
node *grandchild;
// Funktionen
// Funktion insertNode: siehe Vorlesungsfolien
node *insertNode(node *start, int key, char *data, node *parent, biTree *t)
{
node *newNode;
if (start == NULL) {
newNode = malloc(sizeof(node));
if (newNode != NULL) {
newNode->data = data;
newNode->key = key;
newNode->right = newNode->left = NULL;
newNode->bf = 0;
}
return newNode;
}
if (key < start->key) {
newNode = insertNode(start->left, key, data, start, t);
if (start->left == NULL)
start->left = newNode;
}
else {
newNode = insertNode(start->right, key, data, start, t);
if (start->right == NULL)
start->right = newNode;
}
//Balance Faktor berechnen
start->bf = treeDepth(start->left) - treeDepth(start->right);
//Unterscheidung der 4 Fälle, rotieren und Balance Faktor korrigieren
if(start->bf == +2){
if(start->left->bf== +1){
//LL
left2 = start->left;
start->left= left2->right;
left2->right=start;
if(parent == NULL){
t->root=left2;
}else{
if(start == parent->left){
parent->left=left2;
}
if(start == parent->right){
parent->right=left2;
}
}
start->bf=NULL;
left2->bf=NULL;
}else{
//LR
left2 = start->left;
grandchild=left2->right;
left2->right=grandchild->left;
grandchild->left=left2;
start->left=grandchild->right;
grandchild->right=start;
if(parent == NULL){
t->root=grandchild;
}else{
if(start == parent->left){
parent->left=grandchild;
}
if(start == parent->right){
parent->right=grandchild;
}
}
if(grandchild->bf == +1){
start->bf=-1;
left2->bf=0;
}
if(grandchild->bf == 0){
start->bf=0;
left2->bf=0;
}
if(grandchild->bf == -1){
start->bf=0;
left2->bf=+1;
}
grandchild->bf=0;
}
}
if(start->bf== -2){
if(start->right->bf== -1){
//RR
right2 = start->right;
start->right= right2->left;
right2->left=start;
if(parent == NULL){
t->root=right2;
}else{
if(start == parent->left){
parent->left=right2;
}
if(start == parent->right){
parent->right=right2;
}
}
start->bf=NULL;
right2->bf=NULL;
}else{
//RL
right2 = start->right;
grandchild=right2->left;
right2->left=grandchild->right;
grandchild->right=right2;
start->right=grandchild->left;
grandchild->left=start;
if(parent == NULL){
t->root=grandchild;
}else{
if(start == parent->left){
parent->left=grandchild;
}
if(start == parent->right){
parent->right=grandchild;
}
}
}
}
return newNode;
}
// Funktion insert: siehe Vorlesungsfolien
node *insert(biTree *t, int key, char *data)
{
node *newNode;
newNode = insertNode(t->root, key, data, NULL, t);
if (t->root == NULL) t->root = newNode;
if (newNode != NULL) t->size++;
return newNode;
}
// Rekursive Funktion zum Ausgeben des Baumes in Inline-Notation
void printTreeInline (node *start)
{
if(start!=NULL){
printTreeInline(start->left);
printf("Daten: %d
",start->key);
printTreeInline(start->right);
}
}
// Funktion zum ebenenweise Ausgeben des Baumes
void printTreeLevelOrder (node *start)
{
}
// Suchen eines Knotens anhand des Keys
node *lookup (node *start, int key)
{
if (start == NULL) {
return NULL; // Knoten nicht gefunden
}
if (key == start->key) {
return start; // Knoten wurde gefunden
}
if (key < start->key) {
return lookup(start->left, key);
}
else {
return lookup(start->right, key);
}
}
int treeDepth (node *start)
{
if (start == NULL)
{
return 0;
}
else {
return 1 + max(treeDepth(start->left),
treeDepth(start->right));
}
}
// Hauptprogramm
int main(void)
{
// Variablen fuer den Baum anlegen
int i;
int x;
int y;
biTree tree;
node *node;
char* data;
int key=0;
int start=0;
tree.root=NULL;
tree.size=0;
i=0;
// Einlesen mehrerer Datensaetze von der Tastur
// und Einfügen in den Baum mittels insert()
printf("Wieviele Datensaetze moechten sie erfassen?
");
scanf("%d",&y);
for(x=1;x<=y;x++){
printf("Bitte geben Sie die Personalnummer ein:
");
scanf("%d",&key);
getchar();
node=lookup(tree.root,key);
if(node!=NULL){
printf("Bereits vorhanden!
");
x--;
}
else
{
data = (char*) malloc(30);
printf("Bitte geben Sie den Namen ein:
");
gets(data);
insert(&tree, key , data);
}
}
// Ausgabe des Baumes in Inline-Notation
printTreeInline(tree.root);
// Ausgabe der Baumtiefe
i=treeDepth (tree.root);
printf("Baumtiefe: %d
",i);
// Ausgabe von Minimum- und Maximum-Key
// Ausgabe des Baumes in Levelorder
printTreeLevelOrder(start);
// Suchen nach Datensaetzen (laeuft in einer Schleife)
// wie in der Aufgabenstellung beschrieben
while(1){
printf("Bitte geben Sie die nach der zu suchenden Personalnummer ein:
");
scanf("%d",&key);
getchar();
if(key==0){
break;
}
node=lookup(tree.root,key);
if(node==NULL){
printf("Personaldaten nicht gefunden!
");
}
else{
printf("%s
",node->data);
}
}
return 0;
}
Revise this Paste