Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct node {
- struct node *levo;
- struct node *pravo;
- struct node *verx;
- int value;
- int key;
- };
- struct node *searchnode(struct node *derevo, int key);
- struct node *findmin(struct node *derevo) {
- while (derevo->levo) {
- derevo = derevo->levo;
- }
- return derevo;
- }
- struct node *delnode(struct node *derevo, int key) {
- struct node *deleting = searchnode(derevo, key);
- if (!deleting) {
- return derevo;
- }
- if (deleting->pravo == NULL && deleting->levo == NULL) {
- if (deleting->verx) {
- if (deleting->verx->levo == deleting) {
- deleting->verx->levo = NULL;
- } else {
- deleting->verx->pravo = NULL;
- }
- free(deleting);
- return derevo;
- } else {
- free(deleting);
- return NULL;
- }
- }
- if (deleting->pravo && deleting->levo) {
- struct node *nextnode = findmin(deleting->pravo);
- deleting->key = nextnode->key;
- deleting->value = nextnode->value;
- if (nextnode->pravo) {
- if (nextnode->verx == deleting) {
- deleting->pravo = nextnode->pravo;
- nextnode->pravo->verx = deleting;
- } else {
- nextnode->verx->levo = nextnode->pravo;
- nextnode->pravo->verx = nextnode->verx;
- }
- } else {
- if (nextnode->verx == deleting) {
- deleting->pravo = NULL;
- } else {
- nextnode->verx->levo = NULL;
- }
- }
- free(nextnode);
- return derevo;
- }
- if (deleting->pravo) {
- if (deleting->verx) {
- if (deleting->verx->pravo == deleting) {
- deleting->verx->pravo = deleting->pravo;
- } else {
- deleting->verx->levo = deleting->pravo;
- }
- deleting->pravo->verx = deleting->verx;
- } else {
- derevo = derevo->pravo;
- derevo->verx = NULL;
- }
- free(deleting);
- return derevo;
- }
- if (deleting->verx) {
- if (deleting->verx->pravo == deleting) {
- deleting->verx->pravo = deleting->levo;
- } else {
- deleting->verx->levo = deleting->levo;
- }
- deleting->levo->verx = deleting->verx;
- } else {
- derevo = derevo->levo;
- derevo->verx = NULL;
- }
- free(deleting);
- return derevo;
- }
- struct node *addnode(struct node *derevo, int key, int value) {
- struct node *node = derevo;
- struct node *prev = NULL;
- while (node) {
- if (key > node->key) {
- prev = node;
- node = node->pravo;
- } else if (key < node->key) {
- prev = node;
- node = node->levo;
- } else {
- node->value = value;
- return derevo;
- }
- }
- node = malloc(sizeof(struct node));
- node->key = key;
- node->value = value;
- node->verx = prev;
- node->levo = NULL;
- node->pravo = NULL;
- if (!prev) {
- return node;
- }
- if (key > prev->key) {
- prev->pravo = node;
- } else {
- prev->levo = node;
- }
- return derevo;
- }
- struct node *searchnode(struct node *derevo, int key) {
- while (derevo) {
- if (key > derevo->key) {
- derevo = derevo->pravo;
- } else if (key < derevo->key) {
- derevo = derevo->levo;
- } else {
- return derevo;
- }
- }
- return NULL;
- }
- void cleanderevo(struct node *derevo) {
- if(derevo == NULL){
- return;
- }
- if(derevo->levo){
- cleanderevo(derevo->levo);
- }
- if(derevo->pravo){
- cleanderevo(derevo->pravo);
- }
- free(derevo);
- }
- int main(void) {
- struct node *derevo = NULL;
- char c;
- int k, v;
- scanf("%c", &c);
- while (c != 'F') {
- if (c == 'A') {
- scanf("%d %d", &k, &v);
- derevo = addnode(derevo, k, v);
- } else if (c == 'D') {
- scanf("%d", &k);
- derevo = delnode(derevo, k);
- } else if (c == 'S') {
- scanf("%d", &k);
- struct node *poisk = searchnode(derevo, k);
- if (poisk) {
- printf("%d %d\n", poisk->key, poisk->value);
- }
- }
- scanf("%c", &c);
- } // A = 65, D = 68, S = 83, F = 70
- cleanderevo(derevo);
- }
Add Comment
Please, Sign In to add comment