Последовательная структура хранения линейных таблиц и их основные операции с C

Я новичок в C, и нашел задание в интернете что бы попрактиковаться:

Напишите код C, который имеет функции, которые могут: (1) Создать линейную таблицу; (2) Элементы входных данных 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; 3) Удалить элемент данных 5; (4) Отображение элементов данных в текущей линейной таблице по очереди. Предположим, что количество элементов данных линейной таблицы в худшем случае не превышает 100.

т.е вводя цифры от 1-10 я должен внести их в линейную таблицу при этом удаляя 5 из таблицы.

На этом я пока остановился, при удалении 5 из таблицы у меня проблема, что 5 просто не уходит и наоборот отображается несколько раз, а остальные цифры после 5 не выводятся.

123455555

У меня есть некоторые догадки, где я мог ошибиться, но на данный момент я в ступоре и ничего нового мне в голову не приходит. Я хотел бы попросить вас взглянуть на мой код и высказать свое мнение о том, как исправить эту ошибку. Я не прошу полного решения моей проблемы, но мне нужна идея, которая помогла бы мне и направила меня, спасибо! (Я указал места, где может возникнуть ошибка)

#include <stdio.h>
#define MaxSize  100

typedef int DataType;

typedef struct
{
    DataType list[MaxSize];
    int size;
} SeqList;

void ListInitiate(SeqList *L)       /* Инициализация линейной таблицы  */   
{
    L->size = 0;                    
}

int ListLength(SeqList L)    
{
    return L.size;
}

int ListInsert(SeqList *L, int i, DataType x) 
/* Вставка значения элемента данных x перед позицией i */ 
{
    int j;
    if(L->size >= MaxSize)
    {
        printf("can not be inserted! \n"); 
        return 0;
    }
    else if(i < 0 || i > L->size )
    {
        printf("Parameter i is illegal! \n");
        return 0;
    }
    else
    {    
        for(j = L->size; j > i; j--) L->list[j+1] = L->list[j];    /* Подготовка к вставке */   
        L->list[i] = x;             
        L->size ++;       
        return 1;
    }     /* НЕ уверен в этом фрагменте кода */

}

int ListDelete(SeqList *L, int i, DataType *x)
/* Удаление значения элемента данных позиции i */
{
    int j;
    if(L->size <= 0)
    {
        printf("The linear table is empty and no data elements can be deleted!\n");
        return 0;
    }
    else if(i < 0 || i > L->size-1)
    {
        printf("Parameter i is illegal!");
        return 0;
    }
    else
    { 
        *x = L->list[i];      /* Сохранение удаленного элемента в параметр x */
        for(j = i +1; j <= L->size-1; j++) L->list[j] = L->list[j-1];    
        L->size--;             
        return 1;
    }      /* НЕ уверен в этом фрагменте кода */

}

int ListGet(SeqList L, int i, DataType *x)
{
    if(i < 0 || i > L.size-1)
    {
        printf("Parameter i is illegal! \n");
        return 0;
    }
    else
    {
        *x = L.list[i];
        return 1;
    }
}

int main(void)
{
    SeqList myList;
    int i , x;
    ListInitiate(&myList);
    for(i = 0; i < 10; i++) 
        ListInsert(&myList, i, i+1); 
    ListDelete(&myList, 4, &x);
    for(i = 0; i < ListLength(myList); i++)
    {
        ListGet(myList,i,&x);      
        printf("%d", x);
    }
    return 0;
}

Ответы (1 шт):

Автор решения: AlexGlebe

У вас ошибки и во вставке и в удалении. При в ставке нужно было оригинальные значения сдвинуть вперёд, но вы упустили, что индексация элементов в массиве такая : [0] .. [size-1]. А вы лишний элемент двигаете и не сдвигаете место для нового элемента.

for(j = L->size; j > i; j--)
  L->list[j+1] = L->list[j];

правильно так :

for(j = L->size; j > i; j--)
  L->list[j] = L->list[j-1];

или так :

for(j = L->size-1; j >= i; j--)
  L->list[j+1] = L->list[j];

При удалении вы записываете значение прошлого шага, а надо было с дальнейшего, то-есть наоборот не :

for(j = i +1; j <= L->size-1; j++)
  L->list[j] = L->list[j-1];

а так :

for(j = i +1; j <= L->size-1; j++)
  L->list[j-1] = L->list[j];
→ Ссылка