为何newNode报未使用变量错误而head无错?还有循环重复输出问题
链表构建问题解答:未使用变量错误与重复打印问题
一、newNode变量的未使用错误原因
编译器报错:
错误:变量“newNode”已赋值但未使用 [-Werror=unused-but-set-variable]
原因很直白:你给newNode赋值了addLast的返回值,但后续代码里完全没用到这个变量的任何值——既没把它传给其他函数,也没读取它的内容。而head不一样,每次调用addLast都会把head作为参数传入,后续循环中head是被实际使用的,所以编译器不会对它报错。
解决方法:
如果addLast的返回值是更新后的链表头节点,你应该把返回值赋值给head(链表的头节点才是整个链表的入口,所有后续操作都要基于它),而非newNode。修改后的else分支应为:
else { head = addLast(head, inputToNode(input)); }
如果addLast返回的是新创建的节点,那要么在后续代码中实际用到newNode(比如遍历、修改节点),要么直接删除newNode变量,没必要赋值。
二、循环重复打印Input: 的问题
问题出在char input[1]和strcmp的搭配使用上:
strcmp是用来比较字符串的,而字符串必须以'\0'作为结束标志。但input[1]的长度只能存1个字符,输入字符后数组里没有空间存放'\0',strcmp会越界读取内存,导致循环条件strcmp(input, "=") != 0的判断结果混乱,进而出现重复打印的情况。
解决方法:
把input的长度改成2,或者在输入后手动添加字符串结束符:
// 方法1:修改数组长度 char input[2]; // 方法2:输入后手动补结束符 char input[1]; scanf(" %c", input); input[1] = '\0'; // 注意:此写法会越界,更推荐方法1
优化后的完整代码示例:
int main() { char input[2]; struct node *head = NULL; do { printf("\nInput: "); scanf(" %c", input); input[1] = '\0'; // 手动补全字符串结束符 if(strcmp(input, "=") != 0) { // 无需区分head是否为空,addLast内部应处理空链表逻辑 head = addLast(head, inputToNode(input)); } } while(strcmp(input, "=") != 0); return 0; }
内容的提问来源于stack exchange,提问作者CaptSellerie
相关产品推荐
相关产品推荐

