Ошибка переполнения стека причина malloc в связанном списке
Я пишу код для сортировки слов с помощью алгоритма двоичного дерева (который обсуждается в языке программирования C K&R) в любом случае я использовал этот код для теста, и в каком-то тестовом случае было 300000 слов для сортировки.
алгоритм использует связанный список, поэтому для каждого нового узла мне нужно выделение, и в этом специальном тестовом случае(который в лучшем случае требует выделения 300000) он дает мне ошибку переполнения стека.
Есть ли какие-нибудь предложения, как я могу решить эту проблему?
Я добавил код, и если вы увидите этот специальный тестовый случай, сообщите мне, чтобы добавить его, пожалуйста.
Редактирование (1):
Я думаю, что это даже не справедливый вопрос, потому что один из входных данных имеет длину около 1200000, но максимальная длина, которую я могу написать в CMD, составляет 4093 :(
вот ссылка на ограничение CMD:
https://support.microsoft.com/en-us/help/830473/command-prompt-cmd-exe-command-line-string-limitation
Редактирование(2):
Я пробовал читать из файла, но MAXWORDLEN(в коде) не может превышать 1000000.
Что я уже пробовал:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXWORDLEN 200 #pragma warning(disable:4996) using namespace std; struct tnode { char *word; struct tnode *left; struct tnode *right; int num; }; struct tnode *addNode(struct tnode *root, char *word); void printTree(struct tnode *root); int main() { int numTest; int numInput; scanf("%d", &numTest); for (int i = 0; i < numTest; i++) { struct tnode *root = NULL; scanf("%d", &numInput); getchar(); for (int j = 0; j < numInput; j++) { char word[MAXWORDLEN]; gets_s(word); root = addNode(root, word); } printTree(root); } return 0; } struct tnode *addNode(struct tnode *root, char *word) { int cmp; if (root == NULL) { root = (struct tnode*)malloc(sizeof(struct tnode)); root->word = strdup(word); root->num = 1; root->left = root->right = NULL; } else if ((cmp = strcmp(word, root->word)) == 0) root->word += 1; else if (cmp > 0) root->right = addNode(root->right, word); else root->left = addNode(root->left, word); return root; } void printTree(struct tnode *root) { if (root != NULL) { printTree(root->left); for (int i = 0; i < root->num; i++) { printf("%s\n", root->word); } printTree(root->right); } return; }
Patrice T
вы уверены, что это связанный список ?
каков размер файла со всеми словами?
Member 13606974
Я не слишком хорошо знаком со списком ссылок, но мне так кажется.
размер файла составляет 24,8 Мб