Runtime Error—顺序表

runtime error(运行时错误)就是程序运行到一半,程序就崩溃了。
大多数情况是因为程序员对内存的理解不透彻导致错误应用引起的
以下为几个常见的:
①除以零的情况,比如1/0此类的。
②数组越界:int a[3]; 但程序中的要求却至少是一个为100的数组。
③指针越界:int * p; p=(int )malloc(5 sizeof(int)); *(p+1000000)=10;
④使用已经释放的空间:int * p; p=(int )malloc(5 sizeof(int));free(p); *p=10;
⑤数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];Runtime error。
日志:今天编程训练顺序表的归并题目, 因为忽视数据范围,导致数组越界,而自己却一直在找语法错误,花费大量时间却没有找到问题所在,最后在借鉴别人代码时发现数组开的相对较小,才侥幸发现自己的错误,因此促使自己反思一直在逃避整理常见错误类型,便借鉴百度,粗略查找了runtime error的常见情况,希望以后能够引以为戒。

以下为题目

顺序表应用5:有序顺序表归并
Time Limit: 100MS Memory Limit: 800KB
Problem Description
已知顺序表A与B是两个有序的顺序表,其中存放的数据元素皆为普通整型,将A与B表归并为C表,要求C表包含了A、B表里所有元素,并且C表仍然保持有序。

Input
输入分为三行:
第一行输入m、n(1<=m,n<=10000)的值,即为表A、B的元素个数;
第二行输入m个有序的整数,即为表A的每一个元素;
第三行输入n个有序的整数,即为表B的每一个元素;

Output
输出为一行,即将表A、B合并为表C后,依次输出表C所存放的元素。
Example Input
5 3
1 3 5 6 9
2 4 10

Example Output
1 2 3 4 5 6 9 10

Hint
自己一开始只定义了10004, 忽视了m+n后最高可达到20000,导致数组越界。
Author

以下为accepted代码

#include <stdio.h>
#include <stdlib.h>
#define MAXN 20004
typedef struct node
{
    int date[MAXN];
    int last;
} st;
st * makeempty()//顺序表的初始化
{
    st *l;
    l = (st *)malloc(sizeof(st));
    l->last = -1;
    return l;
}
st * build(st *l, int len)//顺序表元素的建立
{
    int i;
    for(i = 0; i < len; i++)
    {
        scanf("%d", &l->date[i]);
    }
    l->last = len-1;
    return l;
}
st * merge(st *a, st *b)//顺序表的合并
{
    st *c;
    int i, j, k;
    c = makeempty();//调用顺序表初始化函数
    i = j = k = 0;
    while(i <= a->last && j <= b->last)
    {
        if(a->date[i] < b->date[j])
        {
            c->date[k++] = a->date[i++];
        }
        else
        {
            c->date[k++] = b->date[j++];
        }
    }
    while(i <= a->last)
    {
        c->date[k++] = a->date[i++];
    }
    while(j <= b->last)
    {
        c->date[k++] = b->date[j++];
    }
    free(a);
    free(b);
    c->last = k-1;
    return c;
}
void pri(st *l)//顺序表元素输出函数
{
    int i;
    for(i = 0; i <= l->last; i++)
    {
        printf("%d%c", l->date[i], i == l->last? '\n': ' ');
    }
}
int main()
{
    st *a, *b, *c;
    int n, m;
    scanf("%d %d", &m, &n);
    a = makeempty();//调用顺序表初始化函数
    a = build(a, m);//调用顺序表元素建立函数
    b = makeempty();//调用顺序表初始化函数
    b = build(b, n);//调用顺序表元素建立函数
    c = merge(a, b);//调用顺序表合并函数
    pri(c);//调用顺序表元素输出函数
    return 0;
}


/***************************************************
User name: jk160630
Result: Accepted
Take time: 8ms
Take Memory: 272KB
Submit time: 2017-01-20 23:06:26
****************************************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int data[100010];
    int last;
}st;
st *a, *b, *c;
void creat(st *l)
{
    int i;
    for(i = 0; i <= l->last; i++)
    {
        scanf("%d", &l->data[i]);
    }
}
void bine(st *a, st *b, st *c)
{
    int i, j, k;
    i = 0; j = 0; k = 0;
    while(i <= a->last && j <= b->last)
    {
        if(a->data[i] < b->data[j])
        {
            c->data[k++] = a->data[i++];
        }
        else
        {
            c->data[k++] = b->data[j++];
        }
    }
    if(i > a->last)
    {
        for(j = j; j <= b->last; j++)
        {
            c->data[k++] = b->data[j];
        }
    }
    if(j > b->last)
    {
        for(i = i; i <= a->last; i++)
        {
            c->data[k++] = a->data[i];
        }
    }
    c -> last = k-1;
}
int main()
{
    int m, n, i;
    a = (st *)malloc(sizeof(st));
    b = (st *)malloc(sizeof(st));
    c = (st *)malloc(sizeof(st));
    scanf("%d %d", &m, &n);
    a->last = m-1;
    b->last = n-1;

    creat(a);
    creat(b);
    bine(a,b,c);
    for(i = 0; i <= c->last; i++)
    {
        printf("%d%c", c->data[i], i == c->last? '\n': ' ');
    }
    return 0;
}


/***************************************************
User name: jk160630
Result: Accepted
Take time: 8ms
Take Memory: 280KB
Submit time: 2017-01-20 22:39:31
****************************************************/

以下为runtime error代码

#include <stdio.h>
#include <stdlib.h>
#define MAXN 10004
typedef struct node
{
    int date[MAXN];
    int last;
} st;
st * makeempty()//顺序表的初始化
{
    st *l;
    l = (st *)malloc(sizeof(st));
    l->last = -1;
    return l;
}
st * build(st *l, int len)//顺序表元素的建立
{
    int i;
    for(i = 0; i < len; i++)
    {
        scanf("%d", &l->date[i]);
    }
    l->last = len-1;
    return l;
}
st * merge(st *a, st *b)//顺序表的合并
{
    st *c;
    int i, j, k;
    c = makeempty();//调用顺序表初始化函数
    i = j = k = 0;
    while(i <= a->last && j <= b->last)
    {
        if(a->date[i] < b->date[j])
        {
            c->date[k++] = a->date[i++];
        }
        else
        {
            c->date[k++] = b->date[j++];
        }
    }

    while(i <= a->last)
    {
        c->date[k++] = a->date[i++];
    }

    while(j <= b->last)
    {
        c->date[k++] = b->date[j++];
    }

    c->last = k-1;
    return c;
}
void pri(st *l)//顺序表元素输出函数
{
    int i;
    for(i = 0; i <= l->last; i++)
    {
        printf("%d%c", l->date[i], i == l->last? '\n': ' ');
    }
}
int main()
{
    st *a, *b, *c;
    int n, m;
    scanf("%d %d", &m, &n);
    a = makeempty();//调用顺序表初始化函数
    a = build(a, m);//调用顺序表元素建立函数
    b = makeempty();//调用顺序表初始化函数
    b = build(b, n);//调用顺序表元素建立函数
    c = merge(a, b);//调用顺序表合并函数
    pri(c);//调用顺序表元素输出函数
    return 0;
}


/***************************************************
User name: jk160630
Result: Runtime Error
Take time: 0ms
Take Memory: 0KB
Submit time: 2017-01-20 18:03:26
****************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值