0

そのため、今日、私が抱えていたセグメンテーション エラーのリンクを投稿しました:セグメンテーション エラー エラー - リンク リストを使用したスタックの実装

私が得た答えは素晴らしく、与えられた答えに従ってエラーを取り除きました....しかし、戻ってきました。

これが私の新しいコードです(main()に追加しました):

#include <stdio.h>
#include <stdlib.h>

typedef struct Link{
    int value;
    struct Link *next;
}Link;

typedef struct LList1{
    int size;
    Link *head;
}LList1;

typedef struct LListStack{
    LList1 *llist;
}LListStack ;



LListStack *initLListStack(void)
{
    LListStack *stack = (LListStack *) malloc(sizeof(LListStack)) ;
    stack->llist = (LList1 *) malloc (sizeof(LList1));
    stack->llist->size = 0;
    stack->llist->head = NULL;
    return(stack);
}


void removefront(LList1 *llist)
{
    if(llist->head != NULL){
        llist->head = llist->head->next;
        llist->size--;
    }
}

Link *FindLastLink(LList1 *llist, Link *link)
{
    if(link = NULL){
        return(NULL);
    }
    else if(link->next == NULL){
        return(link);
    }
    else{
        return(FindLastLink(llist, link->next));
    }
}

Link *FindSecondLastLink(LList1 *llist, Link *link)
{
    if(link = NULL){
        return(NULL);
    }
    else if(link->next->next == NULL){
        return(link);
    }
    else{
        return(FindSecondLastLink(llist, link->next));
    }
}

void removelast(LList1 *llist)
{
    Link *secondlastlink = (Link *) malloc(sizeof(Link));
    secondlastlink = FindSecondLastLink(llist, llist->head);
    secondlastlink->next = NULL;
    llist->size--;

}



void prepend(int newValue, LList1 *templist)
{
    Link *node = (Link *) malloc(sizeof(Link));
    node->value = newValue;
    node->next = templist->head;
    templist->head = node;
    templist->size++;
}

void append(int newValue, LList1 *templist)
{
    Link *node = (Link *) malloc(sizeof(Link));
    Link *lastlink = (Link *) malloc(sizeof(Link));
    lastlink = FindLastLink(templist, templist->head);
    node->value = newValue;
    lastlink->next = node;
    node->next = NULL;
    templist->size++;
}


void prepush(int value, LListStack *stack)
{
    prepend(value, stack->llist);
}

void apppush(int value, LListStack *stack)
{
    append(value, stack-> llist);
}

int prepop(LListStack *stack)
{
    int result ;

    if ((!isEmpty(stack)))
    {
        removefront(stack->llist);
        result = 1 ;

    }
    else {
        result = 0 ;
    }
    return(result) ;
}

int isEmpty(LListStack *stack)
{
    int empty;

    if (stack->llist->head == NULL)
        return( 1 ) ;
    else
        return( 0 ) ;
}

int apppop(LListStack *stack)
{
    int result ;

    if ((!isEmpty(stack)))
    {
        removelast(stack->llist);
        result = 1 ;
    }
    else
        result = 0 ;

    return(result) ;
}

void PrintList(LList1 *llist, Link *link){
    if (link->next != NULL){
        printf("%d \n", link->value);
        PrintList(llist, link->next);
    }

}

//*******MAIN**********//

int main()
{
    LListStack *stack = (LListStack *) malloc (sizeof(LListStack));

    stack = initLListStack(); //if I take this away, I can run the program

    int pre, app, i, n=10;

    for(i=0;i<10;i++){
        prepush(i, stack);

    } 

    app = apppop(stack); //this cause a segmentation fault
    for(i=4;i>0;i--){
        apppush(i, stack); //so does this
        prepush(i, stack);
    }
    PrintList(stack->llist, stack->llist->head);

    return(0);
}

「prepush()」または「prepull()」を呼び出すと、main() を見ると、すべてがうまく機能します。ただし、'apppush()' または 'apppull()' を呼び出すと、セグメンテーション違反が発生します。関数をたどると、犯人は関数FindLastLink()であり、FindSecondLastLink()特に両方に再帰が含まれているためだと思います。私はこれに非常に慣れていないため、理由がわかりません。これを修正するための助けは素晴らしいでしょう。

みんなありがとう!

4

1 に答える 1

2

問題は FindSecondLastLink 関数にあると思います。NULL への 2 番目のポインターをチェックするのを忘れました。link->next->next にアクセスする際、link->next == NULL の場合、segfault が発生します。

Link *FindSecondLastLink(LList1 *llist, Link *link)
{
if(link = NULL){ // One more problem is that you assigning NULL value to link variable instead of compare it. It should be link == NULL
    return(NULL);
}
else if(link->next->next == NULL){ // The problem is here. You forgot to check if link->next == NULL
    return(link);
}
else{
    return(FindSecondLastLink(llist, link->next));
}
}
于 2013-09-30T05:12:06.397 に答える