august 发表于 2007-8-7 15:15:15

问插入的问题

void insert()
{
struct list *p1,*p2,*p3;
float x1;
p2=head;
p1=(struct list *)malloc(sizeof(struct list));
printf("please enter new number:");
scanf("%d",&p1->num);
printf("please enter the score:");
scanf("%f",&x1);
p1->cash=x1;
if(head==NULL)
    {
    head=p1;
    p1->next=NULL;
    }
    else
    {
      while(p1->num>p2->num && p2->next!=NULL)
      {
         p3=p2;                                    // p3接收p2的前一个值
         p2=p2->next;
      }
      if(p1->num<p2->num)
      {
      if(p2==head)
      {
          head=p1;
          p1->next=p2;
      }
      else
      {
          p3->next=p1;
          p1->next=p2;
      }
      }
      else
      {
      p2->next=p1;
      p1->next=NULL;
      }
    }
}
这个根据num大小插入数据的函数
如果按这个写法,比如已输入数据:
num:1score:10
num:2score:20
num:3score:30
在这已有的数据上,如果用这个插入函数输入num:2   score:25 全部数据就变成
num:1score:10
num:2score:20
num:2score:25
num3就不见了,为什么会这样呢?
如果在这句 if(p1->num<p2->num)
把< 改为 <= 才不会把 num3去掉,到底是什么原因呢?

coolpay64 发表于 2007-8-7 18:41:35

先說一點小的。。。
p1=(struct list *)malloc(sizeof(struct list));
最好改成p1=new list;
因為new能夠被overload,也是一種比較安全的記憶体管理用語
可以開相關的include檔看看(真的,new Keyword是有定義的)

還有,可以貼struct list的定義嗎?
LZ的帖只有一小部份,很難理解問題在那兒

某的猜測是這樣的
一開始while(p1->num>p2->num &&...這兒
如果輸入了第一組數据
插入的指針便指到了num:2的資料的位置
而看看插入一段中
          head=p1;
          p1->next=p2;
是入頭
不在這程況下
      p3->next=p1;
          p1->next=p2;
是入p1 < p2的情況,可是這時num=2,2<2是錯的
不在這程況下
只餘下
      p2->next=p1;
      p1->next=NULL;
結果新入的一項指向了NULL,而沒有指向num=3的一項
但如果條件改成<=
      p3->next=p1;
          p1->next=p2;
是入p1 <= p2的情況,這時num=2 , 2<=2在這程況下,便能夠指向num=3的一項

august 发表于 2007-8-8 00:38:35

好像有点懂了

coolpay64 发表于 2007-8-8 10:48:13

只是條件的情況考慮少了一項
最重要記著 !(a < b) (not (a smaller than b)) 是和(a>=b)等價而不是和(a>b)等價
页: [1]
查看完整版本: 问插入的问题