标题: 单链表小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