鱼C论坛

 找回密码
 立即注册
查看: 781|回复: 3

[已解决]请问为什么会出现这个错误啊?

[复制链接]
发表于 2023-3-31 19:09:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
{
   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 = 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);
}
最佳答案
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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-31 19:41:49 | 显示全部楼层
以上代码已完成修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-31 19:45:47 | 显示全部楼层
谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 22:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表