鱼C论坛

 找回密码
 立即注册
查看: 2181|回复: 5

[技术交流] 发现C语言的一个缺陷

[复制链接]
发表于 2014-8-22 11:38:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*
最近在学C 数据结构 , 静态链表 。 其中发现一个小问题
静态链表数组是通过输入的值增加的(值>0) , 创建完成后就是一个插入函数 要输入一个pos 点 value 值,就是插到那个位置, 值是多少。
在创建过程中, 只能输入一个值(因为这个创建函数调用的早), 输入第二值得时候,创建函数就结束了, 然后就是返回一个警告。
因为这第二个值,编译器认为是要插入到静态链表中的值。 所以创建函数结束, 找不到pos 点;
我用的code::block 版本 13.12
欢迎各位小伙伴来讨论C 语言缺陷,一起用口水淹死C语言。
*/
#include<stdio.h>
#define MAXNUM 50
typedef int elemType ;
struct  staticlist{
elemType data ;
int cur ;
}sl[MAXNUM] ;
typedef struct staticlist *psl ;
// 1静态数组初始化
void  initlist( psl L )
{
int i  ;
L[0].data = 0 ; // 0 表示链表中没有有效的第一个元素的位置
for( i = 0 ; i< MAXNUM - 2 ; i++ )
{
  L[i].cur = i + 1 ;
  //printf("L[%d].cur=%d\n",i,L[i].cur) ;
}
L[MAXNUM -2 ].cur = 0 ;
L[MAXNUM-1].data = 0 ;
L[MAXNUM-1].cur = 1 ; // 第一个可以利用的备用空间

}
// 2 创建一个静态链表,输入值 > 0 , 就增加到链表中 ;
void creatstaticlistnum( psl L  )
{
int i = L[0].cur , j  ;
int value ;
    printf("L[0].cur= %d\n",L[0].cur) ;

printf("input a value above 0 to creat static list") ;
while( scanf("%d",&value) && value > 0   )
  {
   if( j > MAXNUM -2 )
    break ;
   L[i].data = value ;
   printf("L[i].cur= %d\n",L[i].cur) ;
           printf("input other value above 0 to creat static list");
           i = L[i].cur ;
           j++ ;
  }
L[i].cur = 0 ;
L[MAXNUM-1].cur = j ;
printf("first free space is %d",L[MAXNUM-1].cur) ;
}

// 遍历静态链表,打印出其中的每一个值
void printstaticlist( psl L )
{
int i = L[0].cur ;
while( i != 0 )
{
  printf("print static list number %d %d\n", i , L[i].data) ;
  i = L[i].cur ;
}
}

// 计算链表的长度,
int  lenstaticlist( psl L )
{
   int listlen  = 0 ;
   int i = L[0].cur ;
   while( i != 0 )
   {
   listlen++ ;
   i = L[i].cur ;

   }
   return listlen ;
}

// 插入链表函数,要求输入 pos ( 那个位置), value( 值是多少)
void insertstaticlistpos( psl L , int pos , int value )
{
if( pos < 1 || pos > lenstaticlist( L ) )
{
  printf("pos value is not proper , please check ") ;
  return ;
}

    int  i = 1 , j  ;
    j = L[0].cur ;
    while( j != 0 )
{
  if( i == pos-1  )
   break ;
  i++ ;
  j = L[j].cur ;
}
i = L[MAXNUM-1].cur ;
L[MAXNUM-1].cur = L[i].cur ;
L[i].data = value ;
L[i].cur = L[j].cur ;
L[j].cur = i ;
}
int main( void )
{
//int pos , value ;
//int lensl ;
initlist( sl ) ; //没问题
creatstaticlistnum( sl ) ; // ok
printstaticlist( sl ) ; // ok
//printf("input a pos value and insert value\n") ;
//scanf("%d%d",&pos,&value) ;
//insertstaticlistpos( sl , pos , value ) ;
//lensl = lenstaticlist( sl ) ;
//printf("the len of the staticlist is %d\n",lensl) ;
//printstaticlist( sl ) ;
return 0 ;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-22 11:45:13 | 显示全部楼层
测试了后,告诉我,为啥会发生这种事?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 18:41:53 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 22:12:53 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-23 14:03:08 | 显示全部楼层
楼主你的程序问题很多,参考一下我改正过得
#include<stdio.h>
#define MAXNUM 50
typedef int elemType ;
struct  staticlist{
elemType data ;
int cur ;
}sl[MAXNUM] ;
typedef struct staticlist *psl ;
// 1静态数组初始化
void  initlist( psl L )
{
int i ;
for( i = 0 ; i< MAXNUM - 2 ; i++ )
{
  L[i].cur = i+1 ;
}
L[MAXNUM -2 ].cur = 0 ;
L[MAXNUM-1].data = 0 ;
L[MAXNUM-1].cur = 1 ; // 第一个可以利用的备用空间
}
/*
void creatstaticlist( psl L , int num )
{
if( num < 0 || num > MAXNUM - 2 )
{
  printf("num value is not right , please check!\n") ;
  return ;
}
int i , j = 0  ;
for( i = 0 ; i< num ; i++ )
{
        j = L[j].cur ;
  printf("input %d pos value \n", i+1 ) ;
  scanf("%d",&L[j].data ) ;
}
L[j].cur = 0 ;
printf("output L[%d].cur= %d\n",i, L[j].cur ) ;
L[MAXNUM-1].cur = num + 1 ;
printf("the first space %d ",L[MAXNUM-1].cur) ;
}
*/
void creatstaticlistnum( psl L  )
{
int j = 0  , i = 0   ;
int value ;
    printf("input value above 0 to creat static list");
while( scanf("%d",&value) && value > 0   )
  {
            i = L[i].cur ;
   L[i].data = value ;
   //printf("%d\n",L[j].data ) ;
   //printf("L[i].cur= %d\n",L[i].cur) ;
           printf("input value above 0 to creat static list");
            if(++j > MAXNUM -2 )
    break ;
  }
L[MAXNUM-1].cur =L[i].cur ;
L[i].cur = 0 ;
printf("first free space is %d",L[MAXNUM-1].cur) ;
}
void printstaticlist( psl L )
{
int i = L[0].cur ;
while( i != 0 )
{
  printf("print static list number %d %d\n", i , L[i].data) ;
  i = L[i].cur ;
}
}
int  lenstaticlist( psl L )
{
   int listlen  = 0 ;
   int i = L[0].cur ;
   while( i != 0 )
   {
   listlen++ ;
   i = L[i].cur ;
   }
   return listlen ;
}
void insertstaticlistpos( psl L , int pos , int value )
{
int count = 0 , j = 0 , i = MAXNUM-1 ;
if( pos < 1 || pos > lenstaticlist( L ) )
{
  printf("pos value is not proper , please check ") ;
  return ;
}
    i = L[MAXNUM-1].cur ;
    L[MAXNUM-1].cur = L[i].cur ;
L[i].data = value ;

    if( pos == 1 )
  j = 0 ;
else
{
  while( ( j = L[j].cur) != 0  )
  {
   if( ++count == pos -1 )
    break ;
  }
}
    L[i].cur = L[j].cur ;
L[j].cur =  i ;
}
int main( void )
{
int pos , value ;
int lensl ;
//int num ;
initlist( sl ) ; //没问题
//printf("input the num") ;
//scanf("%d",&num ) ;
creatstaticlistnum( sl  ) ; // ok
printstaticlist( sl ) ; // ok
printf("input a pos value and insert value\n") ;
scanf("%d%d",&pos,&value) ;
insertstaticlistpos( sl , pos , value ) ;
lensl = lenstaticlist( sl ) ;
printf("the len of the staticlist is %d\n",lensl) ;
printstaticlist( sl ) ;
return 0 ;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-28 13:57:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 18:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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