kh medo Ответов: 2

Как я могу преобразовать этот код из языка C в C#?


    #include <stdio.h>
    #include <stdlib.h>
    #define strcasecmp _stricmp
    struct BSTnode {
    	char word[128], meaning[256];
    	struct BSTnode *left, *right;
    };    
    struct BSTnode *root = NULL;    
    struct BSTnode * createNode(char *word, char *meaning) {
    	struct BSTnode *newnode;
    	newnode = (struct BSTnode *)malloc(sizeof(struct BSTnode));
    	strcpy(newnode->word, word);
    	strcpy(newnode->meaning, meaning);
    	newnode->left = newnode->right = NULL;
    	return newnode;
    } 
    void insert(char *word, char *meaning) {
    	struct BSTnode *parent = NULL, *current = NULL, *newnode = NULL;
    	int res = 0;
    	if (!root) {
    		root = createNode(word, meaning);
    		return;
    	}
    	for (current = root; current != NULL;
    		current = (res > 0) ? current->right : current->left) {
    		res = strcasecmp(word, current->word);
    		if (res == 0) {
    			printf("Duplicate entry!!\n");
    			return;
    		}
    		parent = current;
    	}
    	newnode = createNode(word, meaning);
    	res > 0 ? (parent->right = newnode) : (parent->left = newnode);
    	return;
    }   
    void deleteNode(char *str) {
    	struct BSTnode *parent = NULL, *current = NULL, *temp = NULL;
    	int flag = 0, res = 0;
    	if (!root) {
    		printf("BST is not present!!\n");
    		return;
    	}
    	current = root;
    	while (1) {
    		res = strcasecmp(current->word, str);
    		if (res == 0)
    			break;
    		flag = res;
    		parent = current;
    		current = (res > 0) ? current->left : current->right;
    		if (current == NULL)
    			return;
    	}
    	if (current->right == NULL) {
    		if (current == root && current->left == NULL) {
    			free(current);
    			root = NULL;
    			return;
    		}
    		else if (current == root) {
    			root = current->left;
    			free(current);
    			return;
    		}
    		flag > 0 ? (parent->left = current->left) :
    			(parent->right = current->left);
    	}
    	else {
    		temp = current->right;
    		if (!temp->left) {
    			temp->left = current->left;
    			if (current == root) {
    				root = temp;
    				free(current);
    				return;
    			}
    			flag > 0 ? (parent->left = temp) :
    				(parent->right = temp);
    		}
    		else {
    		 
    			struct BSTnode *successor = NULL;
    			while (1) {
    				successor = temp->left;
    				if (!successor->left)
    					break;
    				temp = successor;
    			}
    			temp->left = successor->right;
    			successor->left = current->left;
    			successor->right = current->right;
    			if (current == root) {
    				root = successor;
    				free(current);
    				return;
    			}
    			(flag > 0) ? (parent->left = successor) :
    				(parent->right = successor);
    		}
    	}
    	free(current);
    	return;
    }
    void findElement(char *str) {
    	struct BSTnode *temp = NULL;
    	int flag = 0, res = 0;
    	if (root == NULL) {
    		printf("Binary Search Tree is out of station!!\n");
    		return;
    	}
    	temp = root;
    	while (temp) {
    		if ((res = strcasecmp(temp->word, str)) == 0) {
    			printf("Word   : %s", str);
    			printf("Meaning: %s", temp->meaning);
    			flag = 1;
    			break;
    		}
    		temp = (res > 0) ? temp->left : temp->right;
    	}
    	if (!flag)
    		printf("Search Element not found in Binary Search Tree\n");
    	return;
    }    
    void inorderTraversal(struct BSTnode *myNode) {
    	if (myNode) {
    		inorderTraversal(myNode->left);
    		printf("Word    : %s", myNode->word);
    		printf("Meaning : %s", myNode->meaning);
    		printf("\n");
    		inorderTraversal(myNode->right);
    	}
    	return;
    }
    int main() {
    	int ch;
    	char str[128], meaning[256];
    	while (1) {
    		printf("\n1. Insertion\t2. Deletion\n");
    		printf("3. Searching\t4. Traversal\n");
    		printf("5. Exit\nEnter ur choice:");
    		scanf_s("%d", &ch);
    		getchar();
    		switch (ch) {
    		case 1:
    			printf("Word to insert:");
    			fgets(str, 100, stdin);
    			printf("Meaning:");
    			fgets(meaning, 256, stdin);
    			insert(str, meaning);
    			break;
    		case 2:
    			printf("Enter the word to delete:");
    			fgets(str, 100, stdin);
    			deleteNode(str);
    			break;
    		case 3:
    			printf("Enter the search word:");
    			fgets(str, 100, stdin);
    			findElement(str);
    			break;
    		case 4:
    			inorderTraversal(root);
    			break;
    		case 5:
    			exit(0);
    		default:
    			printf("You have entered wrong option\n");
    			break;
    		}
    	}
    	return 0;
}


Что я уже пробовал:

этот код для реализации словаря в C с использованием двоичных деревьев я хочу преобразовать в c#

Richard MacCutchan

Затем вам нужно переписать его с помощью классов и методов C#.

kh medo

хорошо спасибо

BillWoodruff

к вашему сведению: словарь в .NET реализован с использованием хэш-таблиц. Вы уверены, что словарь .NET - это то, что вам нужно ?

Код, который вы показываете, предполагает дерево.

2 Ответов

Рейтинг:
2

CPallini

Как Грифф мудро посоветовал не делать этого. Перепишите его с нуля, используя доступные классы. Я думаю, что Класс SortedSet(T) (System.Коллекции.Общий)[^] может подойти по всем статьям.


BillWoodruff

Мой голос за № 1. Как SortedSet относится к вопросу OP ? Ты мог бы хотя бы это объяснить.

CPallini

Ух ты, Большое тебе спасибо, Билл.
И нет, я не собираюсь ничего объяснять. Я уверен, что ОП (и вы) можете получить ссылку.

BillWoodruff

Я верю, что ты лучше этого.

Рейтинг:
13

OriginalGriff

Не. Преобразование кода из C в C# не даст хорошего кода C# - C полностью основан на указателях, а C# - нет. C# также основан на классах, о которых C ничего не знает.
А C# использует .NET, который включает в себя множество коллекций, которые уже обрабатывают все "неудобные вещи" для вас - включая словари, списки и хэш-таблицы.

Напишите его с нуля на C# - вы получите гораздо лучший результат, чем при конвертации с C!


CPallini

5.

BillWoodruff

Я не единственный, кто был удивлен, обнаружив, что BCL и другие библиотеки коллекций не имеют древовидных коллекций, но реализовать их не так уж сложно, и есть много доступных примеров.