そのため、今日、私が抱えていたセグメンテーション エラーのリンクを投稿しました:セグメンテーション エラー エラー - リンク リストを使用したスタックの実装
私が得た答えは素晴らしく、与えられた答えに従ってエラーを取り除きました....しかし、戻ってきました。
これが私の新しいコードです(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()
特に両方に再帰が含まれているためだと思います。私はこれに非常に慣れていないため、理由がわかりません。これを修正するための助けは素晴らしいでしょう。
みんなありがとう!