-3
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

struct node
{
    char *word;
    char *meaning;
    struct node *left;
    struct node *right;
    struct node *parent;
}*root=NULL,*trav,*tmp;

void add()
{
    int res;
    // create node
    tmp=(struct node *) malloc(sizeof(struct node));
    tmp->word=(char *)malloc(sizeof(char));
    tmp->meaning=(char *)malloc(sizeof(char));
    printf("\nEnter Word\n");
    scanf("%[^\n]%*c",tmp->word);
    printf("Enter Meaning\n");
    scanf("%[^\n]%*c",tmp->meaning);
    tmp->left=NULL;
    tmp->right=NULL;
        trav=root;
        while(1)
        {

            if(trav==NULL)
            {
                root=tmp;
                root->parent=NULL;
                root->left=NULL;
                root->right=NULL;
                break;

            }
            else
            {
                res=strcmp(tmp->word,trav->word);
                // if res==0 then words are same
                // if res==1 then left word is alphabetically smaller
                // if res==2 then left word is alphabetically bigger
                if(res<0)
                {   
                    if(trav->left==NULL)
                    {
                        trav->left=tmp;
                        tmp->parent=trav;
                        break;
                    }
                    //goto left child

                    trav=trav->left;

                }
                else if(res>0)
                {   
                    if(trav->right==NULL)
                    {
                        trav->right=tmp;
                        tmp->parent=trav;
                        break;
                    }
                    //goto left child
                    trav=trav->right;

                }
                if(res==0)
                {
                    printf("Word already exist\n");
                    break;
                }


            }

        }
}




int main()
{

    int flag=0;
    while(1)
    {
        printf("\n1.add word\n2.delete word\n3.search word\n4.inorder traverse\n5.preorder traverse\n6.postorder traverse\n7.exit\n");
        switch(getche())
        {
        case '1':
            {
                add();
                 break;
            }
        case '2':
            {
                delete_word();
                break;
            }
        case '3':
            {
                search();
                break;
            }
        case '4':
            {
                traverse_inorder(root);
                break;
            }
        case '5':
            {
                traverse_preorder(root);
                break;
            }
        case '6':
            {
                traverse_postorder(root);
                break;
            }
        case '7':
            flag=1;
        }

        if(flag==1)
            break;
    }
    return 0;

}

/ *
ツリーに基づいて辞書を作成しています。3回目にadd関数を実行すると、ランタイムエラーが発生しました。助けてください* / / * 3回目に発生すると、プログラムが終了します。 * /

4

2 に答える 2

4

ここでは、1つの文字のみを割り当てています。

tmp->word=(char *)malloc(sizeof(char));
tmp->meaning=(char *)malloc(sizeof(char));

したがって、その後、値を保持するにはサイズが小さすぎるメモリブロックに文字列を書き込もうとしています。これにより、メモリが破損します。

配列を割り当てたいと思うので、次のものが必要です。

tmp->word=malloc(len * sizeof(char));
tmp->meaning=malloc(len * sizeof(char));

lenこれは、の最大想定長であり、word終了をmeaning含みます\0

于 2013-03-24T11:52:43.603 に答える
1

とに1文字だけを割り当ててwordからmeaning、1文字を超えてそれらに読み取ります(つまり、割り当てられていないメモリに書き込みます)。

于 2013-03-24T11:53:27.843 に答える