afenhhr112233 发表于 2023-3-31 19:09:03

请问为什么会出现这个错误啊?

C语言链栈的入栈操作,调试的时候运行到(S.Head->next = p)的时候总是会跳出这个弹窗,查了好久也没找到问题,请问给位大佬到底错哪了啊?
Status Push(LinkStack S, SElemType e)
{
        LinkList p = (LinkList)malloc(sizeof(LNode));
        if(!p)
                return ERROR;
        p->data = e;
        p->next = S.Head->next;
        S.Head->next = p;
        S.length++;
        return OK;
}

这是完整的代码
#include <stdio.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;

typedef struct L_node
{
   SElemType   data;
   struct L_node*next;
}LNode, *LinkList;



typedef struct
{
   LinkListHead;
   intlength;
}LinkStack;

void InitStack(LinkStack S)
{
        S.Head = (LinkList)malloc(sizeof(LNode));
        S.Head->next = NULL;
        S.length = 0;
}

Status Push(LinkStack S, SElemType e)
{
        LinkList p = (LinkList)malloc(sizeof(LNode));
        if(!p)
                return ERROR;
        p->data = e;
        p->next = S.Head->next;
        S.Head->next = p;
        S.length++;
        return OK;
}


Status DelNum(LinkStack S, SElemType e)
{
        int i = 0;
        for(LinkList p = S.Head->next; p->next != NULL; p = p->next)
        {
                i++;
                if(p->data == e)
                {
                        LinkList prevA = S.Head, A;
                        for(int j = 0; j < i-1; j++)
                                prevA = prevA->next;
                        A = prevA->next;
                        prevA->next = A->next;
                        A->next = NULL;
                        free(A);
                }
        }
        return OK;
}

int main()
{
        LinkStack S;
        InitStack(S);
        int len, e;
        scanf("%d", &len);
        for(int i = 0; i < len; i++)
        {
                scanf("%d", &e);
                Push(S, e);
        }
        for(LinkList p = S.Head->next; p->next != NULL; p = p->next)
                printf("%d ", p->data);
}

StellarCoffee 发表于 2023-3-31 19:41:15

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

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0

typedef int SElemType;
typedef int Status;

typedef struct L_node {
    SElemType data;
    struct L_node *next;
} LNode, *LinkList;

typedef struct {
    LinkList Head;
    int length;
} LinkStack;

void InitStack(LinkStack &S) {
    S.Head = (LinkList) malloc(sizeof(LNode));
    S.Head->next = NULL;
    S.length = 0;
}

Status Push(LinkStack &S, SElemType e) {
    LinkList p = (LinkList) malloc(sizeof(LNode));
    if (!p)
      return ERROR;
    p->data = e;
    p->next = NULL;
    p->next = S.Head->next;
    S.Head->next = p;
    S.length++;
    return OK;
}

Status DelNum(LinkStack &S, SElemType e) {
    int i = 0;
    for (LinkList p = S.Head->next; p != NULL; p = p->next) {
      i++;
      if (p->data == e) {
            LinkList prevA = S.Head, A;
            for (int j = 0; j < i - 1; j++)
                prevA = prevA->next;
            A = prevA->next;
            prevA->next = A->next;
            A->next = NULL;
            free(A);
      }
    }
    return OK;
}

int main() {
    LinkStack S;
    InitStack(S);
    int len, e;
    scanf("%d", &len);
    for (int i = 0; i < len; i++) {
      scanf("%d", &e);
      Push(S, e);
    }
    for (LinkList p = S.Head->next; p != NULL; p = p->next)
      printf("%d ", p->data);
}
函数 InitStack(LinkStack S) 应更改为 void InitStack(LinkStack &S)。 这是因为我们需要将 LinkStack 的引用传递给函数,并在函数内部进行修改。 如果我们不使用引用,那么在函数内部所做的任何修改都不会影响 LinkStack 的原始副本。 在函数Push(LinkStack S, SElemType e)中,p->next的初始化应该是NULL,而不是S.Head->next。 另外,应该是S.Head = (LinkList)malloc(sizeof(LNode)); 而不是 (LinkList)malloc(sizeof(LinkList));。 在DelNum(LinkStack S, SElemType e)的for循环中,条件应该是p != NULL而不是p->next != NULL。

StellarCoffee 发表于 2023-3-31 19:41:49

以上代码已完成修改

afenhhr112233 发表于 2023-3-31 19:45:47

谢谢!
页: [1]
查看完整版本: 请问为什么会出现这个错误啊?