分享
三行代码  ›  专栏  ›  技术社区  ›  Arohan Ajit

程序进入中缀循环而不是调用函数?

  •  1
  • Arohan Ajit  · 技术社区  · 1 年前

    我在练习一些链表,我试图将元素添加到已排序的双重链表中。但是,当我调用函数将元素添加到列表中时,程序将进入一个中缀循环,而不是调用函数。我已经检查过程序没有进入在函数开始时添加打印语句的函数。以下是整个计划:

    #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 回复  |  直到 1 年前
        1
  •  2
  •   kiran Biradar    1 年前

    这是因为您没有增加 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.
       }
        .......
    }