测试没问题 oj除了问题 求大佬帮帮忙
一个合并顺序表的题标准输入数据:
20
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
20
5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62
标准输出答案:
1|List A:3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
2|List B:5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62
3|List C:3 5 6 8 9 11 12 14 15 17 18 20 21 23 24 26 27 29 30 32 33 35 36 38 39 41 42 44 45 47 48 50 51 53 54 56 57 59 60 62
你的错误输出结果:
1|List A:3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60
2|List B:5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62
3|List C:3 5 6 8 9 11 12 14 15 17 18 20 21 23 24 26 27 29 30 32 33 35 36 38 39 41 42 44 45 47 48 50 51 53 54 56 57 59 60 0
我的程序:
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int
typedef int Status;
typedef struct
{
int *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList &L)
{ // 算法2.3
// 构造一个空的线性表L。
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem) return OK; // 存储分配失败
L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
return OK;
} // InitList_Sq
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{ // 算法2.4
// 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength_Sq(L)+1
ElemType *p;
if (i < 1 || i > L.length+1) return ERROR; // i值不合法
if (L.length >= L.listsize) { // 当前存储空间已满,增加容量
ElemType *newbase = (ElemType *)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof (ElemType));
if (!newbase) return ERROR; // 存储分配失败
L.elem = newbase; // 新基址
L.listsize += LISTINCREMENT; // 增加存储容量
}
ElemType *q = &(L.elem[i-1]); // q为插入位置
for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
// 插入位置及之后的元素右移
*q = e; // 插入e
++L.length; // 表长增1
return OK;
} // ListInsert_Sq
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{ // 算法2.5
// 在顺序线性表L中删除第i个元素,并用e返回其值。
// i的合法值为1≤i≤ListLength_Sq(L)。
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR; // i值不合法
p = &(L.elem[i-1]); // p为被删除元素的位置
e = *p; // 被删除元素的值赋给e
q = L.elem+L.length-1; // 表尾元素的位置
for (++p; p<=q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移
--L.length; // 表长减1
return OK;
} // ListDelete_Sq
int Load_Sq(SqList &L)
{
for(int i = 0; i < L.length; i++) printf("%d ",L.elem[i]);
printf("\n");
return OK;
}
int GetElem(SqList L,int i,ElemType &e)
{
e=L.elem[i-1];
return OK;
}
int ListLength(SqList L)
{
return L.length;
}
void ListCombine_Sq(SqList &L1, SqList &L2,SqList &L3)
{
ElemType *p = &(L3.elem[0]);
ElemType *q = &(L1.elem[0]);
ElemType *r = &(L2.elem[0]);
for (int i = 0; i < L1.length + L2.length; i++)
{
if (*q <= *r)
{
*p = *q;
p++;
q++;
}
else
{
*p = *r;
r++;
p++;
}
L3.length++;
}
Load_Sq(L3);
}
int main(void)
{
SqList LA, LB, LC;
InitList_Sq(LA);
InitList_Sq(LB);
InitList_Sq(LC);
int na, nb, ta, tb;
scanf("%d", &na);
for (int i = 0; i < na; i++)
{
scanf("%d", &ta);
ListInsert_Sq(LA,i+1,ta);
}
printf("List A:");
Load_Sq(LA);
scanf("%d", &nb);
for (int i = 0; i < nb; i++)
{
scanf("%d", &tb);
ListInsert_Sq(LB,i+1,tb);
}
printf("List B:");
Load_Sq(LB);
printf("List C:");
ListCombine_Sq(LA,LB,LC);
return 0;
}
这是怎么回事呢?