初学者问题。。。江湖救急(都没分了哦。。。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;
}