鱼C论坛

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

[已解决]栈的初始化

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

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

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

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

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

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

#define StackSize 100

typedef struct Node
{
        int stacksize;
        char* base;
        char* top;
}node,*pnode;

void Push(pnode);
double Cale(pnode);

void Push(pnode stack)
{
        char ch;
        while ((ch = getchar()) != '\n')
        {
                *(stack->top) = ch;
                stack->top++;
        }
}

double Cale(pnode stack)
{
        int n = 0;
        double count = 0;
        while (stack->base != stack->top)
        {
                count += pow(((double)*(stack->top)-'0'), n);
                stack->top--;
                n++;
        }
        return count;
}

int mian(void)
{
        pnode stack=(pnode)malloc(sizeof(node));
        double count;
        stack->base = (char*)malloc(StackSize * sizeof(char));
        if (stack->base)
        {
                exit(0);
        }
        stack->top = stack->base;
        stack->stacksize = StackSize;

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

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

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

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

#define StackSize 100

typedef struct Node
{
    int stacksize;
    char* base;
    char* top;
}node, *pnode;

void Push(pnode);
double Cale(pnode);

void Push(pnode stack)
{
    char ch;
    while ((ch = getchar()) != '\n')
    {
        *(stack->top) = ch;
        stack->top++;
    }
}

double Cale(pnode stack)
{
    int n = 0;
    double count = 0;
    --stack->top;
    //while (stack->base != stack->top)
    while (stack->base <= stack->top)
    {
        //count += pow(((double)*(stack->top)-'0'), n);
        count += (*stack->top - '0') * pow(2, n);
        stack->top--;
        n++;
    }
    return count;
}

//int mian(void)
int main(void)
{
    pnode stack=(pnode)malloc(sizeof(node));
    double count;
    stack->base = (char*)malloc(StackSize * sizeof(char));
    //if (stack->base)
    if (!stack->base)
    {
        free(stack);
        exit(0);
    }
    stack->top = stack->base;
    stack->stacksize = StackSize;

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

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

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

    free(stack->base);
    free(stack);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-14 18:59:57 | 显示全部楼层
40 行的 main 写成了 mian
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#define StackSize 100

typedef struct Node
{
    int stacksize;
    char* base;
    char* top;
}node, *pnode;

void Push(pnode);
double Cale(pnode);

void Push(pnode stack)
{
    char ch;
    while ((ch = getchar()) != '\n')
    {
        *(stack->top) = ch;
        stack->top++;
    }
}

double Cale(pnode stack)
{
    int n = 0;
    double count = 0;
    --stack->top;
    //while (stack->base != stack->top)
    while (stack->base <= stack->top)
    {
        //count += pow(((double)*(stack->top)-'0'), n);
        count += (*stack->top - '0') * pow(2, n);
        stack->top--;
        n++;
    }
    return count;
}

//int mian(void)
int main(void)
{
    pnode stack=(pnode)malloc(sizeof(node));
    double count;
    stack->base = (char*)malloc(StackSize * sizeof(char));
    //if (stack->base)
    if (!stack->base)
    {
        free(stack);
        exit(0);
    }
    stack->top = stack->base;
    stack->stacksize = StackSize;

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

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

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

    free(stack->base);
    free(stack);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-14 20:36:28 | 显示全部楼层
8. 判断是否成功申请内存写错了,而且一个判断一个不判断
写代码一定要认真
想知道小甲鱼最近在做啥?请访问 -> 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类型,是不是就不用分配内存空间了?
会自动初始化吗?还是也要申请内存空间初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不申请内存怎么使用?
建议学一学汇编语言,你对内存的理解不够,在C语言指针这里的使用 不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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