链表快速排序代码编译报错,请求排查错误原因
先贴出你的代码方便对照:
void quick(NODE low,NODE High){ NODE stan=low, serch=NULL; int pivot,temp if(low==end || low -> Next =high || low == high){return;} serch=stan -> Next; pivot= stan -> data; while(serch != high){ if(serch -> data <= pivot){ if(serch != pivot){ temp= serch -> data; serch -> data =stan -> next ->data; stan -> next ->data=temp; } stan = stan -> Next; } } quick(low, stan); quick(stan -> next,end); }
接下来逐个拆解这些编译错误的原因:
1. [Error] expected '=', ',', ';', 'asm' or '__attribute__' before 'if'
这是最基础的语法疏漏:int pivot,temp这一行末尾缺少分号,导致编译器把后续的if语句当成了变量声明的一部分,直接触发语法错误。
2. 多次出现[Error] invalid type argument of '->' (have 'NODE')
这个错误指向你的NODE类型定义问题:你应该是把NODE定义成了结构体本身(比如typedef struct Node NODE;),而不是结构体指针(typedef struct Node* NODE;)。->运算符只能用于指针类型访问成员,如果是结构体实例,你需要用.运算符;更合理的修正方式是把函数参数改成指针类型:void quick(NODE* low, NODE* High),这样后续的->访问才符合语法规则。
3. [Error] 'high' undeclared (first use in this function)
C语言是大小写敏感的,你函数参数定义的是大写的High,但代码里却用了小写的high(比如low -> Next =high、while(serch != high)),编译器自然会认为high是未声明的变量。
4. [Error] invalid operands to binary != (have 'NODE' and 'int')
这是明显的逻辑错误:serch是链表节点(或节点指针),pivot是int类型的节点值,两者类型完全不匹配,根本无法直接比较。你应该是想判断当前节点serch是否不等于stan->next(因为后面交换的是这两个节点的数据),所以要改成if(serch != stan->next)。
5. [Error] 'temp' undeclared (first use in this function)
这是第1个错误的连锁反应:因为int pivot,temp末尾没加分号,编译器没有正确识别temp是变量,所以后续使用temp时就会报未声明。
6. [Error] incompatible type for argument 2 of 'quick'
结合前面的类型问题,NODE是结构体类型,而stan->next是结构体指针类型(struct NODE*),但你的quick函数参数要求的是NODE类型,自然会出现类型不匹配。解决方法还是把函数参数改成指针类型NODE*,这样传递stan->next就合法了。
7. 其他隐藏的逻辑/语法问题
low -> Next =high这里用了赋值运算符=,而不是比较运算符==,这不仅会触发语法问题,还会直接破坏链表结构,必须改成low->Next == high。- 代码里多次出现的
end变量没有声明,你应该是想使用函数参数High,所以把所有end改成High(注意大小写)。
内容的提问来源于stack exchange,提问作者IronWater

