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;
}