标题:测试没问题 oj除了问题 求大佬帮帮忙
只看楼主
新月bo
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2020-3-13
结帖率:50%
已结贴  问题点数:20 回复次数:8 
测试没问题 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;
}
这是怎么回事呢?
搜索更多相关主题的帖子: List int return elem length 
2020-03-13 21:28
新月bo
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2020-3-13
得分:0 
只有ListCombine这个函数才是编的 其他都是复制oj上的
2020-03-13 21:48
新月bo
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2020-3-13
得分:0 
回复 2楼 新月bo
不对还有个主函数也是自己编的
2020-03-13 21:50
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:10 
3
1 2 3
3
4 5 6
试试这个,然后悟一下。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-13 21:53
新月bo
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2020-3-13
得分:0 
回复 4楼 forever74
谢谢你! 我这边测试结果为:
3
1 2 3
List A:1 2 3
3
4 5 6
List B:4 5 6
List C:1 2 3 4 5 6
我眼中并没有看到错误
2020-03-13 22:12
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
既然你有一个如此包容的测试环境,我就只能直说了:
你的合并函数复制完1 2 3以后,q仍然在++,下次循环与*r进行比较的*q是越界的,然而你运气太好,那里存放了某个很大的数,所以没有可见后果。

[此贴子已经被作者于2020-3-13 22:55编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-13 22:54
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
参考修正:
if(q<L1.elem+L1.length && *q<=*r || r>=L2.elem+L2.length)

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-13 23:10
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:10 
主要是归并算法的错误,当两个线性表不一样长时,错误就明显了。修改如下应该没问题:
程序代码:
void ListCombine_Sq(SqList &L1, SqList &L2,SqList &L3)
{
    int i;
    ElemType *p = &(L3.elem[0]);
    ElemType *q = &(L1.elem[0]);
    ElemType *r = &(L2.elem[0]);
    for (i =0; i < L1.length + L2.length; i++)
    {
        if(q<(L1.elem+L1.length)&&r<(L2.elem+L2.length))
        {//当最短线性表未比较完时,执行两表比较归并到L3
            if(*q<*r)*p++=*q++;
            else *p++=*r++;
        }
        else
        {//任何一个表已经归并完成,未归并的表数据直接拷贝到L3
            if(q<(L1.elem+L1.length))*p++=*q++;   
            if(r<(L2.elem+L2.length))*p++=*r++;
        }
    }
    L3.length =L1.length +L2.length;
    Load_Sq(L3);
}


[此贴子已经被作者于2020-3-13 23:55编辑过]


能编个毛线衣吗?
2020-03-13 23:27
新月bo
Rank: 2
等 级:论坛游民
帖 子:11
专家分:10
注 册:2020-3-13
得分:0 
谢谢你们的帮助!我大概清楚了,看来我的小白之路还有很长的路程要走啊
2020-03-14 11:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499751-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016448 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved