error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'
1、问题说明
PolyNode 声明在 poly.h
头文件中:
#ifndef POLYNOMIALCOMPUTE_POLY_H
#define POLYNOMIALCOMPUTE_POLY_H
struct PolyNode;
typedef struct PolyNode *Polynomial;
void Attach(int c, int e, Polynomial *pRear);
Polynomial PolyAdd(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);
void TestPoly();
#endif //POLYNOMIALCOMPUTE_POLY_H
PolyNode 定义在 poly.c
文件中:
#include "poly.h"
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
struct PolyNode {
Polynomial link; // 指向下一个节点的位置
int expon; // 指数,英文是 exponent
int coef; // 系数,英文是 coefficient
};
// 新增一个节点
void Attach(int c, int e, Polynomial *pRear)
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode)); // 分配空间
P->coef = c; // 对新节点赋值
P->expon = e;
P->link = NULL;
(*pRear)->link = P; // 尾节点指向P
*pRear = P; // 修改 pRear 值
}
int Compare(int Lhs, int Rhs)
{
return Lhs - Rhs;
}
Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
Polynomial front, rear, temp;
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear; // 由 front 记录结果多项式链表头节点
while (P1 && P2)
{ // 当两个多项式都有非零项待处理时
switch (Compare(P1->expon, P2->expon))
{
case 1:
Attach(P1->coef, P1->expon, &rear);
P1 = P1->link;
break;
case -1:
Attach(P2->coef, P2->expon, &rear);
P2 = P2->link;
break;
case 0:
sum = P1->coef + P2->coef;
if (sum) Attach(sum, P1->expon, &rear);
P1 = P1->link;
P2 = P2->link;
break;
}
}
// 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
for(; P1; P1 = P1->link) Attach(P1->coef, P1->expon, &rear);
for(; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear);
rear->link = NULL;
temp = front;
front = front->link; // 令 front 指向结果多项式的第一个非零项
free(temp); // 释放临时空表头节点
return front;
}
void PrintPoly(Polynomial P)
{
Polynomial tmp = P;
for(; tmp; tmp = tmp->link)
{
printf("%d %d ", tmp->coef, tmp->expon);
}
}
void TestPoly()
{
int P1Coef[5] = {3, 4, -1, 2, -1};
int P1expon[5] = {5, 4, 3, 1, 0};
int P2Coef[4] = {2, 1, -7, 1};;
int P2expon[4] = {4, 3, 2, 1};
Polynomial P1, P2;
P1 = (Polynomial)malloc(sizeof(struct PolyNode));
P2 = (Polynomial)malloc(sizeof(struct PolyNode));
Polynomial P1Rear;
P1Rear = P1;
Polynomial P2Rear;
P2Rear = P2;
for (int i = 0; i < 5; ++i)
{
Attach(P1Coef[i], P1expon[i], &P1Rear); // 注意这里传的是地址!!!
}
P1 = P1->link; // 因为第一个节点没有存储数据,所以 P1 要往后挪一位
for (int i = 0; i < 4; ++i)
{
Attach(P2Coef[i], P2expon[i], &P2Rear);
}
P2 = P2->link;
Polynomial res = PolyAdd(P1, P2);
PrintPoly(P1);
printf("\n");
PrintPoly(P2);
printf("\n");
PrintPoly(res);
}
然后是我的 main,就是在这里出的错:
#include "poly.h"
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
// 测试函数
int main()
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode)); // 这里有错
TestPoly();
return 0;
}
错误信息:
error: invalid application of 'sizeof' to incomplete type 'struct PolyNode'
2、解决方案
如果你的目的是隐藏这个结构体(structure)的实现,那么你可以在可以访问到这个结构体的 C 文件(比如上面的 poly.c 文件)中这样做:
struct PolyNode *
init_PolyNode(...)
{
struct PolyNode *P = malloc(sizeof(struct PolyNode));
return P;
}
否则,如果这个结构体的实现不应该被隐藏,换句话说,main
可以合法地进行这样的操作:
P = (PolyNomial)malloc(sizeof(struct PolyNode));
P->expon = 1;
那么,更好的做法是将结构体的定义放在头文件中(本例中是 poly.h
)。