Для начала плохая идея объявлять начальный указатель на узлы как глобальную переменную, и когда функция зависит от глобальных переменных.
Также неясно, почему переменная stati c COUNT инициализируется 1 вместо 0, когда изначально список пуст.
static int COUNT = 1;
Он должен быть инициализирован нулем
static int COUNT = 0;
insert_at_beginning и insert_at_end работает отлично
Вы не правы. Функция insert_at_end
недействительна.
void insert_at_end() {
NODE *n, *temp;
temp = START;
n = create_node();
printf("Enter a number: ");
scanf("%d", &n->data);
while(temp!=NULL) {
printf("I am here!");
temp = temp->next;
}
temp->next = n;
COUNT++;
printf("Successfully Inserted!\n");
}
Например, функцию можно вызывать, когда список пуст, то есть когда указатель START
равен NULL. В этом случае указатель START не изменяется в функции.
Более того, даже если указатель START не равен NULL, после этого l oop
while(temp!=NULL) {
printf("I am here!");
temp = temp->next;
}
температура указателя равна равно NULL. Поэтому следующий оператор
temp->next = n;
вызывает неопределенное поведение.
Функция может быть записана как минимум следующим образом
void insert_at_end() {
NODE *n;
n = create_node();
printf("Enter a number: ");
scanf("%d", &n->data);
if ( START == NULL )
{
START = n;
}
else
{
NODE *temp = START;
while ( temp->next !=NULL )
{
printf("I am here!");
temp = temp->next;
}
temp->next = n;
COUNT++;
printf("Successfully Inserted!\n");
}
}
Что касается функции insert_at_a_position
, то Существует путаница относительно глобальной переменной COUNT. Как я указывал изначально, когда список пуст, COUNT равен 1. Таким образом, действительная позиция может быть меньше, чем COUNT. Учтите, что пользователь может ввести, например, значение позиции, равное 0.
Так, например, это, если оператор
if(COUNT<position) {
printf("Out of Bound! Please try again.\n");
} else
должен быть переписан как
if ( !( position < COUNT ) ) {
printf("Out of Bound! Please try again.\n");
} else
Также, когда пользователь введет 0, тогда l oop
count = 1;
//...
while(count != position) {
//...
может вызвать неопределенное поведение.
И снова, если список пуст, то START равен NULL, тогда START не изменяется в функции.
Также, если пользователь ввел позицию, равную 1, тогда в этом случае значение l oop не будет выполнено. В этом случае указатель t
имеет неопределенное значение, поскольку он не был инициализирован за пределами l oop. Так что это утверждение
t->next = n;
снова вызывает неопределенное поведение.
Функция может быть определена следующим образом
void insert_at_a_position() {
int position;
printf("Enter position at which you want to insert: ");
scanf("%d", &position);
if( !( position < COUNT ) ) {
printf("Out of Bound! Please try again.\n");
} else
{
NODE *n = create_node();
printf("Enter a number: ");
scanf("%d",&n->data);
NODE *temp = START;
NODE *prev = START;
while( position-- != 0 )
{
prev = temp;
temp = temp->next;
}
n->next = temp;
if ( prev == NULL ) START = n;
else prev->next = n;
COUNT++;
printf("Successfully Inserted!\n");
}
}