haovcf 发表于 2014-8-22 11:38:06

发现C语言的一个缺陷

/*
最近在学C 数据结构 , 静态链表 。 其中发现一个小问题
静态链表数组是通过输入的值增加的(值>0) , 创建完成后就是一个插入函数 要输入一个pos 点 value 值,就是插到那个位置, 值是多少。
在创建过程中, 只能输入一个值(因为这个创建函数调用的早), 输入第二值得时候,创建函数就结束了, 然后就是返回一个警告。
因为这第二个值,编译器认为是要插入到静态链表中的值。 所以创建函数结束, 找不到pos 点;
我用的code::block 版本 13.12
欢迎各位小伙伴来讨论C 语言缺陷,一起用口水淹死C语言。
*/
#include<stdio.h>
#define MAXNUM 50
typedef int elemType ;
structstaticlist{
elemType data ;
int cur ;
}sl ;
typedef struct staticlist *psl ;
// 1静态数组初始化
voidinitlist( psl L )
{
int i;
L.data = 0 ; // 0 表示链表中没有有效的第一个元素的位置
for( i = 0 ; i< MAXNUM - 2 ; i++ )
{
L.cur = i + 1 ;
//printf("L[%d].cur=%d\n",i,L.cur) ;
}
L.cur = 0 ;
L.data = 0 ;
L.cur = 1 ; // 第一个可以利用的备用空间
}
// 2 创建一个静态链表,输入值 > 0 , 就增加到链表中 ;
void creatstaticlistnum( psl L)
{
int i = L.cur , j;
int value ;
    printf("L.cur= %d\n",L.cur) ;
printf("input a value above 0 to creat static list") ;
while( scanf("%d",&value) && value > 0   )
{
   if( j > MAXNUM -2 )
    break ;
   L.data = value ;
   printf("L.cur= %d\n",L.cur) ;
         printf("input other value above 0 to creat static list");
         i = L.cur ;
         j++ ;
}
L.cur = 0 ;
L.cur = j ;
printf("first free space is %d",L.cur) ;
}
// 遍历静态链表,打印出其中的每一个值
void printstaticlist( psl L )
{
int i = L.cur ;
while( i != 0 )
{
printf("print static list number %d %d\n", i , L.data) ;
i = L.cur ;
}
}
// 计算链表的长度,
intlenstaticlist( psl L )
{
   int listlen= 0 ;
   int i = L.cur ;
   while( i != 0 )
   {
   listlen++ ;
   i = L.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 ;
}
    inti = 1 , j;
    j = L.cur ;
    while( j != 0 )
{
if( i == pos-1)
   break ;
i++ ;
j = L.cur ;
}
i = L.cur ;
L.cur = L.cur ;
L.data = value ;
L.cur = L.cur ;
L.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 ;
}

haovcf 发表于 2014-8-22 11:45:13

测试了后,告诉我,为啥会发生这种事?

动若苍龙 发表于 2014-8-22 18:41:53

谢谢分享

破ID 发表于 2014-8-22 22:12:53

我只是路过打酱油的。

haovcf 发表于 2014-8-23 14:03:08

楼主你的程序问题很多,参考一下我改正过得
#include<stdio.h>
#define MAXNUM 50
typedef int elemType ;
structstaticlist{
elemType data ;
int cur ;
}sl ;
typedef struct staticlist *psl ;
// 1静态数组初始化
voidinitlist( psl L )
{
int i ;
for( i = 0 ; i< MAXNUM - 2 ; i++ )
{
L.cur = i+1 ;
}
L.cur = 0 ;
L.data = 0 ;
L.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.cur ;
printf("input %d pos value \n", i+1 ) ;
scanf("%d",&L.data ) ;
}
L.cur = 0 ;
printf("output L[%d].cur= %d\n",i, L.cur ) ;
L.cur = num + 1 ;
printf("the first space %d ",L.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.cur ;
   L.data = value ;
   //printf("%d\n",L.data ) ;
   //printf("L.cur= %d\n",L.cur) ;
         printf("input value above 0 to creat static list");
            if(++j > MAXNUM -2 )
    break ;
}
L.cur =L.cur ;
L.cur = 0 ;
printf("first free space is %d",L.cur) ;
}
void printstaticlist( psl L )
{
int i = L.cur ;
while( i != 0 )
{
printf("print static list number %d %d\n", i , L.data) ;
i = L.cur ;
}
}
intlenstaticlist( psl L )
{
   int listlen= 0 ;
   int i = L.cur ;
   while( i != 0 )
   {
   listlen++ ;
   i = L.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.cur ;
    L.cur = L.cur ;
L.data = value ;

    if( pos == 1 )
j = 0 ;
else
{
while( ( j = L.cur) != 0)
{
   if( ++count == pos -1 )
    break ;
}
}
    L.cur = L.cur ;
L.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 ;
}


流月飞星 发表于 2016-11-28 13:57:03

{:10_256:}
页: [1]
查看完整版本: 发现C语言的一个缺陷