有关数据结构算法顺序表的基础题

1,算法的目的:一个线性表L采用顺序存储结构,若其中所有元素为整数,编写算法将所有小于0的数据元素移到所有大于0的元素的前面,要求算法的时间复杂度为O(n),空间复杂度O(1)。
2,系统一直针对函数建表中的L->length=n和初始化函数中L->length=0提警告,而且还一直提示我main函数中局部变量L未初始化,然后运行可以运行,但不是所想要的结果,我对比网上其他的代码,也是这么写,我实在搞不懂。
4解题思路我能理解,但就是运行不来了。然后系统警告我的内容我解决不了。
4,我是用visual studio2022版的编辑器
3错误:请输入5个整数:
-1 2 -3 4 -7
然后就没有出新的结果。
正确:请输入5个整数:
-1 2 -3 4 -7
输出:
-1 -3 -4 2 4

#include<stdio.h>
#include<malloc.h>
#define Maxsize 60
typedef int ElemType;
typedef struct {
    ElemType data[Maxsize];
    int length;
}SqList;
void CreatList_Sq(SqList* L, ElemType a[], int n) {
    L = (SqList*)malloc(sizeof(SqList));
    int i = 0;
    for (i = 0; i < n; i++) {
        L->data[i] = a[i];
    }
    L->length = n;
}
void InitList_Sq(SqList* L) {
    L = (SqList*)malloc(sizeof(SqList));
    L->length = 0;
}
int main() {
    void CreatList_Sq(SqList * L, ElemType a[], int n);
    void InitList_Sq(SqList * L);
    void sort(SqList * L);
    SqList* L= (SqList*)malloc(sizeof(SqList));
    InitList_Sq(L);
    int a[5]={0}, i = 0;
    printf("请输入5个整数:\n");
    for (i = 0; i < 5; i++) {
        scanf_s("%d", &a[i]);
    }
    CreatList_Sq(L, a, 5);
    sort(L);
    for (i = 0; i < L->length; i++) {
        printf("%d", L->data[i]);
    }

}
void sort(SqList* L) {
    int i = 0;
    int j = L->length - 1;
    int temp;
    while (i < j) {
        while (i < j && L->data[j]>0) {
            j--;
        }
        while (i < j && L->data[i] < 0) {
            i++;
        }
        if (i < j) {
            temp = L->data[i];
            L->data[i] = L->data[j];
            L->data[j] = temp;
        }

    }
}

这个就相当于快速排序中的某一趟。而你的L就相当于那个作为哨兵的数值。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答引用GPTᴼᴾᴱᴺᴬᴵ
关于第一个问题,可以使用双指针法,一个指针指向第一个元素,另一个指针指向最后一个元素。从前往后找到第一个大于0的元素,从后往前找到第一个小于0的元素,然后交换它们的位置,直到两个指针相遇。具体实现可以参考以下代码:

void sort(SqList* L) {
    int i = 0;
    int j = L->length - 1;
    int temp;
    while (i < j) {
        while (i < j && L->data[j] > 0) {  // 从后往前找到第一个小于0的元素
            j--;
        }
        while (i < j && L->data[i] < 0) {  // 从前往后找到第一个大于0的元素
            i++;
        }
        if (i < j) {
            temp = L->data[i];
            L->data[i] = L->data[j];
            L->data[j] = temp;
        }
    }
}

关于第二个问题,提示L未初始化可能是因为您在声明函数时使用了L作为参数,而在函数中又使用了malloc来分配空间,这样可能会导致空间泄漏和程序异常。建议在main函数中使用malloc来分配L的空间,并将其作为参数传递给其他函数。具体实现可以参考以下代码:

#include<stdio.h>
#include<stdlib.h>
#define Maxsize 60
typedef int ElemType;
typedef struct {
    ElemType data[Maxsize];
    int length;
}SqList;

void CreatList_Sq(SqList* L, ElemType a[], int n) {
    int i = 0;
    for (i = 0; i < n; i++) {
        L->data[i] = a[i];
    }
    L->length = n;
}

void InitList_Sq(SqList* L) {
    L->length = 0;
}

void sort(SqList* L) {
    int i = 0;
    int j = L->length - 1;
    int temp;
    while (i < j) {
        while (i < j && L->data[j]>0) {
            j--;
        }
        while (i < j && L->data[i] < 0) {
            i++;
        }
        if (i < j) {
            temp = L->data[i];
            L->data[i] = L->data[j];
            L->data[j] = temp;
        }

    }
}

int main() {
    SqList* L = (SqList*)malloc(sizeof(SqList));
    InitList_Sq(L);
    int a[5] = { 0 }, i = 0;
    printf("请输入5个整数:\n");
    for (i = 0; i < 5; i++) {
        scanf_s("%d", &a[i]);
    }
    CreatList_Sq(L, a, 5);
    sort(L);
    for (i = 0; i < L->length; i++) {
        printf("%d ", L->data[i]);
    }
    free(L);
    return 0;
}