这两行给出了错误 - 解除引用不兼容类型的指针。
while(b->next!=NULL ||b->next->next!=NULL)
b=b->next->next;
完整代码
typedef struct NODE
{
int data;
struct node *next;
}node;
void middle(node **head)
{
struct NODE *a = *head;
struct NODE *b = *head;
if(*head==NULL)
{
printf("List Empty\n");
return;
}
while(b->next!=NULL ||b->next->next!=NULL)
{
a=a->next;
b=b->next->next;
}
printf("MID = %d\n", a->data);
}
void find_len(node *head, int n)
{
node *temp = head;
if(temp==NULL)
{
printf("Length = %d\n", n);
return;
}
else
find_len(temp->next, ++n);
}
函数调用main()
middle(&head);
答案 0 :(得分:1)
在struct NODE
的声明中,对struct node
的引用未定义。写得像这样:
typedef struct NODE {
int data;
struct NODE *next;
} node;
此循环条件不正确:
while (b->next!=NULL || b->next->next!=NULL)
当两个术语都不为空时,你只想推进循环:
while (b->next != NULL && b->next->next != NULL)
最后,
*head==NULL
条件永远不会成立。
这是因为你没有指向NULL
的指针。
因此,如果是空列表,head
本身将为NULL
。
所以你需要稍微改写函数的开头,
小心避免空指针取消引用,例如:
node *a, *b;
if (head == NULL)
{
puts("List Empty");
return;
}
a = b = *head;
我还将printf
更改为puts
。
如果您不需要格式化字符串,
并且只想打印一个尾随换行符,puts
更简单。
答案 1 :(得分:0)
除了类型问题,您还要使用||。这意味着当第一个条件为假时它不会短路。换句话说,即使b->next
等于null,执行仍将继续并评估b->next->next
,如果b->next
已经为NULL,这将明显导致错误。
如果你改变你的||到和&&,它会短路。