鱼C论坛

 找回密码
 立即注册
查看: 2718|回复: 7

看到它,说明你我有缘,一个初级c 程序员双向链表创建时,出现的异常。

[复制链接]
发表于 2014-8-9 23:40:49 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 风之残月 于 2014-11-10 10:14 编辑
  1. <p>/*</p><p>各路大神,既然看到也算你我有缘,首先感谢你花时间看到这个代码。 </p><p>出现一个小问题, 比如要创建5个结点的链表, 只能输入 两个值,例如 1,2 。然后就是异常, 做好程序返回一个异常的值</p><p>谁能帮忙改进呢?</p><p>*/</p><p>#include<stdio.h>

  2. #include<stdlib.h>  // 包含exit 和 malloc

  3. struct dlist{
  4.         int num ;
  5.         struct dlist *pre ;  //*pre 表示前面的结点
  6.         struct dlist *next ; //*next 表示后面的结点
  7. } ;

  8. typedef struct dlist* pdlist ; // pdlist 代表指针双向链表
  9. #define LEN  sizeof( pdlist )  // LEN 表示双向链表的长度

  10. pdlist  initdlist( pdlist head ) // 返回双向链表的地址
  11. {
  12.     head = ( pdlist )malloc( LEN ) ; // LEN 表示双向链表的长度
  13.     if( head == NULL )
  14.         {
  15.                 printf("memery set error ") ;
  16.                 exit(0 ) ;
  17.         }

  18.         head->pre = NULL ;
  19.     head->next = NULL ;
  20.     return head ;
  21. }
  22. void creatdlistnum ( pdlist head , int numpos ) // c创建numpos ge 结点的双向链表
  23. {
  24.         pdlist q = NULL , p = NULL ;
  25.         int i ;

  26.         p = ( pdlist) malloc( LEN ) ;
  27.         if( p == NULL )
  28.         {
  29.                 printf("first test head is not NULL");
  30.                 exit(0) ;
  31.         }
  32.         head->next = p ;
  33.         p->next = NULL ;
  34.         p->pre = NULL ;
  35.         printf("input the first point value ") ;
  36.         scanf("%d",&p->num) ;                                    // 前面p 算第一个结点
  37.         for( i = 1 ; i < numpos ; i++)
  38.         {
  39.                 q = ( pdlist ) malloc( LEN ) ;
  40.                 if( q == NULL )
  41.                 {
  42.                         printf("error , check out ,second ") ;
  43.                         exit(0) ;
  44.                 }
  45.                 printf("input the list value") ;
  46.                 scanf("%d",&q->num) ;                        // 只能输入两个链表的值 , 其他就不行了

  47.          p->next = q ;  // 这一句和下面这一句不能换
  48.                 q->pre = p ;
  49.                 p = q ;
  50.         }
  51.         p->next = NULL ;


  52. }
  53. void prindlist( pdlist head )
  54. {
  55.         pdlist p = head->next ;
  56.         int i = 0 ;
  57.         printf("print in next order ");
  58.         while( p != NULL )
  59.         {

  60.                 printf("the %d point value %d" , i++, p->num ) ;
  61.                 if( p->next == NULL )
  62.                         break ;
  63.                 else
  64.                         p = p->next ;

  65.         }
  66.         printf("prin in pre order") ;
  67.         i = 0 ;
  68.         while( p != NULL )
  69.         {
  70.                 printf("the %d point value %d", i++ , p->num ) ;
  71.                 if( p->next == NULL        )
  72.                         break ;
  73.                 else
  74.                         p = p->pre ;
  75.         }
  76. }
  77. void freedlist( pdlist head )
  78. {

  79.         pdlist q , p = head->next ;
  80.         while( p != NULL )
  81.         {
  82.                 q = p->next ;
  83.                 free( p ) ;
  84.                 p = q ;
  85.         }
  86.         head->next = NULL ;

  87. }
  88. int main( void )
  89. {
  90.         pdlist head = NULL ;</p><p>int numpos ;</p><p>
  91. head = initdlist( head ) ;</p><p>
  92. printf("input the num value in order to creat num point list") ;</p><p>
  93. scanf("%d",&numpos) ;</p><p>
  94. creatdlistnum( head , numpos ) ; //问题出现在这个函数里</p><p>
  95. prindlist( head ) ;
  96.         freedlist( head ) ; // 释放头结点
  97.         free( head ) ;
  98.         head = NULL ;
  99.         return 0 ;
  100. }
  101. </p>
复制代码


最佳答案

查看完整内容

我在你的基础之上改了一下,以后提交的代码要能运行,你提交的代码中还有,不知道怎么回事。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-8-9 23:40:50 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>  // 包含exit 和 malloc

  3. struct dlist{
  4.         int num ;
  5.         struct dlist *pre ;  //*pre 表示前面的结点
  6.         struct dlist *next ; //*next 表示后面的结点
  7. } ;

  8. typedef struct dlist* pdlist ; // pdlist 代表指针双向链表
  9. //modify by XXXX 20140810
  10. #define LEN  sizeof( struct dlist)  // LEN 表示双向链表的长度

  11. pdlist  initdlist( pdlist head ) // 返回双向链表的地址
  12. {
  13.     head = ( pdlist )malloc( LEN ) ; // LEN 表示双向链表的长度
  14.     if( head == NULL )
  15.         {
  16.             printf("memery set error ") ;
  17.             exit(0 ) ;
  18.         }

  19.         head->pre = NULL ;
  20.                 head->next = NULL ;
  21.                 return head ;
  22. }

  23. void creatdlistnum ( pdlist head , int numpos ) // c创建numpos ge 结点的双向链表
  24. {
  25.         pdlist q = NULL , p = NULL ;
  26.         int i ;

  27.         p = ( pdlist) malloc( LEN ) ;
  28.         if( p == NULL )
  29.         {
  30.                 printf("first test head is not NULL");
  31.                 exit(0) ;
  32.         }
  33.         head->next = p ;
  34.         p->next = NULL ;
  35.                 //modify by XXXXX 20140810
  36.         p->pre = head ;
  37.         printf("input the first point value:") ;
  38.         scanf("%d",&p->num) ;                                    // 前面p 算第一个结点
  39.         for( i = 1 ; i < numpos ; i++)
  40.         {
  41.                 q = ( pdlist ) malloc( LEN ) ;
  42.                 if( q == NULL )
  43.                 {
  44.                         printf("error , check out ,second ") ;
  45.                         exit(0) ;
  46.                 }
  47.                 printf("input the list value:") ;
  48.                 scanf("%d",&q->num) ;                        // 只能输入两个链表的值 , 其他就不行了
  49.                                 //add by XXXX 20140810
  50.                                 q->next = NULL;
  51.                                 q->pre = p ;
  52.                                 p->next = q ;  // 这一句和下面这一句不能换
  53.                 p = q ;
  54.         }
  55.         //p->next = NULL ;


  56. }
  57. void prindlist( pdlist head )
  58. {
  59.         pdlist p = head->next ;
  60.         int i = 0 ;
  61.         printf("print in next order \n");
  62.                 //modify by XXXXX 20140810
  63.         while( p->next != NULL )
  64.         {

  65.                 printf("the %d point value %d\n" , i++, p->num ) ;
  66.                 /*if( p->next == NULL )
  67.                         break ;
  68.                 else*/
  69.                p = p->next ;

  70.         }
  71.                 //add by XXXX 20140810
  72.                 printf("the %d point value %d\n" , i++, p->num ) ;
  73.         printf("print in pre order\n") ;
  74.         i = 0 ;
  75.         while( p->pre != NULL )
  76.         {
  77.                 printf("the %d point value %d\n", i++ , p->num ) ;
  78.                                 //delete by XXXXX 20140810
  79.                 /*if( p->next == NULL)
  80.                         break ;
  81.                 else*/
  82.                 p = p->pre ;
  83.         }
  84. }

  85. void freedlist( pdlist head )
  86. {

  87.         pdlist q , p = head->next ;
  88.         while( p != NULL )
  89.         {
  90.                 q = p->next ;
  91.                 free( p ) ;
  92.                 p = q ;
  93.         }
  94.         head->next = NULL ;

  95. }

  96. int main( void )
  97. {
  98.         pdlist head = NULL ;
  99.                 int numpos ;
  100.                 //1 初始化头结点
  101.                 head = initdlist( head ) ;
  102.                 printf("input the num value in order to creat num point list\n") ;
  103.                 //2 创建结点数
  104.                 scanf("%d",&numpos) ;
  105.                 creatdlistnum( head , numpos ) ; //问题出现在这个函数里
  106.                 prindlist( head ) ;
  107.         freedlist( head ) ; // 释放头结点
  108.         free( head ) ;
  109.         head = NULL ;
  110.         return 0 ;
  111. }
复制代码

我在你的基础之上改了一下,以后提交的代码要能运行,你提交的代码中还有<p>,不知道怎么回事。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-10 00:51:21 | 显示全部楼层
还没有人回答,我先坐庄。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-8-10 07:49:40 | 显示全部楼层
#define LEN  sizeof( pdlist )  // LEN 表示双向链表的长度
这句错了,。。。。。。应该是
#define LEN  sizeof( dlist )
LEN应该是结构体dlist的大小,而不是win32中4个字节指针的大小

评分

参与人数 1鱼币 +1 收起 理由
haovcf + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-8-10 08:55:21 | 显示全部楼层
哎,C,拿着门语言入门的话太烦躁了。

评分

参与人数 1鱼币 +1 收起 理由
haovcf + 1 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-10 20:56:50 | 显示全部楼层
流行语 发表于 2014-8-10 08:56
我在你的基础之上改了一下,以后提交的代码要能运行,你提交的代码中还有,不知道怎么回事。

恩,那个是复制到编辑框里排版的时候,不小心弄得。。感谢热心人
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-10 21:00:32 | 显示全部楼层
elvo 发表于 2014-8-10 07:49
#define LEN  sizeof( pdlist )  // LEN 表示双向链表的长度
这句错了,。。。。。。应该是
#define LEN  ...

虽然你的意思是对的,但我测试了以下 #define LEN  sizeof( dlist ) 是错的,编译器意思是dlist 是没有定义的,用#define LEN sizeof( struct dist ) 就可以通过编译。。正常运行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-10 21:01:31 | 显示全部楼层
miles0918 发表于 2014-8-10 08:55
哎,C,拿着门语言入门的话太烦躁了。

虽然看不懂啥意思,但感谢热心回复。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-11 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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