Tôi đang cố gắng tạo một chương trình lấy danh sách các từ làm đầu vào và sắp xếp chúng thành cây nhị phân để có thể tìm thấy chúng, chẳng hạn như từ điển. Đây là những gì tôi đã làm cho đến nay, nhưng newEl -> el = đầu vào;
Xảy ra lỗi phân đoạn, tôi biết đó là do nó đang cố trỏ đến NULL el được tạo khi cây mới xuất hiện, nhưng tôi không chắc cách tốt nhất để cải thiện mã của mình là gì. Có ai có ý tưởng gì không? Cảm ơn.
nút cấu trúc *tra(nút cấu trúc * bắt đầu, Kiểu nhập) {
nút cấu trúc * thisNode = bắt đầu;
nếu (thisNode == NULL)
Nhập hiện tại = thisNode -> el;
if (strcmp(input, current) > 0)
return tra(thisNode -> phải, đầu vào);
ngược lại nếu (strcmp(input, current) < 0)
return tra(thisNode -> left, input);
khác
trả lại thisNode;
}
}
Ta chèn(Loại đầu vào, Ta ta) {
if ((find(input, ta)) == FALSE) {
newEl -> el = đầu vào;
}
trở lại ta;
}
Boolean find(Type input, Ta ta) {
if (tra(ta -> head, input) == NULL)
trả về SAI;
}
Đây là một con trỏ tới một con trỏ tương đương:
typedef char *Loại;
nút cấu trúc {
nút cấu trúc *trái, *phải;
Loại tải trọng;
};
nút cấu trúc **find_pp(nút cấu trúc **pp, Kiểu nhập) {
nút cấu trúc *thisNode;
trong khi ( thisNode = *pp ) {
int khác biệt;
diff = strcmp(input, thisNode->payload);
nếu (!diff) bị hỏng;
pp = (khác biệt <0) ? &thisNode->left : &thisNode->right;
}
trả lại trang;
}
Tìm Boolean (nút cấu trúc *root, Nhập điều)
{
nút cấu trúc **pp;
pp = find_pp( &root, thing);
trả về (*pp) ? Đúng : Sai;
}
chèn void (nút cấu trúc **pp, Nhập điều)
{
nút cấu trúc *newNode;
pp = find_pp(pp, vật);
if (*pp) return; /* đã tồn tại */
*pp = newNode = malloc (sizeof *newnode);
newNode->payload = strdup(thing);
newNode->left = NULL;
newNode->right = NULL;
return;
}
Một số lưu ý:
- Chèn một nút vào cây có nghĩa là: gán cho một con trỏ trước đó là NULL
- Một cây trống cũng là một cây: chỉ là một con trỏ (đến gốc của cây) trống rỗng
- Tìm một nút trong cây có nghĩa là: tìm vị trí (:= con trỏ) ở nơi cần có (nếu nó tồn tại)
- Nếu nó không tồn tại, con trỏ này là nơi cần chèn để làm cho nó tồn tại
- Vẽ sơ đồ (bằng giấy và bút chì) có thể hữu ích.
Tôi là một lập trình viên xuất sắc, rất giỏi!