编写函数spilit(seqlist a1实现将顺序表a1分裂成两个顺序表a2与a3,a2由表a1中的所有奇数组成,a3由表a1中的所有偶数组成,a1保持不变


#include <stdio.h>
#include <stdlib.h>
#define N 10000
typedef struct link seqlist;
struct link {
    int size;
    int data[N];
};
void spilit(seqlist a1,seqlist *a2,seqlist *a3);
int main() {
    int i;
    seqlist a1,*a2,*a3;
    spilit(a1,a2,a3);
    for(int j=0; j<a2->size; j++) {
        printf("%d",a2->data[j]);
        printf("\n");
    }
    for(int k=0; k<a3->size; k++) {
        printf("%d",a2->data[k]);
        printf("\n");
    }
    return 0;
}
void spilit(seqlist a1,seqlist *a2,seqlist *a3) {
    int i,j=0,k=0;
    printf("请输入a1数据\n");
    for(i=0; i<5; i++) {
        scanf("%d",&a1.data[i]);
    }
    for(i=0; i<5; i++) {
        if((a1.data[i])%2!=0) {
            a2->data[j]=a1.data[i];
            j++;
        } else if((a1.data[i])%2==0) {
            a3->data[k]=a1.data[i];
            k++;
        } else
            break;
    }
    a2->size=j;
    a3->size=k;
}

为什么没法运行啊

参考GPT和自己的思路:

您好!根据您提供的代码,可以发现问题出在没有为顺序表a2和a3分配内存,所以在对它们进行操作时,会发生未知错误。您需要在spilit函数中添加以下语句以分配内存:

a2 = (seqlist*)malloc(sizeof(seqlist));
a3 = (seqlist*)malloc(sizeof(seqlist));

同时,为防止内存泄漏,需要在最后释放内存:

free(a2);
free(a3);

另外,您在测试函数中声明了a2、a3为指针类型,但没有初始化,所以需要在main函数中添加以下语句以初始化:

a2 = (seqlist*)malloc(sizeof(seqlist));
a3 = (seqlist*)malloc(sizeof(seqlist));
a2->size = 0;
a3->size = 0;

最后,您在print语句中输出a2和a3时,发现输出结果都是a2的内容,这是因为您的代码中print语句中输出a3时,写错了变量名,应该为a3->data[k]。

下面是经过调整后的代码,希望可以帮到您:


#include <stdio.h>
#include <stdlib.h>
#define N 10000
typedef struct link seqlist;
struct link {
    int size;
    int data[N];
};
void spilit(seqlist a1, seqlist* a2, seqlist* a3);

int main() {
    int i;
    seqlist a1, *a2, *a3;

    a2 = (seqlist*)malloc(sizeof(seqlist));
    a3 = (seqlist*)malloc(sizeof(seqlist));
    a2->size = 0;
    a3->size = 0;

    spilit(a1, a2, a3);

    printf("奇数部分:\n");
    for (int j = 0; j < a2->size; j++) {
        printf("%d\n", a2->data[j]);
    }

    printf("偶数部分:\n");
    for (int k = 0; k < a3->size; k++) {
        printf("%d\n", a3->data[k]);
    }

    free(a2);
    free(a3);
    return 0;
}

void spilit(seqlist a1, seqlist* a2, seqlist* a3) {
    int i, j = 0, k = 0;

    printf("请输入a1数据\n");
    for (i = 0; i < 5; i++) {
        scanf_s("%d", &a1.data[i], sizeof(int));
    }

    for (i = 0; i < 5; i++) {
        if ((a1.data[i]) % 2 != 0) {
            a2->data[j] = a1.data[i];
            j++;
        }
        else if ((a1.data[i]) % 2 == 0) {
            a3->data[k] = a1.data[i];
            k++;
        }
        else break;
    }

    a2->size = j;
    a3->size = k;
}

希望可以帮到您,如有疑问欢迎再次向我提问。

 
#include <stdio.h>
#include <stdlib.h>
#define N 10000
typedef struct link seqlist;
struct link {
    int size;
    int data[N];
};
void spilit(seqlist a1,seqlist *a2,seqlist *a3);
int main() {
    int i;
    seqlist a1,a2,a3;
    spilit(a1,&a2,&a3);
    for(int j=0; j<a2.size; j++) {
        printf("%d",a2.data[j]);
        printf("\n");
    }
    for(int k=0; k<a3.size; k++) {
        printf("%d",a2.data[k]);
        printf("\n");
    }
    return 0;
}
void spilit(seqlist a1,seqlist *a2,seqlist *a3) {
    int i,j=0,k=0;
    printf("请输入a1数据\n");
    for(i=0; i<5; i++) {
        scanf("%d",&a1.data[i]);
    }
    for(i=0; i<5; i++) {
        if((a1.data[i])%2!=0) {
            a2->data[j]=a1.data[i];
            j++;
        } else if((a1.data[i])%2==0) {
            a3->data[k]=a1.data[i];
            k++;
        } else
            break;
    }
    a2->size=j;
    a3->size=k;
}

seqlist a1,*a2,*a3;
这里a2 a3没有分配空间啊

参考GPT和自己的思路:

你的程序无法运行的原因是在main函数中,你没有为a2和a3分配内存空间。在函数调用spilit(a1,a2,a3)之前,你需要分配内存空间,可以使用malloc函数为a2和a3动态分配内存空间。所以你可以在main函数中添加以下两行代码:

a2 = (seqlist*)malloc(sizeof(seqlist));
a3 = (seqlist*)malloc(sizeof(seqlist));

这样就为a2和a3分配了内存空间,才能正常运行函数spilit。另外,你的程序中存在一些小问题,比如遍历数组的循环条件应该是i<a1.size,而不是i<5;最后两个for循环打印a2和a3的值时,输出a2->data[k]的时候应该改成a3->data[k],这些小问题需要你自己根据上下文进行修改。