C52单片机在使用链表队列时的错误

img


错误图片是这样,请问应该如何改正

#include <REGX52.H>
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct printnode{                      //    队列定义
    unsigned char *numpoint;
    struct printnode *next;
}printnode,*print;


void push(unsigned char *q,print l)      //将地址q放入队列
{
    printnode *lq1,*lq2; 
    if(l->next==NULL) lq1=l->next;
    else {     
         lq1=l->next;
         while(lq1->next!=NULL)
         {
            lq1=lq1->next;
        }
    }
    lq2=(struct printnode*)malloc(sizeof(struct printnode));
    lq2->numpoint=q;
    lq1->next=lq2;
    //lq2->next=NULL;
}
unsigned char* pop(print l)           //弹出一个地址
{
   unsigned char *exam;
   struct printnode *pointexam;
   if(l->next==NULL)  exam=NULL;
   else{
          pointexam=l->next;
       l->next=l->next->next;
       pointexam->next=NULL;
       exam=pointexam->numpoint;
   }
       return exam;
}

你的print是在C文件里定义的,所以h文件里肯定没有这个定义,编译器处理到那里的时候就无法处理。你贴的那段代码倒是没什么问题。
一般应该把类型定义放到头文件里,而且在包含的时候处于前面的位置,这样,后面的头文件里才能使用相应的类型。
就你这段代码来说,应该把
typedef struct printnode{ // 队列定义
unsigned char *numpoint;
struct printnode *next;
}printnode,*print;
放到queue.h那段代码之前

没找到问题编辑,自己回复一下,我后来又试了一下把结构体声明放在函数声明里,这样不行,最后决定把这个子程序去掉,直接把这两个子函数并到主函数去,这样现在的问题就消失了,但在单片机上运行的时候是无法运行的,查了一些资料知道了那个malloc函数是不能在stc89c516的芯片里用的,原因大概是单片机内存有限,且没有相应的硬件,所以无法实现内存管理,直接这么干的话会形成大量碎片内存,导致后续没有足够内存空间,如果想要使用malloc相似的功能需要自己设计一个内存管理软件。

typedef struct printnode{                      //    队列定义
    unsigned char *numpoint;
    struct printnode *next;
}printnode,*print;

定义这里有问题,导致编译器不知道l的类型
不确定C51是否支持这样嵌套定义

看错误提示,应该是QUEUE.H 文件里第4 第5两行里,括号 () 逗号 , 分号 ; 等标点符号,是否中文全角的。

你函数声明在结构声明之前,那它肯定不知道print是什么