
c语言单链表问题求大佬看看为什么可以编译运行却没反应 5
#include <stdlib.h>
#include <string.h>
typedef int ElementType;
//定义结点
typedef struct Node{
ElementType Data;
struct Node*Next;
}List;
int length(List*Ptrl);
List*findth(int i,List*Ptrl);
List*findbyvalue(ElementType x,List*Ptrl);
List*insert(ElementType x,int i,List*Ptrl);
List*Delete(List*Ptrl,int i);
int Length(List*Ptrl)
{
int len;
List*p;
len=0;
p=Ptrl;
while(p)
{
p=p->Next;
len++;
}
return len;
}
List*findth(int i,List*Ptrl)
{
List*p;
int cnt=0;
if(i<=0)
return NULL;
p=Ptrl;
while(p)
{
cnt++;
if(cnt==i)
{
return p;
}
p=p->Next;
}
return 0;
}
List*findbyvalue(ElementType x,List*Ptrl)
{
List*p;
p=Ptrl;
while(p)
{
if(p->Data==x)
return p;
}
}
List*insert(ElementType x,int i,List*Ptrl)
{
List*p,*pre;
pre=Ptrl;
p=(List*)malloc(sizeof(List));
p->Data=x;
if(i==1)
{p->Next=Ptrl;
return p;}
else
{
int cnt=1;
pre=Ptrl;
while(pre&&cnt<(i-1)){
pre=pre->Next;
cnt++;
}
if(pre==NULL||cnt!=i-1)
{
printf("插入位置参数错误");
free(p);
return Ptrl;
}
else{
p->Next=pre->Next;
pre->Next=p;
return Ptrl;
}
}
}
List*Delete(List*Ptrl,int i)
{
List*p,*pre;
int cnt=0;
pre=Ptrl;
while(pre&&cnt<i-1){
pre=pre->Next;
cnt++;
}
if(pre==NULL||cnt!=i-1||pre->Next==NULL)
{
printf("删除结点位置错误\n");
return -1;
}
else
{
p=pre->Next;
pre->Next==p->Next;
free(p);
return 0;
}
}
List*createtest()
{
List *head,*second,*third;
head=(List*)malloc(sizeof(List));
head->Data=100;
second=(List* )malloc(sizeof(List));
second->Data=200;
third=(List*)malloc(sizeof(List));
third->Data=300;
head->Next=&second;
second->Next=&third;
third->Next=NULL;
return head;
}
int main(int argc, char *argv[])
{
List*tst;
List*tmp;
int testlen;
tst=(List*)malloc(sizeof(List));
tst=createtest();
testlen=Length(tst);
printf("length 长度为%d",testlen);
tmp=findth(2,tst);
if(tmp)
printf("the %d numberis%d",2,tmp->Data);
else
printf("NULL...");
tmp=findbyvalue(200,tst);
printf("the value is%d",tmp);
return 0;
}
是野指针的问题吗?要怎么改。后面的插入和删除我还没使用 展开
函数Delete的定义中,函数需返回一个List *型指针,return -1;怎能通过编译?
也是在函数Delete的定义中,pre->Next==p->Next;中的==是否应该是=?这同样过不了编译。
函数createtest的定义中,head->Next=&second;和second->Next=&third;中的=号两边的类型匹配吗?比如head->Next是List *型,也就是struct Node *型,而=右边的&second是List **型,也就是struct Node **型(second->Next=&third;存在同样的问题),这咋能通过编译?
findbyvalue这个函数的定义需要返回一个List *型指针,但当if(p->Data==x)不成立时什么都没有返回,会产生执行时逻辑错误。
主函数中的tst=(List *)malloc(sizeof(List));是多余的,紧接着tst被tst=createtest();覆盖,那申请的结点成了永久垃圾,没有办法释放了。
主函数中的tmp=findbyvalue(200,tst);调用,findbyvalue中的while是死循环,因为并没有发现为p->Data赋于200的地方,所以函数永远返回不了。你说的“没反映”很可能由此造成。