焦糖橙子 发表于 2021-8-14 18:45:48

栈的初始化

主函数里面的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;
}

Max472 发表于 2021-8-14 18:59:57

40 行的 main 写成了 mian

人造人 发表于 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;
}

人造人 发表于 2021-8-14 20:36:28

8. 判断是否成功申请内存写错了,而且一个判断一个不判断
写代码一定要认真

焦糖橙子 发表于 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类型,是不是就不用分配内存空间了?
会自动初始化吗?还是也要申请内存空间初始化

人造人 发表于 2021-8-15 09:11:29

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

不申请内存怎么使用?
建议学一学汇编语言,你对内存的理解不够,在C语言指针这里的使用 不理解
页: [1]
查看完整版本: 栈的初始化