Программа идет в бесконечный цикл вместо вызова функции? - PullRequest
0 голосов
/ 25 сентября 2018

Я немного попрактиковался в связанном списке и пытался добавить элементы в отсортированный дважды связанный список.Однако, когда я вызываю функцию для добавления элемента в список, вместо вызова функции, программа переходит в бесконечный цикл.Я проверил, что программа не входит в функцию добавления оператора печати в начале функции.Вот вся программа:

#include<stdio.h>
#include<stdlib.h>
struct node
{
  int info;
  struct node* next;
  struct node* prev;
};
struct node* sortedInsert(struct node* head, int data)
{
  printf("x" );
  struct node* res=head;
  struct node* ptr=(struct node*)malloc(sizeof(struct node));
  ptr->info=data;
  ptr->next=NULL;
  ptr->prev=NULL;
  printf("X");
  if(head==NULL)
    return ptr;
  else if(ptr->info<=head->info)
  {
    ptr->next=head;
    head->prev=NULL;
    res=ptr;
    return res;
  }
  else
  {
    while(head!=NULL)
    {
      if(head->info>=ptr->info)
      {
        ptr->prev=head->prev;
        ptr->next=head;
        head->prev=ptr;
        return res;
      }
    }
  }
}
struct node* push(struct node* head)
{
  struct node* ptr=(struct node*)malloc(sizeof(struct node));
  int n;
  printf("Enter size: ");
  scanf("%d",&n);
  printf("Enter elements: ");
  for(int i=0;i<n;i++)
  {
    if(head==NULL)
    {
      scanf("%d",&ptr->info);
      ptr->next=NULL;
      ptr->prev=NULL;
      head=ptr;
    }
    else
    {
      struct node* temp=(struct node*)malloc(sizeof(struct node));
      scanf("%d",&temp->info);
      temp->next=NULL;
      temp->prev=ptr;
      ptr->next=temp;
      ptr=temp;
    }
  }
  return head;
}
void display(struct node* head)
{
  struct node *res;
  for(res=head;res!=NULL;res=res->next)
    printf("%d\t",res->info);
  printf("\n");
}
int main()
{
  struct node* head1=NULL;
  head1=push(head1);
  display(head1);
  int num;
  printf("Enter number: ");
  scanf("%d",&num);
  printf("%d\n",num);
  head1=sortedInsert(head1,num);
  display(head1);
  return 0;
}

Вывод:

Enter size: 4
Enter elements: 1 2 4 5
1       2       4        5
Enter number: 3
3

1 Ответ

0 голосов
/ 25 сентября 2018

Это потому, что вы не увеличиваете head, чтобы указывать следующий узел в цикле while.

Также, как только вы нашли позицию в списке, куда нужно вставить новый узел, вам нужносделать так, чтобы предыдущий узел указывал на новый узел head->prev->next = ptr;, в противном случае ваш список сломается;

Ваш код должен выглядеть следующим образом.

struct node* sortedInsert(struct node* head, int data)
{ 
    .......
    .......
  while(head!=NULL)
  {
     if(head->info>=ptr->info)
     {
        ptr->prev=head->prev;
        ptr->next=head;
        head->prev->next = ptr; // to make prev node to point new node
        head->prev=ptr;

        return res;
      }
      head=head->next; // Increment the head to point next node.
   }
    .......
}
...