关于线性表插入删除操作

题目如图

img

img

我的代码如下

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int *elem;
    int length;
}Sqlist;

void insert(Sqlist *L,int m,int n)
{
    if(m>=1 && m<=L->length+1){
    for(int j=L->length-1;j>=m-1;j--)
        L->elem[j+1]=L->elem[j];
    L->elem[m-1]=n;
    ++L->length;}
}

void delete_(Sqlist *L,int m)
{
    if(m<1 || m>L->length)
        printf("%d\n",-1);
    if(m>=1 && m<=L->length){
    printf("%d\n",L->elem[m-1]);
    for (int j=m;j<=L->length;j++)
        L->elem[j-1]=L->elem[j];
    --L->length;}
}

int main()
{
    int number,sign,m,n;
    Sqlist tmp;
    Sqlist *L=&tmp;
    L->elem=(int*)malloc(sizeof(int)*100010);
    scanf("%d",&L->length);
    for (int i=0;i<L->length;i++)
        scanf("%d",&L->elem[i]);
    scanf("%d",&number);
    for (int k=0;k<number;k++)
    {
        scanf("%d",&sign);
        if (sign==1)
        {
            scanf("%d%d",&m,&n);
            insert(L,m,n);
        }
        if (sign==2)
        {
            scanf("%d",&m);
            delete_(L,m);
        }
    }
    free(L->elem);
    return 0;
}

问题是,在一些输出中出现了问题,而且只错其中一个输出,前后都对,如图

img

img


麻烦帮忙找一下错误,谢谢

59会变成73?
你的测试用例呢?实际输入的数据是哪些?

因为C语言数组下标是从0开始计数的,你写代码时最好也按0开始计数,别和1开始计数的混着用,不然会很容易出错。如果题目中的k是从1开始计数的,你调用的时候把它转化为0开始计数的。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int *elem;
  int length;
} Sqlist;

void insert(Sqlist *L, int m, int n) {
  if (m < 0)
    m = 0;
  if (m >= L->length)
    m = L->length;
  for (int i = L->length - 1; i >= m; i--)
    L->elem[i + 1] = L->elem[i];
  L->elem[m] = n;
  ++L->length;
}

void delete_(Sqlist *L, int m) {
  if (m < 0 || m >= L->length) {
    printf("-1\n");
    return;
  }
  printf("%d\n", L->elem[m]);
  for (int i = m; i < L->length; i++)
    L->elem[i] = L->elem[i + 1];
  --L->length;
}

int main() {
  int number, sign, m, n;
  Sqlist tmp;
  Sqlist *L = &tmp;
  L->elem = (int *)malloc(sizeof(int) * 100010);
  scanf("%d", &L->length);
  for (int i = 0; i < L->length; i++)
    scanf("%d", &L->elem[i]);
  scanf("%d", &number);
  for (int k = 0; k < number; k++) {
    scanf("%d", &sign);
    if (sign == 1) {
      scanf("%d%d", &m, &n);
      insert(L, m - 1, n);
    }
    if (sign == 2) {
      scanf("%d", &m);
      delete_(L, m - 1);
    }
  }
  free(L->elem);
  return 0;
}

插入函数有问题,改成下面这样。
j = m 的时候,只给L->m+1赋值了,L -> m并没有改变。要把L->m 改成插入的新值。

void insert(Sqlist *L,int m,int n)
{
    if(m>=1 && m<=L->length){
    for(int j=L->length-1;j>=m;j--)
        L->elem[j+1]=L->elem[j];
    L->elem[m]=n;
    ++L->length;}
}

上面结果是按你的代码来的,下面是修改后的

img