幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2227|回复: 3

[通用编程] 问插入的问题

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 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:1  score:10
num:2  score:20
num:3  score:30
在这已有的数据上,如果用这个插入函数输入  num:2   score:25 全部数据就变成
num:1  score:10
num:2  score:20
num:2  score:25
num3就不见了,为什么会这样呢?
如果在这句 if(p1->num<p2->num)
把< 改为 <= 才不会把 num3去掉,到底是什么原因呢?[s:6]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 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的一項

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2007-8-8 00:38:35 | 显示全部楼层
[s:7] 好像有点懂了
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-8 10:48:13 | 显示全部楼层
只是條件的情況考慮少了一項
最重要記著 !(a < b) (not (a smaller than b)) 是和(a>=b)等價而不是和(a>b)等價

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-4 03:57 , Processed in 0.018666 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表