题目:建立一个长度为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++)这样创建出来的链表包含一个不存任何数据的头结点,因此查找也要修改
if (P->next->data == item)其余没有什么问题
但有一种情况未考虑,输入链表元素个数为0时,创建链表并未对此作出处理,导致语句
P->next = NULL;
执行时出错,建议添加对n=0情况的处理
追问哦亲,果然是这样的,一不小心搞错了。谢谢大神 ^-^
List是我自定义的类型,L是函数的形参,List *&是传地址引用…………
追答我肯定知道L是函数形参,也知道List是自定义的,因为C中没有这个类型。但我问的的List*&是什么类型,你可以定义List,但定义不了*&,因为它们是操作符。我再说一遍:C中没有*&这个类型,*&在C++中是“指针的引用”类型,而你问的是“c语言”。现在大多数C语言平台都用C++编译器,这样写当然能通过编译,但它实实在在不是C语言!在C中,想达到同样的效果,只能老老实实用**!