题目要求:
已知顺序表 L 递增有序,编写程序,将 X 插入到线性表的适当位置上,以保持线性表的有序性。
编程要求 根据提示,在右侧编辑器补充代码,完成顺序表的插入操作。
测试说明 输入说明: 第一行输入顺序表元素个数elenum;(0<elenum<1000) 第二行输入顺序表 L ; 第三行输入插入值 X 。
输出说明: 输出插入 X 后的有序顺序表。
平台会对你编写的代码进行测试:
测试输入: 7 2 3 4 5 6 7 8 1 预期输出: 1 2 3 4 5 6 7 8
我自己写的代码:
#include <stdio.h>
#define MAXSIZE 1000
typedef struct
{
int last;
int elem[MAXSIZE];
}Seqlist;
void inser(Seqlist *L, int i, int e);
int main()
{
Seqlist *L;
int e, j, m, n;
int elemnum;
scanf("%d", &elemnum);
for (j = 0; j <= elemnum; j++)
{
scanf("%d", &L->elem[j]);
}
printf("%d", elemnum);
scanf("%d", e);
for (m = 0; m < MAXSIZE; m++)
{
inser(L, m, e);
}
for (n = 0; n < MAXSIZE+1; n++)
{
printf("%d", L->elem[n]);
}
}
void inser(Seqlist *L, int i, int e)
{
int k;
if ((i < 1) || (i > L->last+2))
{
printf("the element is illegal");
return;
}
if (L->last >= MAXSIZE-1)
{
printf("this list is full");
return;
}
if ((e >= L->elem[i-1]) && (e <= L->elem[i]))
{
for (k = L->last; k >= i-1; k--)
{
L->elem[k+1] = L->elem[k];
}
L->elem[i-1] = e;
L->last++;
}
return;
}
我服了爸爸……这写的什么构式啊……于是我用了chatgpt(大家不会的话就用chat自学吧……真的很好用他什么都知道啊啊啊啊啊……)
#include <stdio.h>
#define MAX_SIZE 1000
// 定义顺序表结构体
typedef struct {
int data[MAX_SIZE]; // 存储数据的数组
int length; // 顺序表的长度
} SeqList;
void insertSorted(SeqList *L, int x) {
int i, j;
// 找到要插入的位置
for (i = 0; i < L->length; i++) {
if (L->data[i] > x)
break;
}
// 将后面的元素后移
for (j = L->length - 1; j >= i; j--) {
L->data[j + 1] = L->data[j];
}
// 在合适的位置插入X
L->data[i] = x;
// 更新顺序表的长度
L->length++;
}
int main() {
int elenum, i, x;
SeqList L;
// 初始化顺序表的长度为0
L.length = 0;
// 读取顺序表元素个数
scanf("%d", &elenum);
// 读取顺序表元素
for (i = 0; i < elenum; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
// 读取要插入的值
scanf("%d", &x);
// 插入x到顺序表中
insertSorted(&L, x);
// 输出有序顺序表
for (i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
return 0;
}
写代码过程中出了很多神奇的报错。首先第一个很搞笑的点在于作为一个转专业来的计科大二学生居然会有两个多月空挡不碰代码这真的还蛮搞笑的(如果latex不算的话)。面对本来应该大一下学的数据结构的上机实验题,我迷茫地打开了vscode尝试写C,但是突然发现运行不了,就去看是咋回事哈哈哈……后来突然想起来他妈老子一直是用的dev啊……我服了爸爸……还蛮搞笑的没关系我可能是一个比较特别的entj吧 ^ ^ 转专业也是我自己找史吃吧我服了爸爸……
说回来,总结一下错误吧!自我反思总是不会错的~
首先在于我对宏定义理解太浅,直接使用了int直接定义(最开始)。
#define MAX_SIZE 1000
另外由于本人并没有经过C语言的系统学习,所以对于结构体和指针也是有点懵逼的。有几个点:
// 初始化顺序表的长度为0
L.length = 0;
啊啊啊虽然这很弱智,虽然我一开始也在想线性表的长度为什么在书上的定义里面没给值……还懵逼着这是个内置量?他自个就知道了?啊啊啊啊这咋可能会是个内置变量啊大哥您没事儿吧。先给出定义但是不给值,在函数体内初始化,读取的时候一边修改一边读入线性表元素。
还有一些我很迷惑的点,就是关于指针的:
for (i = 0; i < elenum; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
insertSorted(&L, x);
main函数里的两个地方,为什么在scanf里结构体变量的地址引用data[i]就用.了?而不是->?
为什么在insertSorted定义的时候是:
void insertSorted(SeqList *L, int x) {
Seqlist *L的意思不是说,L是地址变量,L指向的数据是线性表结构体变量么?但是main函数里用insertSorted的时候又成了&L了……这啥意思?地址的地址?
其实我已经预想到了我应该是指针概念搞错了,但还是跪求一下解答,深夜把问题发给好哥们了,他应该已经睡了哈哈哈哈哈
还很难受最近,给一姐们表白被拒绝啦~但是我也感觉轻松一点了,就是能更从容相处了,不用再小心翼翼了,虽然这样自己还是不会处理亲密关系。
这都扯远了……我知道自己的编程能力很弱要加强啊,但是总是这样那样的事儿拖着。立个小小flag哈哈哈努力学习努力实践,让自己也成为计算机大佬好吗
希望csdn的博客能让我记录一下我犯的错误,没人规定博客只能用来解答的吧?我问问题不行么
不是……文章刚发出去我就发现问题了啊啊啊啊啊啊啊我服了
嗯,main函数和插入函数的L要跟就不是一件事儿啊,一个是线性表的指针一个就是线性表。
好啦问题解决,晚安!明早起来自己实现一下好吗?宝宝你要脚踏实地啊