Member 13013165 Ответов: 2

Почему функция treeprint терпит неудачу?


Это неудобный вопрос, но если я не спрошу, я никогда не узнаю, что происходит, поэтому заранее спасибо за вашу помощь. Я пытаюсь выполнить упражнение 6-2 в K&R (двоичное дерево). Мне нужно написать программу, которая читает программу на C и печатает в алфавитном порядке каждую группу имен переменных, которые идентичны в первых символах «X», но где-то после этого отличаются. Мой подход состоит в том, чтобы определить структуру, которая содержит массив слов, а не одно слово (как в примере, приведенном в книге), чтобы слова с одинаковыми символами «X» могли храниться в одном узле. Поэтому я попробовал протестировать эту концепцию, прежде чем обращаться ко всему. Но когда я пытаюсь запустить следующий код, хотя кажется, что функция addtree работает (согласно отладчику), древовидная печать - нет. Он печатает переменные, у которых есть те же первые 3 символа до сбоя (ошибка сегментации, поэтому он не печатает слова в других узлах). Не совсем уверен, что происходит. Благодарность!

Кстати, я нахожу бинарное дерево действительно интригующей концепцией!

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

struct tnode *addtree(struct tnode *p, char *w){
	int cond;
	
	if(p==NULL){
		p=talloc();
		p->np=p->word;
		*(p->np)=strdup(w);
		p->count=1;
		p->left=p->right=NULL;
	}
	else if((cond=strncmp(w,*(p->np),3))==0){
		(p->np)++;
		*(p->np)=strdup(w);
	    p->count++;
	}
	else if(cond<0)
		p->left=addtree(p->left,w);
	else 
		p->right=addtree(p->right,w);
	return p;
}

void treeprint(struct tnode *p){
	if(p!=NULL){
		treeprint(p->left);
		for(int i=0;(p->word[i])!="";i++)
			printf("%4d %s\n",p->count,p->word[i]);
		treeprint(p->right);
	}
}

2 Ответов

Рейтинг:
1

Jochen Arndt

На этот вопрос нельзя ответить подробно, не зная struct tnode и talloc() функция.

Какие-то подозрительные инструкции:

if(p==NULL){
    /* What is talloc() doing? */
    /* Ensure that it allocates memory to hold a struct tnode */
    p=talloc();
    /* p has just been allocated. */
    /* So p->word is undefined if not set by talloc(). */
    p->np=p->word;
    *(p->np)=strdup(w);
    p->count=1;
    p->left=p->right=NULL;
    /* p->word is undefined if not set by talloc(). */
}
else if((cond=strncmp(w,*(p->np),3))==0){
    /* This points behind allocated memory when p->count is >= */
    /*  the size of the p->word array */
    (p->np)++;
    *(p->np)=strdup(w);
    p->count++;
}
/* ... */

/* Compares a string pointer with a pointer to an empty string which is */
/*  usually always false (pointers have never the same value). */
/* To check for an end of a list of strings compare with NULL. */
/* But this requires that the list is initialised with NULL pointers. */
/* I guess that using p->count is what you want to use here. */
for(int i=0;(p->word[i])!="";i++)
    printf("%4d %s\n",p->count,p->word[i]);


Рейтинг:
0

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.