鱼C论坛

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

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

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

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

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

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


这是完整的代码
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdio.h>  
  4. #include <stdlib.h>  
  5. #include <malloc.h>
  6. #define ERROR 0
  7. #define OK 1
  8. #define TRUE 1
  9. #define FALSE 0
  10. typedef int SElemType;
  11. typedef int Status;

  12. typedef struct L_node
  13. {
  14.      SElemType     data;
  15.      struct L_node  *next;
  16. }LNode, *LinkList;



  17. typedef struct
  18. {
  19.    LinkList  Head;
  20.    int  length;
  21. }LinkStack;

  22. void InitStack(LinkStack S)
  23. {
  24.         S.Head = (LinkList)malloc(sizeof(LNode));
  25.         S.Head->next = NULL;
  26.         S.length = 0;
  27. }

  28. Status Push(LinkStack S, SElemType e)
  29. {
  30.         LinkList p = (LinkList)malloc(sizeof(LNode));
  31.         if(!p)
  32.                 return ERROR;
  33.         p->data = e;
  34.         p->next = S.Head->next;
  35.         S.Head->next = p;
  36.         S.length++;
  37.         return OK;
  38. }


  39. Status DelNum(LinkStack S, SElemType e)
  40. {
  41.         int i = 0;
  42.         for(LinkList p = S.Head->next; p->next != NULL; p = p->next)
  43.         {
  44.                 i++;
  45.                 if(p->data == e)
  46.                 {
  47.                         LinkList prevA = S.Head, A;
  48.                         for(int j = 0; j < i-1; j++)
  49.                                 prevA = prevA->next;
  50.                         A = prevA->next;
  51.                         prevA->next = A->next;
  52.                         A->next = NULL;
  53.                         free(A);
  54.                 }
  55.         }
  56.         return OK;
  57. }

  58. int main()
  59. {
  60.         LinkStack S;
  61.         InitStack(S);
  62.         int len, e;
  63.         scanf("%d", &len);
  64.         for(int i = 0; i < len; i++)
  65.         {
  66.                 scanf("%d", &e);
  67.                 Push(S, e);
  68.         }
  69.         for(LinkList p = S.Head->next; p->next != NULL; p = p->next)
  70.                 printf("%d ", p->data);
  71. }
复制代码
最佳答案
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-4-18 08:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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