簡體   English   中英

插入節點(二叉搜索樹)C

[英]inserting node (Binary search tree) C

我正在嘗試在二進制搜索樹中插入節點,但遇到了一些小問題。

#include "stdafx.h"
#include <string.h>
#include <stdlib.h>


typedef struct Node{
    char name[100];
    struct Node *pGauche;
    struct Node *pDroit;
}Node;

void getName(char[]);
void copy(Node **, Node *,char[]);
void menu(Node **);
void add(Node **);
void search(char[],Node**, Node **,Node **);
void print(Node **);
void inOrder(Node *);

void main(void)
{
    Node *root = NULL;
    menu(&root);
    system("pause");
}

void menu(Node **root)
{
    for (int i=0;i<10;i++)
    {
        add(root);
    }
    print(root);
}

void add(Node **root)
{
    char name[100];
    getName(name);
    Node *p = NULL;
    Node *savep = NULL;
    search(name,root,&p,&savep);
    copy(root,savep,name);
}

void search(char name[],Node **root, Node **p, Node **savep)
{
    *p = *root;

    while ((p == NULL) && (strcmp((*p)->name,name) != 0))
    {
        *savep = *p;

        if (strcmp(name,(*p)->name) < 0)
            *p = (*p)->pGauche;
        else
            *p = (*p)->pDroit;
    }

}

void getName(char name[])
{
    printf("What name do you want to add\n");
    scanf("%s",name);
    fflush(stdin);

}

void copy(Node **root, Node *savep, char name[])
{
    Node *newp = (Node *) malloc(sizeof(Node*));
    newp->pDroit = NULL;
    newp->pGauche = NULL;

    strcpy(newp->name,name);
    printf("%s",newp->name);


    if (*root == NULL)
        *root = newp;
    else
    {
        if (strcmp(name,savep->name) < 0) 
            savep->pGauche = newp;
        else
            savep->pDroit = newp;
    }
    free(newp);
}

void print(Node ** root)
{
    Node *p = *root;
    inOrder(p);
}

void inOrder(Node *p)
{
    if (p != NULL)
    {
        inOrder(p->pGauche);
        printf("%s\n",p->name);
        inOrder(p->pDroit);
    }
}

我知道確實有一些奇怪的功能和無用的功能,但這只是一個稍大一點的學校項目的“測試”,因此它會及時變得有用,現在我想讓二叉樹開始工作!

所以基本上的問題是,我鍵入第二個名字后得到了一個“訪問沖突讀取位置”……我猜是在做strcmp時,但是我真的不確定:/

如果有人可以幫助我運行它,我將非常高興:)

這是不正確的:

while ((p == NULL) && (strcmp((*p)->name,name) != 0))

並導致取消引用NULL指針,這是未定義的行為。 改成:

while (*p && strcmp((*p)->name,name) != 0)

這是不正確的:

Node *newp = (Node *) malloc(sizeof(Node*));

因為它只需要為Node*分配足夠的空間,所以它需要分配Node 改成:

Node *newp = malloc(sizeof(*newp));

並且不要在以后需要的相同功能中free()它。 Node free()意味着該列表具有懸掛的指針,並且取消引用一個指針是未定義的行為,並且可能是訪問沖突的原因。


注意:

fflush(stdin);

是不確定的行為。 fflush()參考頁:

使輸出文件流與文件的實際內容同步。 如果給定的流屬於輸入類型,則該函數的行為是不確定的。

有幾件事可以幫助您入門。 我沒有對它進行太深入的研究,因此您可能必須繼續深入研究更多問題,但為了使您入門,請修復以下問題:

search()這段代碼中:

    while ((p == NULL) && (strcmp((*p)->name,name) != 0))

p參數永遠不會為NULL。 因此,永遠不會進入while循環。 這意味着savep將不會設置為任何值,並且在add()函數中調用copy()時為NULL。 然后, copy()函數取消引用無效的指針引用,這導致了您觀察到的問題。

您實際上想測試看看*p是否不是 NULL。 這使您可以合法地取消引用它。

    while ((*p != NULL) && (strcmp((*p)->name,name) != 0))

其次,正如hmjd標識的,您沒有為copy()節點分配足夠的內存。

    Node *newp = (Node *) malloc(sizeof(Node*));

您只為一個指針分配了足夠的內存,而不為整個節點分配了足夠的內存。 另外,在C語言中進行編碼時,請勿轉換malloc()的返回值(它會隱藏可能導致最壞情況崩潰的錯誤)。

    Node *newp = malloc(sizeof(Node));

第三,您需要保留為節點分配的內存,而不是在將其插入copy()末尾后立即釋放它們:

    // I need this memory for my tree!
    //free(newp);

如果像您一樣調用free() ,那么您的tree將指向已釋放的內存,訪問它們將導致未定義的行為。

一件小事:您不應該執行fflush(stdin) ,因為fflush()僅用於輸出流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM