首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

菜鸟有关问题。江湖救急(都没分了哦。555555),

2012-04-05 
初学者问题。。。江湖救急(都没分了哦。。。555555),,#######################################################

初学者问题。。。江湖救急(都没分了哦。。。555555),,##########################################################################
#include   <stdio.h>
#include   <stdlib.h>
#define   list_init_size   100                                               //初始化空间大小。。。
typedef   struct  
{
int   *   elem   ;                                                                           //存储线性表的基地址。。。。
int   length;                                                                             //线性表元素的个数。。。。
int   listsize   ;                                                                       //初始化空间大小。。。
}     sqlist   ;

int   listinit(sqlist   *a,sqlist   *b)                                   //新键   a表。。。。和。。。。b表。。。。                                                                  
{
a-> elem=(int   *)malloc(list_init_size*sizeof(int   ))   ;             //对a表进行开空间。,,,
if(a-> elem==NULL)                                                                                   //判断。。。。如果没有开成功。。就。。。。
return   0   ;
a-> length=NULL;                                                                                     //使表长为   0  
a-> listsize=list_init_size;                                                             //分配初始化大小。。。。


b-> elem=(int   *)malloc(list_init_size*sizeof(int   ));           //对b表进行开空间。,,,              
if(b-> elem==NULL)                                                                                 //判断。。。。如果没有开成功。。就。。。。
return   0   ;
b-> length=NULL;                                                                                       //使表长为   0  


b-> listsize=list_init_size;                                                                   //分配初始化大小。。。。

return   1   ;

}

int   mergelist(sqlist   *a,sqlist   *b,sqlist   *c)                                 //     ...对a....b,,,,2个线性表进行合并。。。。
{
c-> elem=(int   *)malloc(list_init_size*sizeof(int   ))   ;                       //对c线性开空间。。。。。      
if(c-> elem==NULL)                                                                                             //判断。。。。如果没有开成功。。就。。。。
return   0   ;
c-> length=a-> length+b-> length;                           //c空间的元素个数的长度等于。。a空间的元素个数的长度+b空间的元素个数的长度。。。
c-> listsize=a-> listsize+b-> listsize;                                                     //c空间的长度等于。。a空间的长度+b空间的长度。。。                                                              

int   *la,*lb;                                                                 //定义   la,lb     两个指针。用于找到,,a表和b表的末位置。。
int   i;


la=a-> elem+a-> length-1;                                           //   a   表的末位置给la...                    
lb=b-> elem+b-> length-1;                                             //b表的末位置给lb..
while(a-> elem <=la     &&     b-> elem <=lb)                 //进行2个表的合并。。。。
if(a-> elem <=b-> elem)                                               //如果a表元素小于b表的元素。。。就把a表的一个元素放到c表中。。
{
*(c-> elem++)=*(a-> elem++);
}
else
{*(c-> elem++)=*(b-> elem++);


}
while(a-> elem   <=   la)                                               //把没有放完的继续放进去。。。
*(c-> elem++)=*(a-> elem++);

while(b-> elem <=lb)
*(c-> elem++)=*(b-> elem++);
return   1;


}

main()
{
sqlist   l,m,n;                              


int   i,j,k;
listinit(&l,&m);
for(i=0;i <10;i++)                                   //输入10个元素放入a表。。。
{
scanf( "%d ",&l.elem[i]);
l.length++;                                                   //每循环一次。。。长度加1。。。

}
for(j=0;j <10;j++)                                             //输入10个元素放入b表。。。
{
scanf( "%d ",&m.elem[j]);
m.length++;                                               //每循环一次。。。长度加1。。。

}

mergelist(&l,&m,&n);
for(k=0;k <=n.length-1;k++)               //输出合并的的元素。。                  
printf( "%d ",n.elem[k]);
return   1;


}


    编译没有错哦。。。算法错了。。帮忙哦。。。。!!~~

    两个线性表的合并。。。

[解决办法]
#include <stdio.h>
#include <stdlib.h>
#define list_init_size 100 //初始化空间大小。。。

//这里修改了
typedef struct qlist
{
int * elem ; //存储线性表的基地址。。。。
int length; //线性表元素的个数。。。。
int listsize ; //初始化空间大小。。。
} sqlist ;

int listinit(sqlist *a, sqlist *b) //新键 a表。。。。和。。。。b表。。。。
{
a-> elem=(int *)malloc(list_init_size*sizeof(int )) ; //对a表进行开空间。,,,
if(a-> elem==NULL) //判断。。。。如果没有开成功。。就。。。。
return 0 ;
a-> length=0; //使表长为 0
a-> listsize=list_init_size; //分配初始化大小。。。。


b-> elem=(int *)malloc(list_init_size*sizeof(int )); //对b表进行开空间。,,,
if(b-> elem==NULL) //判断。。。。如果没有开成功。。就。。。。
return 0 ;
b-> length=0; //使表长为 0
b-> listsize=list_init_size; //分配初始化大小。。。。

return 1 ;

}

int mergelist(sqlist *a,sqlist *b,sqlist *c) // ...对a....b,,,,2个线性表进行合并。。。。
{
//这里修改了,加了这个,
int *temp = c-> elem =(int *)malloc(list_init_size*sizeof(int )) ; //对c线性开空间。。。。。
if(c-> elem==NULL) //判断。。。。如果没有开成功。。就。。。。
return 0 ;
c-> length=a-> length+b-> length; //c空间的元素个数的长度等于。。a空间的元素个数的长度+b空间的元素个数的长度。。。
c-> listsize=a-> listsize+b-> listsize; //c空间的长度等于。。a空间的长度+b空间的长度。。。

int *la,*lb; //定义 la,lb 两个指针。用于找到,,a表和b表的末位置。。



la=a-> elem+a-> length-1; // a 表的末位置给la...
lb=b-> elem+b-> length-1; //b表的末位置给lb..
printf( "****%d\n ", c-> length);

while(a-> elem <=la && b-> elem <=lb) //进行2个表的合并。。。。
{
printf( "------------\n ");
//这里修改了
if(*(a-> elem) <=*(b-> elem)) //如果a表元素小于b表的元素。。。就把a表的一个元素放到c表中。。


{
*(c-> elem++)=*(a-> elem++);
}
else
{
*(c-> elem++)=*(b-> elem++);
}
}
while(a-> elem <= la) //把没有放完的继续放进去。。。
*(c-> elem++)=*(a-> elem++);

while(b-> elem <=lb)
*(c-> elem++)=*(b-> elem++);

//这里修改了,,没有这个导致出问题
//原因是因为你把c-> elem当成元素的开始,但你在合并时候却把这个移动了,,就是++的操作符号造成的
c-> elem = temp;
return 1;


}

main()
{
sqlist l,m,n;
int i,j,k;
listinit(&l,&m);
//这里修改了,把10变成3
for(i=0;i <3;i++) //输入3个元素放入a表。。。
{
scanf( "%d ", &l.elem[i]);
l.length++; //每循环一次。。。长度加1。。。

}
for(j=0;j <3;j++) //输入3个元素放入b表。。。
{
scanf( "%d ", &m.elem[j]);
m.length++; //每循环一次。。。长度加1。。。

}
//这里修改了
for(k=0;k <3;k++) //打印元素,,以给于检查
printf( "%d ",l.elem[k]);
for(k=0;k <3;k++) //打印元素,,以给于检查
printf( "%d ",m.elem[k]);

mergelist(&l,&m,&n);

printf( "------%d------\n ", n.length);

for(k=0;k <n.length;k++) //输出合并的的元素。。
printf( "%d ",n.elem[k]);

return 1;


}

热点排行