1

这只是一个示例测试,我想在没有重复元素的情况下将列表 Lb 和 La 联合起来。不行,返回-1073741510,我想可能是数组溢出了,但是找不到问题出在哪里

这是我的代码:

#include <stdio.h>

void Union(char *La, char *Lb);
int ListLength(char *L);
void GetElem(char *L, int i, char *e);
int LocateElem(char *L, char *e, int (*comp)(char a, char b));
int compare(char a, char b);
void ListInsert(char *, int, char *);

int main(){
    char *La;
    char *Lb;
    int i;
    for(i = 0; i <= 10; ++i){
        La[i] = i;
        Lb[i] = i + 5;
    }
    La[i] = '\0';
    Lb[i] = '\0';
    Union(La, Lb);
    for(i = 0; La[i] != '\0'; ++i){
        printf("%c\n", La[i]);
    }
    return 0;
}

//unite La and Lb without repeat elements
void Union(char *La, char *Lb){
    int La_length = ListLength(La);
    int Lb_length = ListLength(Lb);
    int i = 0;
    char *e;
    for(i; i<= Lb_length; ++i){
        GetElem(Lb, i, e);
        if(!LocateElem(La, e, compare))
            ListInsert(La, ++La_length, e);
    }
}

//caculate the length of L
int ListLength(char *L){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i);
    return i;
}

void GetElem(char *L, int i, char *e){
    *e = *(L + i);
}

//search the element e in L, if exist return the location, else return 0
int LocateElem(char *L, char *e, int (*comp)(char a, char b)){
    int i;
    for(i = 0; *(L + i) != '\0'; ++i){
        if(comp(*(L + i), *e)) return i + 1;
    }
    return 0;
}

//compare the element a and b
int compare(char a, char b){
    if(a == b) return 1;
    return 0;
}

//if e doesn't exit in L, insert the e in L
void ListInsert(char *L, int i, char *e){
    int j;
    for(j = ListLength(L) - 1; j >= i; --j){
        *(L + j + 1) = *(L + j);
    }
    L[ListLength(L)] = '\0';
    *(L + i - 2) = *e;
}
4

2 回答 2

4

首先,这是错误的:

char *La;
char *Lb;
int i;
for(i = 0; i <= 10; ++i){
    La[i] = i;
    Lb[i] = i + 5;
}

您需要为La和保留内存Lb,例如,将它们声明为:

char La[12];
char Lb[12];

然后这个:

char *e;
for(i; i<= Lb_length; ++i){
    GetElem(Lb, i, e);

应该读:

char e;
for(; i<= Lb_length; ++i){
    GetElem(Lb, i, &e); /* better yet: e=Lb[i] */

最后,您很可能通过使用<=而不是<作为for退出条件循环了太多次。

于 2013-03-29T17:54:00.200 回答
0

你有几个问题。我认为您需要阅读更多关于什么是原始指针、固定长度数组、可变长度数组和动态数组的信息。如果您需要您的数组增长,您可以使用 malloc 和 realloc 使其动态化。或者,您可以使用您知道永远不会溢出的“大”数组。

int La[12]; //  0 to 10, plus '\0'

但这是固定的,不能增长。你可以使用

int La[1000]; // if it solve yours problems

但总的来说,您将需要动态数组。

此外,您需要决定您的数组是否可以容纳0或用作终结器。'\0'并且0,在您使用它的形式中是相等的。您的许多 for 循环不会运行,因为第一个元素是 0。

于 2013-03-29T18:14:27.087 回答