一个链表合并的问题,请求帮忙!!

wzz_boy 2006-09-25 08:17:12
我写了下列的代码,想实现两个链表的合并,编译时没出错,但结果什么都没有,不知怎么回事!请大家帮我找找原因,谢谢了!
代码如下:


/*两个顺序表的合并*/
#include <stdio.h>
#define OVERFLOW 1
#define ok 1
typedef struct
{
int no;
int grade;
}ElemType;

typedef struct
{
ElemType *elem;
int length;
int ListSize;
}SqList;
/*初始化链表*/
InitList(SqList *pL)
{
pL->ListSize=100;
pL->elem=(ElemType*)malloc(pL->ListSize*sizeof(ElemType));
if(pL->elem==NULL) exit(OVERFLOW); /*如果分配不成功则退出*/
pL->length=0;
}
/*插入函数*/
ListInsert(SqList *pL,ElemType e)
{
int i,j;
if(pL->length>=pL->ListSize) /* 当元素的个数超出表的长度时,重新分配内存*/
{
pL->ListSize=pL->ListSize+10;
pL->elem=(ElemType*)realloc(pL->ListSize*sizeof(ElemType));
}

for(i=0;i<pL->length;i++) /*寻找插入的位置*/
{
if(e.grade>=pL->elem[i].grade)
break;
}
/*位置向后移*/
for(j=pL->length+1;j>i;j--)
{
pL->elem[j].grade=pL->elem[j-1].grade;
pL->elem[j-1].grade=e.grade;
}

return ok;

}

int ListLength(SqList *pL) /*数链表的长度*/
{
int length=0; /*初始化长度为0*/
if(pL->elem!=NULL) /*如果链表中的elem结构体不为NULL 时,则长度自增*/
{
length++;
}

return length; /*返回长度的值*/
}

ElemType GetElem(SqList *pL,int j) /*得到指定的ElemType 元素 j */
{
return pL->elem[j];/*返回所指定的ElemType元素*/;
}


ShowList(SqList*pL) /*显示链表元素*/
{
int i;
for(i=0;i<pL->length;i++){
printf("\n(%d,%d)",pL->elem[i].no,pL->elem[i].grade);
}
}

MergeList(SqList *a,SqList *b) /*合并链表*/
{
int i=1,j=1;
ElemType ai,bj;
int La_len,Lb_len; /*定义链表 a 和b 的长度*/
SqList L; /*定义合并后的链表*/
InitList(&L);
La_len=ListLength(a);
Lb_len=ListLength(b);
while(i<=La_len&&j<=Lb_len) /*当a ,b链表均非空时执行循环*/
{
ai=GetElem(a,i);
bj=GetElem(b,j);
if(ai.grade<=bj.grade) /*ElemType元素ai,bj成绩的比较*/
{
ListInsert(&L,bj);++i;
}
else
{
ListInsert(&L,ai);++j;
}

while(i<=La_len) /*把剩下元素放到L链表后面*/
{
ai=GetElem(a,i++);ListInsert(&L,ai);

}

while(j<=Lb_len)
{
bj=GetElem(b,j++);ListInsert(&L,bj);
}

}
ShowList(&L);

}


main()
{
SqList a;
ElemType e[3];
SqList b;
ElemType f[3];
InitList(&a); /*对链表a的初始化,并赋值*/
e[0].no=1;e[0].grade=88;
ListInsert(&a,e[0]);
e[1].no=2;e[1].grade=83;
ListInsert(&a,e[1]);
e[2].no=3;e[2].grade=68;
ListInsert(&a,e[2]);


InitList(&b); /*对链表b的初始化,并赋值*/
f[0].no=1 ;f[0].grade=74 ;
ListInsert(&b,f[0]);
f[1].no=2 ;f[1].grade=66 ;
ListInsert(&b,f[1]);
f[2].no=3 ;f[2].grade=78 ;
ListInsert(&b,f[2]);


MergeList(&a,&b); /*调用合并函数,打印出合并后的结果*/
getch();

}

...全文
257 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzz_boy 2006-10-04
  • 打赏
  • 举报
回复
谢谢你们!
braveconf 2006-09-25
  • 打赏
  • 举报
回复
b不是无序的,在insert的时候可以控制的。不过你分析的基本对。
修改如下:

#include <stdio.h>
#define OVERFLOW 1
#define ok 1

typedef struct
{
int no;
int grade;
}ElemType;

typedef struct
{
ElemType *elem;
int length;
int ListSize;
}SqList;

/*初始化链表*/
InitList(SqList *pL)
{
pL->ListSize=100;
pL->elem=(ElemType*)malloc(pL->ListSize*sizeof(ElemType));
if(pL->elem==NULL) exit(OVERFLOW); /*如果分配不成功则退出*/
pL->length=0;
}
/*插入函数*/
ListInsert(SqList *pL,ElemType e)
{
int i,j;
#if 0
if(pL->length>=pL->ListSize) /* 当元素的个数超出表的长度时,重新分配内存*/
{
pL->ListSize=pL->ListSize+10;
pL->elem=(ElemType*)realloc(pL->ListSize*sizeof(ElemType));
}
#endif
for(i=0;i<pL->length;i++) /*寻找插入的位置*/
{
if(e.grade>=pL->elem[i].grade)
break;
}
/*位置向后移*/
for(j=pL->length;j>i;j--)
{
pL->elem[j].grade=pL->elem[j-1].grade;

}

pL->elem[j].grade=e.grade;
pL->length++;
return ok;

}

int ListLength(SqList *pL) /*数链表的长度*/
{
int length=0; /*初始化长度为0*/
if(pL->elem!=NULL) /*如果链表中的elem结构体不为NULL 时,则长度自增*/
{
length=pL->length;
}

return length; /*返回长度的值*/
}

ElemType GetElem(SqList *pL,int j) /*得到指定的ElemType 元素 j */
{
return pL->elem[j-1];/*返回所指定的ElemType元素*/;
}


ShowList(SqList*pL) /*显示链表元素*/
{
int i;
for(i=0;i<pL->length;i++){
printf("\n(%d)",pL->elem[i].grade);
}
}

MergeList(SqList *a,SqList *b) /*合并链表*/
{
int i=1,j=1;
ElemType ai,bj;
int La_len,Lb_len; /*定义链表 a 和b 的长度*/
SqList L; /*定义合并后的链表*/
InitList(&L);
La_len=ListLength(a);
Lb_len=ListLength(b);
while(i<=La_len&&j<=Lb_len) /*当a ,b链表均非空时执行循环*/
{
ai=GetElem(a,i);
bj=GetElem(b,j);
if(ai.grade<=bj.grade) /*ElemType元素ai,bj成绩的比较*/
{
ListInsert(&L,bj);++j;
}
else
{
ListInsert(&L,ai);++i;
}
}
while(i<=La_len) /*把剩下元素放到L链表后面*/
{
ai=GetElem(a,i++);ListInsert(&L,ai);

}

while(j<=Lb_len)
{
bj=GetElem(b,j++);ListInsert(&L,bj);
}


ShowList(&L);

}


int main()
{
SqList a;
ElemType e[3];
SqList b;
ElemType f[3];
InitList(&a); /*对链表a的初始化,并赋值*/
e[0].no=1;e[0].grade=88;
ListInsert(&a,e[0]);
e[1].no=2;e[1].grade=83;
ListInsert(&a,e[1]);
e[2].no=3;e[2].grade=68;
ListInsert(&a,e[2]);

ShowList(&a);

printf("The L1:\n");
InitList(&b); /*对链表b的初始化,并赋值*/
f[0].no=1 ;f[0].grade=74 ;
ListInsert(&b,f[0]);
f[1].no=2 ;f[1].grade=66 ;
ListInsert(&b,f[1]);
f[2].no=3 ;f[2].grade=78 ;
ListInsert(&b,f[2]);

ShowList(&b);

printf("The L1:\n");
MergeList(&a,&b); /*调用合并函数,打印出合并后的结果*/
getchar();

return 0;

}
mmmcd 2006-09-25
  • 打赏
  • 举报
回复
pL->elem=(ElemType*)realloc(pL->ListSize*sizeof(ElemType));
语法是错的

/*位置向后移*/
for(j=pL->length+1;j>i;j--)
{
pL->elem[j].grade=pL->elem[j-1].grade;
pL->elem[j-1].grade=e.grade;
}
逻辑是错的
而且pL->length没加一

int ListLength(SqList *pL) /*数链表的长度*/
逻辑是错的


int i=1,j=1;
...
while(i<=La_len&&j<=Lb_len) /*当a ,b链表均非空时执行循环*/
{下标应该从0开始,i<La_len&&j<Lb_len

下面两个while放在循环内是错的
while(i<=La_len) /*把剩下元素放到L链表后面*/
{
ai=GetElem(a,i++);ListInsert(&L,ai);

}

while(j<=Lb_len)
{
bj=GetElem(b,j++);ListInsert(&L,bj);
}

}


e[0].no=1;e[0].grade=88;
ListInsert(&a,e[0]);
e[1].no=2;e[1].grade=83;
ListInsert(&a,e[1]);
e[2].no=3;e[2].grade=68;
ListInsert(&a,e[2]);

b是无序表,跟有序的a合并,结果肯定是错的
InitList(&b); /*对链表b的初始化,并赋值*/
f[0].no=1 ;f[0].grade=74 ;
ListInsert(&b,f[0]);
f[1].no=2 ;f[1].grade=66 ;
ListInsert(&b,f[1]);
f[2].no=3 ;f[2].grade=78 ;

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧