已知线性表La和Lb中的数据元素按值非递减有序排列,现要求La和Lb归并排序为Lc
我想知道我这段rank中a和b表的元素为什么只传递了1和2给c,后续就不在执行了?
#define MAX 100
typedef int Status;
int e;
typedef struct {
int data[MAX];
int length;
}Slist;
int insert(Slist *L, int i, int e) {
if (i<1 || i>L->length + 1)
return 0;
for (int j = L->length; j >= i; j--)
L->data[j] = L->data[j-1];
L->data[i - 1] = e;
L->length++;
return true;
}
Status GetElem(Slist* L, int i,int& e){
if (i<0 || i>L->length)
return 0;
e = L->data[i];
return e;
}
Status locate(Slist L,int e) {
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
return i + 1;
return 0;
}
int length(Slist L){
return L.length;
}
Status rank(Slist a,Slist b ) {
int ea;
int eb;
Slist c{};
c.length = 0;
for (int k = 0; k < (a.length+b.length); k++) {
GetElem(&a, k, ea);
GetElem(&b, k, eb);
if (ea <= eb);
insert(&c, k+1, ea);
insert(&c, k+2, eb);
return 0;
}
}
int main() {
Slist La{};
La.length = 0;
Slist Lb{};
Slist Lc{};
Lb.length = 0;
Lc.length = 0;
insert(&La, 1, 1);
insert(&La, 2, 7);
insert(&La, 3, 8);
insert(&Lb, 1, 2);
insert(&Lb, 2, 4);
insert(&Lb, 3, 6);
insert(&Lb, 4, 8);
insert(&Lb, 5, 10);
insert(&Lb, 6, 11);
rank(La,Lb);
}
rank函数的运行结果:
修改完善如下,供参考:
#include <stdio.h>
#define MAX 100
typedef int Status;
int e;
typedef struct {
int data[MAX];
int length;
}Slist;
int insert(Slist* L, int i, int e) {
if (i<1 || i>L->length + 1)
return 0;
for (int j = L->length; j >= i; j--)
L->data[j] = L->data[j - 1];
L->data[i - 1] = e;
L->length++;
return true;
}
Status GetElem(Slist* L, int i, int& e) {
if (i<0 || i>L->length)
return 0;
e = L->data[i];
return e;
}
Status locate(Slist L, int e) {
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
return i + 1;
return 0;
}
int length(Slist L) {
return L.length;
}
Status rank(Slist a, Slist b, Slist* c) { //修改
Status ea, eb, ia = 0, ib = 0, ic = 1;
while (ia < a.length && ib < b.length)
{
GetElem(&a, ia, ea);
GetElem(&b, ib, eb);
if (ea <= eb){
insert(c, ic, ea);
ia++;
}
else {
insert(c, ic, eb);
ib++;
}
ic++;
}
while (ia < a.length) {
GetElem(&a, ia, ea);
insert(c, ic, ea);
ia++; ic++;
}
while (ib < b.length) {
GetElem(&b, ib, eb);
insert(c, ic, eb);
ib++; ic++;
}
return 0;
//Slist c{};
//c.length = 0;
//for (int k = 0; k < (a.length + b.length); k++) {
// GetElem(&a, k, ea);
// GetElem(&b, k, eb);
// if (ea <= eb);
// insert(&c, k + 1, ea);
// insert(&c, k + 2, eb);
// return 0;
//}
}
void print(Slist L) //修改
{
int i;
for (i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
}
int main() {
Slist La{};
La.length = 0;
Slist Lb{};
Lb.length = 0;
Slist Lc{};
Lc.length = 0;
insert(&La, 1, 1);
insert(&La, 2, 7);
insert(&La, 3, 8);
insert(&Lb, 1, 2);
insert(&Lb, 2, 4);
insert(&Lb, 3, 6);
insert(&Lb, 4, 8);
insert(&Lb, 5, 10);
insert(&Lb, 6, 11);
printf("La:");
print(La);
printf("Lb:");
print(Lb);
rank(La, Lb, &Lc);
printf("Lc:");
print(Lc);
return 0;
}
rank函数没有啊,是相当于遍历a,b两个表,然后判断哪个元素比较大,指针后移,直至一个表遍历结束,然后另一个表直接插入即可。上面的rank函数好像没有做这个优化。