Я новичок в связанном списке, это моя вторая проблема после вставки элемента в LL.Now я пытаюсь вставить элемент на n-й позиции. Я делаю так вот так:
(1) Сначала выберите размер пользователя на терминале.
(2) Второй раз читайте входной сигнал от пользователя до размера.
(3) Я добавляю элемент, читаемый на терминале в начале LL.
(4) Я печатаю, что LL пока не сформирован.
Пока здесь все работает нормально
(5) Теперь после этого я пытаюсь сделать дополнение на n-й позиции в LL, но он дает 3 ошибки, которые я объяснил в комментариях в моем коде. Также, пожалуйста, скажите, правильна ли моя логика добавления элемента на n-й позиции или нет?
Примечание. Я обязан передать узел List в качестве ссылки только в вызове функции (и разыменовать их внутри определения функции)
Ниже приведены мои кодовые ошибки в комментариях.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct node
{
int freq;
struct node * next;
};
typedef struct node node;
///////////////////////////// Function definitions ////////////////////////////////////////
insert_beginning(int size, node * * head)
{
node * temp;
temp = (node * ) malloc(sizeof(node));
temp -> freq = size;
temp -> next = * head;
* head = temp;
}
insert_Nth_position(int posn, int varn, node * * head)
{
int count = 0;
do
{
* head = * head -> next;//The first error is here , "next is something not structure or union"
count++;
} while (count != posn - 1); //this loop i do to go to node at nth position
node * temp2 = * head;
temp2 = (node * ) malloc(sizeof(node));
temp2 -> freq = varn;
temp2 -> next = * head -> next; //The seond error is here , "next is something not structure or union"
* head -> next = temp2;//The third error is here , "next is something not structure or union"
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
int size, data, i, pos,
var;
node * head = NULL;
printf("enter the size of node\n");
scanf("%d", & size);
printf("start entering the number of elements until your size\n");
for (i = 1; i <= size; i++)
{
scanf("%d", & data);
insert_beginning(data, & head);
}
node * temp1;
temp1 = head;
while (temp1 != NULL)
{
printf("%d-> ", temp1 -> freq);
temp1 = temp1 -> next;
}
printf("enter the posotion where to add the node\n");
scanf("%d", & pos);
printf("enter the variable node\n");
scanf("%d", &var);
insert_Nth_position(pos,var, & head); //There may be problem here
printf("Print after addition\n");
node * temp3 = head;
while (temp3 != NULL)
{
printf("%d-> ", temp3 -> freq);
temp3 = temp3 -> next;
}
}
Фактические ошибки:
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ gcc tlt.c -o tlt
tlt.c: In function ‘insert_Nth_position:
tlt.c:26:18: error: request for member ‘next in something not a structure or union
tlt.c:32:28: error: request for member ‘next in something not a structure or union
tlt.c:33:9: error: request for member ‘next in something not a structure or union
Ответ приветствуется на любом языке c/c++ или алгоритме.
Прежде всего, ваши функции не имеют типа возврата. Хотя старые компиляторы C позволяют это сделать, неявно указывая тип возвращаемого значения как int
я рекомендую явно указать тип возвращаемого значения функции.
Что касается ваших ошибок, то вы не должны использовать оператор разыменования в выражениях, как вы это делаете
* head = * head -> next;
или
* head -> next = temp2;
Было бы правильно написать
*head = ( *head )->next;
а также
(*head )->next = temp2;
Хотя семантически этот код недействителен. Вы меняете голову в петле, пока она не должна меняться.
Неправильная функция insert_Nth_position. Представьте себе, например, что значение параметра int posn
равно 0. В этом случае условие while (count != posn - 1);
будет недействительным.
Я бы определил параметр, который специфицирует позицию в списке как имеющую тип unsigned int
или size_t
Функция insert_Nth_position может выглядеть следующим образом
int insert_Nth_position( node ** head, size_t posn, int varn )
{
if ( posn == 0 ) return insert_beginning( head, varn );
node *tmp = *head;
while ( --posn && tmp ) tmp = tmp->next;
if ( tmp )
{
node *new_node = malloc( sizeof( node ) );
new_node->freq = varn;
new_node->next = tmp->next;
tmp->next = new_node;
}
return ( temp != NULL );
}
Если ваш компилятор поддерживает C99, тогда тип возврата может быть заменен на _Bool
Также функцию insert_beginning я объявляю как
int insert_beginning( node ** head, int varn );
* head = * head -> next;
Здесь оператор стрелки ->
имеет более высокий приоритет, чем адрес-оператора *
, для его компиляции вам нужны скобки:
*head = (*head)-> next;
temp2
значение, а затем temp2
новый фрагмент памяти и сразу же присвоили ему значение, так что должно быть что-то не так. Однако я надеюсь, что вы сначала попытаетесь решить проблему с логикой, используя печать трассировки и отладчик.