【问题标题】:C Linked List - pointer to incomplete class is not allowedC 链表 - 不允许指向不完整类的指针
【发布时间】:2016-02-03 16:29:40
【问题描述】:

我正在尝试实现一个包含 char 类型链接列表的堆栈。当我尝试返回在顶部节点中找到的值时,它给了我上面的错误。

代码:

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include "header4AB.h"

typedef struct {
    struct node_t * top;
    int max_size;
    int used_size;
} Stack;

typedef struct node {
    int val;
    struct node * next;
}node_t;


Stack * stack(int max_size) {
    Stack * S = malloc(sizeof(Stack));
    S->top = NULL;
    S->max_size = max_size;
    S->used_size = 0;
    return S;
}

bool push(Stack * S, char p) {
    if (S->used_size != S->max_size) {
            node_t * temp = malloc(sizeof(node_t));
            temp->val = p;
            temp->next = S->top;
            S->top = temp;
            S->used_size++;
        return true;
    }
    return false;
}

bool pop(Stack * S) {
    node_t * temp;
    if (S->top == NULL)
        return false;
    temp = S->top;
    S->top = temp->next;
    free(temp);

    return true;
}

char top(Stack * S) {
    if (S->top != NULL) {
        return S->top->val; //error here
    }
}

我对固定大小堆栈中的链接列表的概念非常陌生,而且我还没有测试我的代码,所以我不知道它是否有效。任何帮助表示赞赏!

【问题讨论】:

  • 您必须在Stack 之前定义node_t,并且使用struct nodenode_t 而不是struct node_t
  • 这真的是你的编译器所说的吗? C 中没有类。
  • @n.m.我猜真正的错误是:错误:取消引用指向不完整类型的指针
  • @n.m 我引用了编译器的错误(Visual Studio Enterprise 2015)......但是 LP 的回答解决了它。
  • 您可能需要启用并阅读compiler warnings

标签: c++ linked-list char visual-studio-2015 stack


【解决方案1】:

结构必须是这样的

typedef struct node {
    int val;
    struct node * next;
}node_t;

typedef struct {
    node_t * top;
    int max_size;
    int used_size;
} Stack;

或者

struct node {
    int val;
    struct node * next;
};

typedef struct {
    struct node * top;
    int max_size;
    int used_size;
}Stack;

Stack * stack(int max_size) {
    Stack * S = malloc(sizeof(Stack));
    S->top = NULL;
    S->max_size = max_size;
    S->used_size = 0;
    return S;
}

bool push(Stack * S, char p) {
    if (S->used_size != S->max_size) {
            struct node * temp = malloc(sizeof(struct node));
            temp->val = p;
            temp->next = S->top;
            S->top = temp;
            S->used_size++;
        return true;
    }
    return false;
}

bool pop(Stack * S) {
    struct node * temp;
    if (S->top == NULL)
        return false;
    temp = S->top;
    S->top = temp->next;
    free(temp);

    return true;
}

char top(Stack * S) {
    if (S->top != NULL) {
        return S->top->val; //error here
    }
}

【讨论】:

  • 就是这样!我不太明白为什么在struct node_t top 行中没有给我一个错误...这使得它更难发现
  • 第一次取消引用该指针时会触发错误。
【解决方案2】:
typedef struct {
    struct node_t * top;   //Here you are using node_t type. To use this you must define this before. This causes you error.
    int max_size;
    int used_size;
} Stack;

解决:

Stack 中使用之前声明node_t

【讨论】:

    【解决方案3】:

    您的代码中没有定义struct node_t。使用struct nodenode_t,或将所有出现的node_t 更改为node

    在合法语言中,typedef 名称和结构标记位于不同的命名空间中。 Xstruct X 是不相关的(除非程序碰巧typedef struct X X)。

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2021-12-31
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      相关资源
      最近更新 更多