Последовательная структура хранения линейных таблиц и их основные операции с 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 шт):
У вас ошибки и во вставке и в удалении. При в ставке нужно было оригинальные значения сдвинуть вперёд, но вы упустили, что индексация элементов в массиве такая : [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];