循环单链表头部插入节点函数出现指针类型不兼容警告的排查与解决
循环单链表头部插入节点的指针类型不兼容警告问题
问题描述
编写的循环单链表头部插入节点函数出现以下警告,位置在第21行:
[Warning] assignment from incompatible pointer type
原代码如下:
#include <stdio.h> #include <stdlib.h> struct Node { int info; struct node *next; }; typedef struct Node node; node *head = NULL; node *tail = NULL; void insertAtBeginning() { int i; node *temp = head; node *NewPtr = NULL; NewPtr = (node *)malloc(sizeof(node)); printf("\nEnter a value\n"); scanf("%d", &i); NewPtr -> info = i; NewPtr -> next = NewPtr; //Line 21 if(head == NULL) { head = NewPtr; NewPtr-> next = NewPtr; } else { while(temp -> next != head) { temp = temp->next; } NewPtr -> next = head; temp -> next = NewPtr; head = NewPtr; } }
警告含义
这个警告表示指针赋值时左右类型不兼容:你试图把一种类型的指针赋值给另一种不匹配的指针变量,编译器认为这可能是逻辑错误,因此抛出警告。
问题根源
C语言标识符严格区分大小写:
- 你定义的结构体是
struct Node(首字母大写),随后通过typedef struct Node node将其重命名为node; - 但结构体内部的
next成员被声明为struct node *next(首字母小写),这里的struct node是一个未定义的全新类型,和struct Node不属于同一类型; - 第21行中,
NewPtr是node *(即struct Node *)类型,而NewPtr->next是struct node *类型,两者类型不兼容,因此触发警告。
修复方案
将结构体内部的next成员声明改为struct Node *next;(和结构体名称保持一致),修改后的结构体定义如下:
struct Node { int info; struct Node *next; // 修正为大写的Node };
修正后的完整代码
#include <stdio.h> #include <stdlib.h> struct Node { int info; struct Node *next; }; typedef struct Node node; node *head = NULL; node *tail = NULL; void insertAtBeginning() { int i; node *temp = head; node *NewPtr = NULL; NewPtr = (node *)malloc(sizeof(node)); printf("\nEnter a value\n"); scanf("%d", &i); NewPtr->info = i; if(head == NULL) { head = NewPtr; NewPtr->next = NewPtr; } else { // 找到尾节点(next指向head的节点) while(temp->next != head) { temp = temp->next; } NewPtr->next = head; temp->next = NewPtr; head = NewPtr; } }
(注:同时移除了原代码中第21行的冗余赋值,因为空链表分支里会重新赋值,非空分支里也会覆盖这个值)
内容的提问来源于stack exchange,提问作者Debottam Nath
相关产品推荐
相关产品推荐

