关于#C语言#的问题,如何解决?


#include 
# include  
#define MAXSIZE 100  
typedef struct
{
    int elem[MAXSIZE];
    int length;//最后一个元素在线性表中的下标位置
}SqList;
void CreatList(SqList* L, int length)//创建表
{
    L = (SqList*)malloc(sizeof(SqList));
    if (NULL == L->elem)//内存不够分配,就将null分配给elem。
    {
        printf("动态内存分配失败!\n");
        exit(-1); //终止整个程序
    }
    else
        L->length = 0;
    return;
}
int Is_Empty(SqList* L)//判空
{
    return(L->length == 0);
}
int is_full(SqList* L)//判满
{
    int i;
    if (L->length == MAXSIZE - 1);
    {
        printf("存储空间已满");
        return;
    }
}
bool Insert(SqList* L, int x, int pos)//插入操作,pos表示为插入的位置
{
    int i;
    if (is_full(L))
    {
        printf("不能进行插入操作");
        return false;
    }
    if (pos<1 || pos>L->length + 2)
        return false;
    for (i = L->length;i >= pos - 1;i--)
    {
        L->elem[i + 1] = L->elem[i];
    }
    L->elem[pos - 1] = x;
    L->length++;
    return true;
}
void delete_arr(SqList* L, int pos, int* Val)
{
    int i;

    if (Is_Empty(L))
        return;
    if (pos<1 || pos>L->length + 1)
        return;


    for (i = pos; i < L->length + 1; ++i)//如要删除第三个位置上的值,那么pos=3,那么就需要将第四个位置和第五个位置上的值向前移,那么第四个位置上的下标就为3,所以i=pos=3,i代表从第四个元素开始
    {
        L->elem[i] = L->elem[i + 1];
    }
    L->length--;
    return;
}
void sort_arr(SqList* L)//选择排序
{
    int i, j, t;

    for (i = 0; i < L->length; ++i)
    {
        for (j = i + 1; j < L->length; ++j)
        {
            if (L->elem[i] > L->elem[j])
            {
                t = L->elem[i];
                L->elem[i] = L->elem[j];
                L->elem[j] = t;
                printf("排序后的线性表为:");
                for (int k = 0;k < L.length;k++)
                    printf("%d ", L.elem[k]);
            }
        }
    }
}
int main()
{
    int m, x;
    SqList L;
    printf("请输入线性表元素个数m:");
    scanf_s("%d", &m);
    printf("请输入线性表数据:");
    for (int i = 0;i < m;i++)
        scanf_s("%d", &L.elem[i]);
    L.length = m;
    printf("请输入要插入的元素x:");
    scanf_s("%d", &x);
    Insert(&L, x, 5);
    printf("插入x后的新线性表为:");
    for (int t = 0;t < L.length;t++)
        printf("%d ", L.elem[t]);
    sort_arr(&L);

}

没报错,但是输出却是这个:
请输入线性表元素个数m:5
请输入线性表数据:1 3 5 7 9
请输入要插入的元素x:2
存储空间已满插入x后的新线性表为:1 3 5 7 2 9
E:\vscode\Project93\x64\Debug\Project93.exe (进程 3532)已退出 ,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

请教各位学长学姐我想知道为啥会输出存储空间已满,而且我的排序算法也没有用上

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的代码中,is_full 函数中的 if 语句后面多了一个分号,导致 is_full 函数总是会输出“存储空间已满”,即使线性表并没有满。因此,你需要将 is_full 函数的定义改为:

int is_full(SqList* L)//判满
{
    if (L->length == MAXSIZE - 1)
    {
        printf("存储空间已满");
        return 1;
    }
    else
    {
        return 0;
    }
}

另外,你在 CreatList 函数中为指针 L 动态分配了内存,但是这个指针是函数参数,函数执行结束后指针的生命周期也就结束了,不会对调用者函数中的 L 产生任何影响。所以,你需要将 CreatList 函数的定义改为:

void CreatList(SqList* L, int length)//创建表
{
    if (NULL == L->elem)//内存不够分配,就将null分配给elem。
    {
        printf("动态内存分配失败!\n");
        exit(-1); //终止整个程序
    }
    else
    {
        L->length = 0;
    }
    return;
}

这样,你的代码就能够正常运行了。同时,请注意修改 sort_arr 函数中 printf 的位置,否则它会在每次交换后都输出一次排序结果。

修改如下,改动处见注释,供参考:

#include<stdio.h> 
# include <stdlib.h> 
#define MAXSIZE 100  
typedef struct
{
    int elem[MAXSIZE];
    int length;//最后一个元素在线性表中的下标位置
}SqList;
void CreatList(SqList* L, int length)//创建表
{
    L = (SqList*)malloc(sizeof(SqList));
    if (NULL == L->elem)//内存不够分配,就将null分配给elem。
    {
        printf("动态内存分配失败!\n");
        exit(-1); //终止整个程序
    }
    else
        L->length = 0;
    return;
}
int Is_Empty(SqList* L)//判空
{
    return(L->length == 0);
}
int is_full(SqList* L)//判满
{
    int i;
    if (L->length == MAXSIZE - 1)  //; 修改 ';'分号多余
    {
        printf("存储空间已满\n");
        return  1;   //return; 修改
    }
    return 0;       // 修改  未满需返回值
}
bool Insert(SqList* L, int x, int pos)//插入操作,pos表示为插入的位置
{
    int i;   
    if (is_full(L))
    {
        printf("不能进行插入操作\n");
        return false;
    }
    if (pos<1 || pos>L->length + 2)
        return false;
    for (i = L->length; i >= pos - 1; i--) //for (i = L->length; i >= pos - 1; i--) 修改
    {
        L->elem[i] = L->elem[i - 1];     //L->elem[i + 1] = L->elem[i];             修改
    }
    L->elem[pos - 1] = x;
    L->length++;
    return true;
}
void delete_arr(SqList* L, int pos, int* Val)
{
    int i;

    if (Is_Empty(L))
        return;
    if (pos<1 || pos>L->length + 1)
        return;

    for (i = pos; i < L->length + 1; ++i)//如要删除第三个位置上的值,那么pos=3,那么就需要将第四个位置和第五个位置上的值向前移,那么第四个位置上的下标就为3,所以i=pos=3,i代表从第四个元素开始
    {
        L->elem[i] = L->elem[i + 1];
    }
    L->length--;
    return;
}
void sort_arr(SqList* L)//选择排序
{
    int i, j, t;

    for (i = 0; i < L->length - 1; ++i)  //for (i = 0; i < L->length; ++i) 修改
    {
        for (j = i + 1; j < L->length; ++j)
        {
            if (L->elem[i] > L->elem[j])
            {
                t = L->elem[i];
                L->elem[i] = L->elem[j];
                L->elem[j] = t;
            }
        }
    }
    printf("排序后的线性表为:\n");
    for (int k = 0; k < L->length; k++)  //for (int k = 0; k < L.length; k++) 修改
        printf("%d ", L->elem[k]);        //printf("%d ", L.elem[k]);        修改
    printf("\n");
}
int main()
{
    int m, x;
    SqList L;
    printf("请输入线性表元素个数m:");
    scanf_s("%d", &m);
    printf("请输入线性表数据:");
    for (int i = 0; i < m; i++)
        scanf_s("%d", &L.elem[i]);
    L.length = m;
    printf("请输入要插入的元素x:");
    scanf_s("%d", &x);
    Insert(&L, x, 5);
    printf("插入x后的新线性表为:\n");
    for (int t = 0; t < L.length; t++)
        printf("%d ", L.elem[t]);
    printf("\n");                   //修改
    sort_arr(&L);

}