数据结构之线性表的合并
2014-11-19 19:36
99 查看
今天用C语言实现了数据结构中线性表的合并,即:
已知La与Lb中的数据元素按照非递减排序,将La,Lb的元素合并到Lc中,要求Lc中的数据元素也按照非递减排列。
最初由于粗心,我是这么写的:
void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}
编译并且运行,我希望输出合并后的表Lc,但是结果如图:
并没有按照我的意愿输出合并后的Lc,我进行了仔细的阅读和错误排查(包括单步执行),还是没有找到,
于是我进行了简单的调试在第一个while循环内的if语句中加了一句,printf("hello");如下
void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
printf("hello");
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}
运行结果如下:
于是我意思到时循环控制出了问题,仔细检查发现发生了死循环,问题发生在这里:la+La->length-1))&&(lb<=(lb+Lb->length-1;这是一个简单的逻辑,
每次la都会增加,当然while循环也就不会终止。
改正如下,
void mergeList2(sqlist * La,sqlist * Lb,sqlist * Lc)
{
/*由于不调用已经编写好的函数,所以我们必须自己处理存储空间
分配问题,同事自己取得La与Lb的数据元素进行比较
*/
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(La->elem+La->length-1))&&(lb<=(Lb->elem+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(La->elem+La->length-1)){
*lc++=*la++;
}
while(lb<=(Lb->elem+Lb->length-1)){
*lc++=*lb++;
}
return;
}
运行一下结果正确:
我们千万不可粗心大意,小小的马虎会给自己带来很多麻烦!!!
已知La与Lb中的数据元素按照非递减排序,将La,Lb的元素合并到Lc中,要求Lc中的数据元素也按照非递减排列。
最初由于粗心,我是这么写的:
void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}
编译并且运行,我希望输出合并后的表Lc,但是结果如图:
并没有按照我的意愿输出合并后的Lc,我进行了仔细的阅读和错误排查(包括单步执行),还是没有找到,
于是我进行了简单的调试在第一个while循环内的if语句中加了一句,printf("hello");如下
void mergeList3(sqlist * La,sqlist * Lb,sqlist * Lc)
{
//由于不调用已经编写好的函数,所以我们必须自己处理存储空间
// 分配问题,同事自己取得La与Lb的数据元素进行比较
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(la+La->length-1))&&(lb<=(lb+Lb->length-1))){
if(*la<=*lb){
printf("hello");
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(la+La->length-1)){
*lc++=*la++;
}
while(lb<=(lb+Lb->length-1)){
*lc++=*lb++;
}
return;
}
运行结果如下:
于是我意思到时循环控制出了问题,仔细检查发现发生了死循环,问题发生在这里:la+La->length-1))&&(lb<=(lb+Lb->length-1;这是一个简单的逻辑,
每次la都会增加,当然while循环也就不会终止。
改正如下,
void mergeList2(sqlist * La,sqlist * Lb,sqlist * Lc)
{
/*由于不调用已经编写好的函数,所以我们必须自己处理存储空间
分配问题,同事自己取得La与Lb的数据元素进行比较
*/
elemtype *la,*lb,*lc;
Lc->size=La->length+Lb->length;
Lc->length=La->length+Lb->length;
la=La->elem;
lb=Lb->elem;
Lc->elem=(elemtype*)malloc(Lc->size*sizeof(elemtype));
if(!Lc->elem)
exit(OVERFLOW2);
lc=Lc->elem;
while((la<=(La->elem+La->length-1))&&(lb<=(Lb->elem+Lb->length-1))){
if(*la<=*lb){
*lc++=*la++;
}else{
*lc++=*lb++;
}
}
while(la<=(La->elem+La->length-1)){
*lc++=*la++;
}
while(lb<=(Lb->elem+Lb->length-1)){
*lc++=*lb++;
}
return;
}
运行一下结果正确:
我们千万不可粗心大意,小小的马虎会给自己带来很多麻烦!!!
相关文章推荐
- 数据结构3:检验线性表的基本操作和线性表的合并
- 【数据结构】实验一:线性表的应用---成绩有序表的建立以及合并
- 【数据结构】顺序线性表的插入、删除、合并实现
- 数据结构(3):两个有序线性结构的合并
- 数据结构(3)-线性表顺序结构的合并操作
- 数据结构—2202: 合并链表(线性表)
- 数据结构(5)线性表之链表C++实现带头结点的单链表合并
- 数据结构中线性表的基本操作-合并两个线性表-按照元素升序排列
- 数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
- C#数据结构(一)----线性表
- 数据结构(C#语言版)——线性表
- 数据结构—线性表的链式表示和实现
- 数据结构之线性结构(一,表结构)
- 数据结构线性表的ADT
- 数据结构之线性表
- 数据结构之线性结构(循环链表)【三】
- 数据结构之线性表
- SqlServer合并两张相同结构表的数据
- 数据结构之线性结构(顺序表)【一】
- 数据结构笔记3 线性表的链式表示