Связанный список в C, Невозможно вставить и отобразить узел - PullRequest
0 голосов
/ 26 сентября 2019

Я пытался реализовать связанный список, но не смог понять, что же на самом деле идет не так, что он не показывает ожидаемый результат?Я попытался отследить поток управления программы, поместив случайное значение printfs в подозрительные места ...

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

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int data;
    struct node *link;
};

int count(struct node *q);
void append(struct node *q, int item);
void display(struct node *q);
void add_after(struct node *q, int item, int pos);
void add_beg(struct node *q, int item);
int delete(struct node *q);

int main()
{
    struct node *p = NULL;
    int item,count,i;

    printf("Enter the element to insert\n");
    scanf("%d",&item);

    append(p,item);

    printf("Control\n");
    printf("%d",p);

    display(p);


    //printf("No. of elements in Linked list = %d",count(p));

    // printf("Enter number of elements: ");
    // scanf("%d", &count);

    // for (i = 0; i < count; i++)
    // {
    //     printf("Enter %dth element: ", i);
    //     scanf("%d", &item);
    //     append(p,item);
    // }

    //printf("No. of elements in Linked List are : %d",count(p));

    return 0;
}

void append(struct node *q, int item)
{
    struct node *temp=NULL  , *new=NULL;

    temp = (struct node *)malloc(sizeof(struct node));

    if(q==NULL)  //Condition for empty linked list
    {
       // procedure to insert first node
        temp->data = item;
        temp->link = NULL;
        q = temp;
        //printf("iz here");
    }
    else 
    {
        //printf("ABCD\n");
        temp = q;
        while(temp->link!=NULL)
        temp = temp->link;

        new = (struct node *)malloc(sizeof(struct node));
        new->data = item;
        new->link = NULL;
        temp->link = new;
    }
}

void display(struct node *q)
{
    // printf("Hitesh");
    //printf("%d",q);

    while(q->link!=NULL)
    {
        printf("%d->",q->data);
        q = q->link;
    }
}

int count(struct node *q)
{
    int c=0;
    while(q->link!=NULL)
    {
        q=q->link;
        c++;
    }
    return c;   
}

void add_after(struct node *q, int item, int pos)
{
    int i;
    struct node *temp , *new ;
    temp=q;

    for(i=0;i<pos;i++)
    temp = temp->link;

    new=(struct node*)malloc(sizeof(struct node));
    new->data = item;
    new->link = temp;
    temp = new;
    q = temp;
}

void add_beg(struct node *q, int item)
{
    struct node *temp;
    temp=q;
    temp=(struct node*)malloc(sizeof(struct node));
    temp->data = item;
    temp->link = q;
    q=temp;
}


Примечание: я не убрал комментарии из кода, чтобы вы могли видеть, что я сделал, чтобы проверить, что происходит.

1 Ответ

5 голосов
/ 26 сентября 2019

Эти функции

void append(struct node *q, int item);
void add_after(struct node *q, int item, int pos);
void add_beg(struct node *q, int item);

передает указатель на узел по значению.Таким образом, любые изменения указателя внутри функций не влияют на исходный указатель.

Вы должны объявить такие функции, как

void append(struct node **q, int item);
void add_after(struct node **q, int item, int pos);
void add_beg(struct node **q, int item);

Например, для функции append можно определить следующееway

int append( struct node **head, int item )
{
    struct node *new_node = malloc( sizeof( struct node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = item;
        new_node->link = NULL;

        while( *head != NULL ) head = &( *head )->link;

        *head = new_node'
    }

    return success;
}

и называется как

struct node *head = NULL;
//...
append( &head,item );

Эти функции

void display(struct node *q)
{
    // printf("Hitesh");
    //printf("%d",q);

    while(q->link!=NULL)
    {
        printf("%d->",q->data);
        q = q->link;
    }
}

int count(struct node *q)
{
    int c=0;
    while(q->link!=NULL)
    {
        q=q->link;
        c++;
    }
    return c;   
}

также недействительны, поскольку нет проверки, равен ли указатель qNULL.

Они могут быть определены следующим образом

void display( struct node *head )
{
    for ( ; head != NULL; head = head->link )
    {
        printf( "%d->", head->data );
    }
}

size_t count( struct node *head )
{
    size_t n = 0;

    for ( ; head != NULL; head = head->link )
    {
        ++n;
    }

    return n;   
}
...