c语言某个子函数中的while语句不能执行

题目:建立一个长度为n的带头结点的单链表,在该表中寻找第i个结点,若找到,则输出“OK!”,否则输出“error!”。处理数据类型为整型。

我的代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}List;

void CreatList(List *&L, int n)//建立链表
{
List *P, *S;
int k = sizeof(List);
L = (List *)malloc(k);
S = L;
for (int i = 0; i < n; i++)
{
P = (List *)malloc(k);
scanf("%d", &P->data);
P->next = S;
P = S;
}
P->next = NULL;
}

void Find(List *&L, int item)//查找函数
{
List *P;
P = L;
int k = 0;
while (P->next != NULL)
{
if (P->data == item)
{
k = 1;
break;
}
P = P->next;
}
if (k == 1)
printf("OK!");
else
printf("error!");
}

int main(void)
{
int n, item;//n为链表节点个数,item为要查找的项
List *L;
scanf("%d", &n);
CreatList(L, n);
scanf("%d", &item);
Find(L, item);
return 0;
}

无论测试数据是多少,输出总为error。经检验是Find函数中的while语句没有执行,但我想不通为什么,求大神解答。

链表创建有问题

for循环应该是这样的吧:

for (int i = 0; i < n; i++)
{
    P = (List *)malloc(k);
    scanf("%d", &P->data);
    S->next = P; 
    S = P;
}

这样创建出来的链表包含一个不存任何数据的头结点,因此查找也要修改

if (P->next->data == item)

其余没有什么问题

但有一种情况未考虑,输入链表元素个数为0时,创建链表并未对此作出处理,导致语句

P->next = NULL;

执行时出错,建议添加对n=0情况的处理

追问

哦亲,果然是这样的,一不小心搞错了。谢谢大神 ^-^

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-03
List *&L这是啥意思?L到底是什么?C中没有类似List *&的类型!追问

List是我自定义的类型,L是函数的形参,List *&是传地址引用…………

追答

我肯定知道L是函数形参,也知道List是自定义的,因为C中没有这个类型。但我问的的List*&是什么类型,你可以定义List,但定义不了*&,因为它们是操作符。我再说一遍:C中没有*&这个类型,*&在C++中是“指针的引用”类型,而你问的是“c语言”。现在大多数C语言平台都用C++编译器,这样写当然能通过编译,但它实实在在不是C语言!在C中,想达到同样的效果,只能老老实实用**!

相似回答