Добавление элемента на n-й позиции путем передачи связанного списка, когда передается по ссылке, не работает

0

Я новичок в связанном списке, это моя вторая проблема после вставки элемента в 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++ или алгоритме.

  • 0
    Можете ли вы вставить реальные ошибки?
  • 0
    @pranitkothari только что отредактировал
Показать ещё 4 комментария
Теги:
data-structures
linked-list
singly-linked-list

2 ответа

0
Лучший ответ

Прежде всего, ваши функции не имеют типа возврата. Хотя старые компиляторы 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 );
  • 0
    Спасибо за ответ, все, что я понял, но одна вещь поражает меня - почему вы используете tmp в цикле while? Я думаю, что это будет работать без этого
  • 0
    и одна вещь поры это в то время как цикл будет указывать на положение + 1 место, а не положение :) Я прав?
Показать ещё 2 комментария
1
* head = * head -> next;

Здесь оператор стрелки -> имеет более высокий приоритет, чем адрес-оператора *, для его компиляции вам нужны скобки:

*head = (*head)-> next;
  • 0
    Спасибо проблема решена, второй вопрос? Правильна ли логика для печати на n-й позиции?
  • 0
    @ user252990 На первый взгляд, вы присвоили temp2 значение, а затем temp2 новый фрагмент памяти и сразу же присвоили ему значение, так что должно быть что-то не так. Однако я надеюсь, что вы сначала попытаетесь решить проблему с логикой, используя печать трассировки и отладчик.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню