addObject上的Object-C分段错误

问题描述 投票:0回答:1

[当我尝试在数组中添加Object时,显示为segmentfault。我已经尝试了很多方法,但是没有用。任何帮助,将不胜感激。我正在创建一个二叉树并返回该二叉树的ZigZagTraversal。

下面是我的代码。

#import <Foundation/Foundation.h>

NSInteger MAXVALUEOFNODE = 100;

@interface Node:NSObject {
   @public int  data;
   @public Node *left;
   @public Node *right;
}


@end

@implementation Node 
-(id)init:(int) item {
   self = [super init];
   data = item;
   left = right = nil;
   return self;
}
@end

@interface BinaryTree:NSObject {
   @public Node *root; 
}

-(void)printZigZagTraversal;

-(void)addNodeToBT:(Node **)root :(int) parent :(int) child :(char) direction :(Node *[MAXVALUEOFNODE+1])dangling;
@end

@implementation BinaryTree  

-(void)addNodeToBT:(Node **)root :(int) parent :(int) child :(char) direction :(Node *[MAXVALUEOFNODE+1])dangling
{
    Node *childNode, *parentNode;

    if(dangling[child] == NULL){
        childNode = (Node*)malloc(sizeof(Node));
        childNode->data = child;
        childNode->left = NULL;
        childNode->right = NULL;
        dangling[child] = childNode;
    }
    else{
        childNode = dangling[child];
    }
    if(dangling[parent] == NULL){
        parentNode = [[Node alloc] init:0];
        parentNode->data = parent;
        parentNode->left = NULL;
        parentNode->right = NULL;
        dangling[parent] = parentNode;
    }
    else{
        parentNode = dangling[parent];
    }

    if(*root == NULL){
        *root = parentNode;
    }

    if(direction == 'L'){
        parentNode->left = childNode;
    }
    else{
        parentNode->right = childNode;
    }
}

-(void)printZigZagTraversal {
    NSMutableArray *currentLevel = [[NSMutableArray alloc] init];
    NSMutableArray *nextLevel    = [[NSMutableArray alloc] init];
    bool rightToLeft             = true;

    [currentLevel addObject: self->root];

    while (!(currentLevel.count == 0)) {
        Node *node = [currentLevel lastObject];

        [currentLevel removeLastObject];
        // printf(" %i", node->data);

        if (rightToLeft){
            if (node->right != nil)  {
                // [nextLevel addObject:node->right];
            }
            if (node->left != nil) {
                // [nextLevel addObject:node->left];
            }
        }
        else {
            if (node->left != nil) {
            // [nextLevel addObject:node->left];
            }
            if (node->right != nil)  {
            // [nextLevel addObject:node->right];
            }

        }

        if (currentLevel.count == 0) {
            rightToLeft = !rightToLeft;
            NSMutableArray *temp = currentLevel;
            currentLevel = nextLevel;
            nextLevel = temp;
        }

    }
}

@end

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int edges, parent, child, i;
    Node *dangling[MAXVALUEOFNODE+1];
    char direction;

    for(i=0;i<MAXVALUEOFNODE+1;i++){
        dangling[i] = NULL;
    } 

    BinaryTree *tree         = [[BinaryTree alloc]init];

    scanf("%i", &edges);

    for(i=0;i<edges;i++){
        scanf("%d %d %c", &parent, &child, &direction);
        [tree addNodeToBT:&tree->root :parent :child :direction :dangling];
    }

    [tree printZigZagTraversal];

    [pool drain];
    return 0;
}

实际上,我在这里创建一个二叉树并返回该二叉树的ZigZagTraversal。

objective-c segmentation-fault nsmutablearray
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.