鱼C论坛

 找回密码
 立即注册
查看: 861|回复: 5

[已解决]栈的初始化

[复制链接]
发表于 2021-8-14 18:45:48 | 显示全部楼层 |阅读模式

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

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

x
主函数里面的stack初始化应该怎么写?(在42行)

报错:取消对 NULL 指针“stack”的引用。        数据结构        D:\C语言程序设计与数据结构\数据结构\数据结构\S2E24.cpp        49       


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>

  4. #define StackSize 100

  5. typedef struct Node
  6. {
  7.         int stacksize;
  8.         char* base;
  9.         char* top;
  10. }node,*pnode;

  11. void Push(pnode);
  12. double Cale(pnode);

  13. void Push(pnode stack)
  14. {
  15.         char ch;
  16.         while ((ch = getchar()) != '\n')
  17.         {
  18.                 *(stack->top) = ch;
  19.                 stack->top++;
  20.         }
  21. }

  22. double Cale(pnode stack)
  23. {
  24.         int n = 0;
  25.         double count = 0;
  26.         while (stack->base != stack->top)
  27.         {
  28.                 count += pow(((double)*(stack->top)-'0'), n);
  29.                 stack->top--;
  30.                 n++;
  31.         }
  32.         return count;
  33. }

  34. int mian(void)
  35. {
  36.         pnode stack=(pnode)malloc(sizeof(node));
  37.         double count;
  38.         stack->base = (char*)malloc(StackSize * sizeof(char));
  39.         if (stack->base)
  40.         {
  41.                 exit(0);
  42.         }
  43.         stack->top = stack->base;
  44.         stack->stacksize = StackSize;

  45.         printf("请输入一个二进制数:");
  46.         Push(stack);

  47.         printf("正在计算...\n");
  48.         count = Cale(stack);

  49.         printf("转换为十进制为%lf\n", count);

  50.         return 0;
  51. }
复制代码
最佳答案
2021-8-14 20:32:26
1. 这不是C语言么?.cpp 后缀是 C++,.c 后缀才是C语言
2. 二进制转十进制的算法不对
3. 循环结束条件不对
4. 使用了错误的栈顶元素
5. 申请了内存不释放
6. mian 可还行
7. 自己写代码不认真,别人也没办法

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. #define StackSize 100

  5. typedef struct Node
  6. {
  7.     int stacksize;
  8.     char* base;
  9.     char* top;
  10. }node, *pnode;

  11. void Push(pnode);
  12. double Cale(pnode);

  13. void Push(pnode stack)
  14. {
  15.     char ch;
  16.     while ((ch = getchar()) != '\n')
  17.     {
  18.         *(stack->top) = ch;
  19.         stack->top++;
  20.     }
  21. }

  22. double Cale(pnode stack)
  23. {
  24.     int n = 0;
  25.     double count = 0;
  26.     --stack->top;
  27.     //while (stack->base != stack->top)
  28.     while (stack->base <= stack->top)
  29.     {
  30.         //count += pow(((double)*(stack->top)-'0'), n);
  31.         count += (*stack->top - '0') * pow(2, n);
  32.         stack->top--;
  33.         n++;
  34.     }
  35.     return count;
  36. }

  37. //int mian(void)
  38. int main(void)
  39. {
  40.     pnode stack=(pnode)malloc(sizeof(node));
  41.     double count;
  42.     stack->base = (char*)malloc(StackSize * sizeof(char));
  43.     //if (stack->base)
  44.     if (!stack->base)
  45.     {
  46.         free(stack);
  47.         exit(0);
  48.     }
  49.     stack->top = stack->base;
  50.     stack->stacksize = StackSize;

  51.     printf("请输入一个二进制数:");
  52.     Push(stack);

  53.     printf("正在计算...\n");
  54.     count = Cale(stack);

  55.     printf("转换为十进制为%lf\n", count);

  56.     free(stack->base);
  57.     free(stack);
  58.     return 0;
  59. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 18:59:57 | 显示全部楼层
40 行的 main 写成了 mian
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-14 20:32:26 | 显示全部楼层    本楼为最佳答案   
1. 这不是C语言么?.cpp 后缀是 C++,.c 后缀才是C语言
2. 二进制转十进制的算法不对
3. 循环结束条件不对
4. 使用了错误的栈顶元素
5. 申请了内存不释放
6. mian 可还行
7. 自己写代码不认真,别人也没办法

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>

  4. #define StackSize 100

  5. typedef struct Node
  6. {
  7.     int stacksize;
  8.     char* base;
  9.     char* top;
  10. }node, *pnode;

  11. void Push(pnode);
  12. double Cale(pnode);

  13. void Push(pnode stack)
  14. {
  15.     char ch;
  16.     while ((ch = getchar()) != '\n')
  17.     {
  18.         *(stack->top) = ch;
  19.         stack->top++;
  20.     }
  21. }

  22. double Cale(pnode stack)
  23. {
  24.     int n = 0;
  25.     double count = 0;
  26.     --stack->top;
  27.     //while (stack->base != stack->top)
  28.     while (stack->base <= stack->top)
  29.     {
  30.         //count += pow(((double)*(stack->top)-'0'), n);
  31.         count += (*stack->top - '0') * pow(2, n);
  32.         stack->top--;
  33.         n++;
  34.     }
  35.     return count;
  36. }

  37. //int mian(void)
  38. int main(void)
  39. {
  40.     pnode stack=(pnode)malloc(sizeof(node));
  41.     double count;
  42.     stack->base = (char*)malloc(StackSize * sizeof(char));
  43.     //if (stack->base)
  44.     if (!stack->base)
  45.     {
  46.         free(stack);
  47.         exit(0);
  48.     }
  49.     stack->top = stack->base;
  50.     stack->stacksize = StackSize;

  51.     printf("请输入一个二进制数:");
  52.     Push(stack);

  53.     printf("正在计算...\n");
  54.     count = Cale(stack);

  55.     printf("转换为十进制为%lf\n", count);

  56.     free(stack->base);
  57.     free(stack);
  58.     return 0;
  59. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-14 20:36:28 | 显示全部楼层
8. 判断是否成功申请内存写错了,而且一个判断一个不判断
写代码一定要认真
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-15 09:03:47 | 显示全部楼层
本帖最后由 焦糖橙子 于 2021-8-15 09:10 编辑
人造人 发表于 2021-8-14 20:32
1. 这不是C语言么?.cpp 后缀是 C++,.c 后缀才是C语言
2. 二进制转十进制的算法不对
3. 循环结束条件不 ...


那个46行stack如果是node类型,是不是就不用分配内存空间了?
会自动初始化吗?还是也要申请内存空间初始化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-15 09:11:29 | 显示全部楼层
焦糖橙子 发表于 2021-8-15 09:03
那个46行stack可以不申请内存空间吗?
然后直接对stack->base申请内存空间

不申请内存怎么使用?
建议学一学汇编语言,你对内存的理解不够,在C语言指针这里的使用 不理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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