[英]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.