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