CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  新手乐园

指针的问题!!请教高手

楼主kialo(山河水)2004-09-04 20:11:54 在 C/C++ / 新手乐园 提问

我的代码如下,编译没问题,但运行时却出错。我怀疑是指针的错误,请高手指教。^_^  
   
  #include   <stdio.h>  
  #include   <malloc.h>  
  struct   node  
  {  
  int   data;  
  struct   node   *next;  
  };  
  void   createlist(struct   node   *head)  
  {  
  int   e;  
  struct   node   *p;  
   
  head=(struct   node   *)malloc(sizeof(struct   node));  
  head->next=NULL;  
   
  printf("输入非零数据(遇零结束)\n");  
  scanf("%d",&e);  
  while(e!=0)  
  {  
  p=(struct   node   *)malloc(sizeof(struct   node));  
  p->data=e;  
  p->next=head->next;  
  head->next=p;  
  scanf("%d",&e);  
  }  
  }  
  void   display(struct   node   *head)  
  {  
  while(head->next)  
  {  
  printf("%d\t   ",head->next->data);  
  head=head->next;  
  }  
  printf("\n");  
  }  
   
  int   main()  
  {  
  struct   node   head;  
  createlist(&head);  
  display(&head);  
  return   0;  
  }  
   
  问题点数:20、回复次数:19Top

1 楼fanbest(座天使长)回复于 2004-09-04 20:22:10 得分 0

有了这么一句  
  struct   node   head;  
  createlist(&head);  
  为什么还要来这么一句?  
  head=(struct   node   *)malloc(sizeof(struct   node));Top

2 楼UPCC(杂食动物)回复于 2004-09-04 20:22:17 得分 0

这和我昨晚帮别人改的有些相同,你看看吧。都是一类的  
   
   
  不过记得在释放内存(好象我忘记了)  
   
  #include<stdio.h>  
  #include<stdlib.h>  
  typedef   struct   mylist  
  {  
      int   data;  
      struct   mylist   *next;  
  }mylist;  
   
  mylist   *   insert(int   d,   mylist   *head)/*建立链表就是一个插入数据的过程   */  
  {  
      mylist   *p,*q,*r;  
      p   =   (struct   mylist   *)   malloc(sizeof(struct   mylist));  
      p->data   =   d;  
      p->next   =NULL;  
      if(head   ==   NULL)  
          return   p;  
        q   =   head;  
        /*  
      if(q->data   <   d)  
      {  
          p->next   =   q;  
  return   p;  
      }//这里必须使用双大括号,不然会返回在return   p;  
      */  
        //其实上面这一步没有必要  
      r=   q;  
      //q   =   q->next;  
      while(q   &&   q->data   <   d)  
      {  
            r   =   q;  
            q   =   q->next;  
      }  
      if(r==q)//防止头是已经大了  
      {  
      p->next   =   head;  
      return   p;  
      }  
      if(q)//有时候已经到队为了,这是q==NULL了  
      {  
  r   ->next   =   p;  
  p   ->next   =   q;  
      }  
      else  
      {  
      r->next   =   p;  
      }  
      return   head;  
  }  
   
  mylist   *del(mylist   *head)  
  {  
      mylist   *q,   *r;  
      int   d;  
      printf("del   data:");  
      scanf("%d",&d);  
   
      q   =   head;  
      r   =   q->next;  
      if(q->data   ==   d)  
      {  
            free(q)   ;  
            return   r;  
      }  
      while(   r->data   !=   d   &&   r)  
      {  
            q   =   r;  
            r   =   r->next;  
      }  
      if(r   ==   NULL)   return   head;  
      q->next   =   r->next;  
      free(r);  
      return   head;  
  }  
   
  mylist   *join(mylist   *p,mylist   *q)  
  {  
        mylist   *r=NULL;//不然不会被正常排列  
        while(p)/*因为插入过程会排序,所以可以直接插入数据*/  
        {  
            r=insert(p->data,r);  
            p   =   p->next;  
        }  
        while(q)  
        {  
            r=insert(q->data,r);  
            q   =   q->next;  
        }  
        return   r;  
  }  
  void   print(mylist   *h)  
  {  
        mylist   *temp;  
        temp=h;  
        while(temp)////  
        {  
              printf("%d\n",temp->data);  
              temp   =   temp->next;  
        }  
  }  
  int   main()  
  {  
      /*  
        这里没有初始化会在insert里面  
            if(head   ==   NULL)  
          return   p;  
  出现问题,至少应该在定义时mylist*   head   =   NULL;但这不是你要的。  
      */  
      mylist   *head=(mylist*)malloc(sizeof(mylist));  
      head->data   =   5;//这是先个个数字,不燃是随机值而在insert里对比会有问题(小)  
      head->next   =   NULL;//没有初始化,head->next会是一个随机值  
      /*  
      if(head->next==NULL){printf("ok");  
      exit(0);       }  
      */  
      head=insert(10,head);  
      head=insert(8,head);  
      head=insert(1,head);  
      print(head);  
      printf("del   start\n");  
      head   =   del(head);  
      print(head);  
      printf("join   start\n");  
      mylist*   tmp   =   (mylist*)malloc(sizeof(mylist));  
      tmp->data   =   4;  
      tmp->next   =   NULL;  
      head   =   join(head,tmp);  
      print(head);  
      return   0;  
  }  
  Top

3 楼kialo(山河水)回复于 2004-09-04 21:50:53 得分 0

请问楼上,你怎么不释放内存呢?free()????????Top

4 楼oldjackyone(老兔子)(她妈妈说:以为你真的很帅么???)回复于 2004-09-04 22:35:26 得分 0

楼主,建议你好好看看     UPCC(杂食动物)   (   )   写的那么一段代码,你的那段代码实在是无能为力....  
   
  或者去看看钱能的那本书上的或是老谭的那本书上的链表后,再回头改你的程序。^_^Top

5 楼comebaby(游民)回复于 2004-09-05 01:46:35 得分 0

改成这样就可以了  
  #include   <stdio.h>  
  #include   <malloc.h>  
  struct   node  
  {  
  int   data;  
  struct   node   *next;  
  };  
  void   createlist(struct   node   *&head)  
  {  
  int   e;  
  struct   node   *p;  
   
  head=NULL;  
   
  printf("输入非零数据(遇零结束)\n");  
  scanf("%d",&e);  
  while(e!=0)  
  {  
  p=(struct   node   *)malloc(sizeof(struct   node));  
  p->data=e;  
  p->next=head;  
  head=p;  
  scanf("%d",&e);  
  }  
  }  
  void   display(struct   node   *head)  
  {  
  while(head)  
  {  
  printf("%d\t   ",head->data);  
  head=head->next;  
  }  
  printf("\n");  
  }  
   
  int   main()  
  {  
  struct   node   *head;  
  createlist(head);  
  display(head);  
  return   0;  
  }Top

6 楼prettyladys(我是一个勤奋的男生啊)回复于 2004-09-05 02:45:29 得分 0

好多菜鸟的回答啊。楼上的改得不错。Top

7 楼shmily198(杨琴)回复于 2004-09-05 08:15:11 得分 0

华为火热招聘  
  咨询电话:13510248216                  
   
  时间:             历时一个月(平均每人4~5天)  
  招聘方式:  
  1. 内部推荐  
  2. 网上搜索  
  搜索主要条件:  
  更新日期:     一天内  
  意向岗位:     程序员/软件工程师  
  意向工作地:深圳  
  原工作地:     不限  
  酬薪:             2000~9000(包括面议)  
  年龄:             20~30  
  工作经验:     主要有C/VC开发经验  
  注:名字、联系方式已经显示的是已被登入华为人才库,不用再注意。  
  1. 将搜索的资料登入华为人才库。  
  http://huawei.com/NASApp/hr/myresume/stepone.jsp  
  填写资料注意项:  
  应聘意向:研发类,软件开发  
  应聘职位:软交换通信工程师  
         
   
  这个是错误的  
     
  推荐方式:内部推荐  
  推荐部门:研发类,中研  
  2. 将搜索的资料登入中研招聘工作库(szap33-ds)  
  1) 公司内所有员工均可使用此数据库创建应聘信息,应聘信息文档被首次保存后  
  将自动关闭,同时刷新创建时间,除“处理信息业务部”、“处理信息研究部”、  
  “应聘人联系电话”、“简历”外,该文档的创建人将失去对其他内容的修改权限但保留随时查看处理状态的权限。  
  2)填写真实姓名,中文名用简体字,英文名名在前、姓在后并以一个空格分开。通过重名提示判断创建信息是否重复,同一人信息不得重复录入。  
  3)现所在省市为应聘者目前居留地,除北京、上海、南京、深圳只填城市名外,其他均填省名和市名,但不含省、市字样,包括重庆和天津,如“四川重庆”。  
  4)现工作单位、毕业院校均填写全称。  
  5)员工推荐的信息,渠道选“推荐”;网络下载的信息,渠道选“网络”;应聘者主动投简历或参加招聘会或从“华为电子流”获得的信息,渠道选“自荐”。如渠道选网络,来源就选网站名称,如渠道选自荐,来源就选获得信息的方式或媒体。  
  6)如创建人为中研员工,提供信息部门及处理信息部门均填写本人所在部门;如创建人非中研员工   ,提供信息部门选“技术支援部、中间实验室、市场部或中研外其他部门,处理信息部门选“中研内其他部门”。  
  7)标记“*”号的条目为必填项。  
   
  填写资料注意项:  
  提供信息部门:核心网业务部     固定软交换开发部  
  处理信息部门:核心网业务部     固定软交换开发部  
                          提交信息时请选择“提交研究部接口人”而不是“业务部接口人”  
  您业可以直接联系负责人:杨琴,工号:39507,13510248216  
  Top

8 楼ypengfei(Fuck Japan!!!!!!)回复于 2004-09-05 10:16:07 得分 0

…………Top

9 楼jk01dingxian(蓝光书虫~痛并快乐着~)回复于 2004-09-05 10:24:55 得分 0

#include   <stdio.h>  
  #include   <malloc.h>  
  struct   node  
  {  
  int   data;  
  struct   node   *next;  
  };  
  void   createlist(struct   node   *head)  
  {  
  int   e;  
  struct   node   *p;  
   
  head=NULL;  
   
  printf("输入非零数据(遇零结束)\n");  
  scanf("%d",&e);  
  while(e!=0)  
  {  
  p=(struct   node   *)malloc(sizeof(struct   node));  
  p->data=e;  
  p->next=head->next;  
  head=p;  
  scanf("%d",&e);  
  }  
  }  
  void   display(struct   node   *head)  
  {  
  while(head)  
  {  
  printf("%d\t   ",head->data);  
  head=head->next;  
  }  
  printf("\n");  
  }  
   
  int   main()  
  {  
  struct   node   *head;  
  createlist(head);  
  display(head);  
  return   0;  
  }  
  同时有两个建议注意写代码的格式,缩进之类的;还有函数的最下功能化,一个函数只实现一个功能.Top

10 楼kialo(山河水)回复于 2004-09-05 11:02:29 得分 0

楼上的两位给的代码一样是错误的啊!!还是和以前出的问题一样。  
   
  FT!~~~~~~~~~~~~Top

11 楼xteaj(半桶水)回复于 2004-09-05 11:25:26 得分 0

comebaby和jk01dingxian的程序都不行,head在返回的时候要被改回去的,  
  所以不能这样做。Top

12 楼xteaj(半桶水)回复于 2004-09-05 11:27:16 得分 0

kialo的也不会强,你的insert中也不能给head重新赋值,在函数返回时,会  
  将参数值弹出栈,恢复原值的。Top

13 楼xteaj(半桶水)回复于 2004-09-05 11:29:08 得分 20

include   <stdio.h>  
  #include   <malloc.h>  
  struct   node  
  {  
  int   data;  
  struct   node   *next;  
  };  
  void   createlist(struct   node   *head)  
  {  
  int   e;  
  struct   node   *p;  
   
  printf("输入非零数据(遇零结束)\n");  
  scanf("%d",&e);  
  while(e!=0)  
  {  
  p=(struct   node   *)malloc(sizeof(struct   node));  
  p->data=e;  
  p->next=head->next;  
  head->next=p;  
  scanf("%d",&e);  
  }  
  }  
  void   display(struct   node   *head)  
  {  
  while(head->next)  
  {  
  printf("%d\t   ",head->next->data);  
  head=head->next;  
  }  
  printf("\n");  
  }  
   
  int   main()  
  {  
  struct   node   head;  
  head.next   =   NULL;  
  createlist(&head);  
  display(&head);  
  return   0;  
  }  
  这样应该问题不大。Top

14 楼yji1982(神奇小子)回复于 2004-09-05 11:48:58 得分 0

这个问题可以参考tc目录下include目录中的create.h,del.h,insert.h  
  不知道是原来有的还是我写的  
  如果你没有  
  发邮件给我  
  我给你  
  不过我现在上网不容易,也许要等很久Top

15 楼comebaby(游民)回复于 2004-09-05 14:48:17 得分 0

请大家评判一下,我的程序没有错误!!  
  vc6下测试通过的  
  to   xteaj()    
  1.void   createlist(struct   node   *&head)中head的已经改了,我用的是指针的引用!!!  
   
  2.void   display(struct   node   *head)中头指针是没有必要改动的!!  
  Top

16 楼kialo(山河水)回复于 2004-09-05 19:16:47 得分 0

TO:xteaj()  
  你的代码有漏洞吧!因为你申请分配了内存却没释放。!!!Top

17 楼xteaj(半桶水)回复于 2004-09-05 20:53:49 得分 0

To:kialo  
  这程序并没有要求删除节点,程序结束时会自动释放所有内存的,你放心好了。Top

18 楼xteaj(半桶水)回复于 2004-09-05 20:57:15 得分 0

To:Combaby  
  对不起,我看错了Top

19 楼lirivernick(不知所云)回复于 2004-09-05 21:11:08 得分 0

根据你的函数定义这里我 觉得要这样改  
   
   
  head=(struct   node   *)malloc(sizeof(struct   node));  
  改成  
  (*head)=(struct   node   *)malloc(sizeof(struct   node));  
   
  head->next=NULL  
  改成  
  (*head)->next=NULL  
  Top

相关问题

  • 指针!!!!
  • this指针
  • 指针?
  • 指针
  • 指针
  • 指针!
  • this指针
  • 指针??
  • 指针
  • 指针?

关键词

  • 指针
  • 函数
  • 代码
  • 交换
  • 应聘
  • 渠道
  • 内存
  • 信息
  • 数据
  • head

得分解答快速导航

  • 帖主:kialo
  • xteaj

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo