标题: 单链表小test遇到的问题 [打印本页]
作者: liuyang 时间: 2012-1-14 03:46
标题: 单链表小test遇到的问题
看了数据结构前几篇按自己思路 写了个单链表的test , 主要是创建和查找的测试。
#include<stdio.h>
#include<malloc.h>
struct list1{
int wdata;
struct list1 *node; //指向下一个连表
};
void create_l(struct list1 &LL,int n) //创建链表
{
struct list1 *p,*q;
int i;
p=(struct list1 *)malloc(sizeof(struct list1));
LL=*p;
for(i=0;i<n;++i)
{
q=(struct list1 *)malloc(sizeof(struct list1));
scanf("%d",&q->wdata);
p->node=q; 前个链表元素的指针域为这个链表元素
p=q; //这个链表元素作为下个链表元素的前一个链表
}
p->node=NULL;
}
struct list1* fdata(struct list1 *b,int aa) //查找数据
{
while((b!=NULL)&&(b->wdata!=aa))
b=b->node;
return b;
}
int main()
{
struct list1 cl;
struct list1* cll;
create_l(cl,5);
cll=fdata(&cl,3);
if (cll==NULL)
{
printf("NO");
}else{
printf("find");
}
return 0;
}
我跑了下VC抛出了异常,于是我打断点看了下发现 fdata()中的b链表没有得到想要的,于是查看create_l()创建链表的函数,
我看了半天没有发现逻辑上的问题,于是单步调试,发现LL的没有指针域没有赋值但是p明明赋了值,甚是奇怪,于是我查看了下 *p与LL看他们原始的内容,发现一致。于是我感到很纳闷,于是又想到看看他们p与&LL的指针的值,发现不一样。突然才恍然大悟。
原来我 只是把p指向的stuct list1的内存拷贝了赋给LL,在后面的操作都是在p指向的内存中作操作,和LL的内存没有任何关系。 这个错误对于我新手来说,还真容易犯啊。
void create_l(struct list1 &LL,int n) //创建链表
{
struct list1 *p,*q,*cl;
int i;
p=(struct list1 *)malloc(sizeof(struct list1));
cl=p; //把链表头地址指针存放起来
for(i=0;i<n;++i)
{
q=(struct list1 *)malloc(sizeof(struct list1));
scanf("%d",&q->wdata);
p->node=q;
p=q;
}
p->node=NULL;
LL=*cl; //把链表头地址的内容拷贝赋给LL,这样下个链表元素的指针也copy 过来了。
}
写双链表的时候才发现这个创建其实是有问题的,代码写多了。改为
void create_l(struct list1 &LL) //创建链表
{
struct list1 *p,*q;
int a;
p=&LL;
scanf("%d",&a);
while(a!=-1) //输入-1为结束
{
q=(struct list1 *)malloc(sizeof(struct list1));
scanf("%d",&q->wdata);
p->node=q; 前个链表元素的指针域为这个链表元素
p=q; //这个链表元素作为下个链表元素的前一个链表
}
p->node=NULL;
}
这样才是正确的,呵呵,果然新手一开始什么问题都怪怪的。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |