Search code examples
clinked-listcircular-list

Error while finding max and min in a circular linked list


I need to find the maximum number and the minimum number in a circular linked list and i should move the minimum number to the start of the list (before head) and the maximum number to the end of the list (before minimum)

why my code is giving me error in output?

Note: Using doubly linked list is disallowed ,we should do this only with circular linked list.

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

typedef struct node
{
  int num;
  struct node *next;
} NODE;

void init(NODE **h)
{
  (*h) = (NODE*)malloc(sizeof(NODE));
  (*h)->next = *h;
}

NODE* add(NODE* h,NODE* p,int x)
{
  int i;
  NODE *temp;
  temp = (NODE*)malloc(sizeof(NODE));
  temp->num = x;
  temp->next = h;
  if(h->next == h)
  {
    h->next = temp;
    return h;
  }
  else
  {
    temp = p->next;
    p = temp;
    return h;
  }
  return h;
}

NODE* fin(NODE *h,NODE *p)
{
  NODE* ptr,*pmin,*pmax,*temp,*temp2,*mnprev,*mxprev;
  // temp: minimum
  // temp2: maximum
  // pmin: holds the minimum
  // pmax: holds the maximum
  // ptr: o(n) search
  // mnprev: holds the previous node of the minimum
  // mxprev: hold the previous node of the maximum
  mnprev = mxprev = pmin = pmax = h;
  ptr = h->next;
  int mini, maxi;
  mini = h->num;
  maxi = h->num;
  do
  {
    if(ptr->num < mini)
    {
      mini = ptr->num;
      pmin = ptr;
      mnprev->next = pmin;
    }
    if(ptr->num > maxi)
    {
      maxi = ptr->num;
      pmax = ptr;
      mxprev->next = pmax;
    }

    ptr = ptr->next;
  } while(ptr != h);
  temp = pmin;
  temp2 = pmax;
  mnprev->next = pmin->next;
  mxprev->next = pmax->next;
  free(pmin);
  free(pmax);

  temp->next = h;
  temp2->next = temp;

  ptr = temp;
  do {
    printf("%d ",ptr->num);
    ptr = ptr->next;
  } while(ptr != h);

}

int main()
{
  int i,x;
  NODE *lis,*p;
  init(&lis);
  p = lis;
for(i=0;i<7;i++)
  {
    scanf("%d",&x);
add(lis,p,x);
    }
      fin(lis,p);

}

Solution

  • rewrite your code

    • function init delete as it will create nodes that are not used.
    • Changed to the node between the maximum and minimum values ​​since it is sufficient to simply replace the value.

    like this

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node {
        int num;
        struct node *next;
    } NODE;
    
    NODE* add(NODE **head, NODE **tail, int x){
        NODE *temp;
        temp = (NODE*)malloc(sizeof(NODE));
        temp->num = x;
        if(*head == NULL){
            temp->next = temp;
            *tail = *head = temp;
        } else {
            temp->next = *head;
            (*tail)->next = temp;
            *tail = temp;
        }
        return *head;
    }
    
    void print(NODE *p){
        NODE *top =p;
        do{
            printf("%d ", p->num);
            p=p->next;
        }while(p != top);
        printf("\n");
    }
    
    void drop(NODE *head, NODE *tail){
        NODE *p = head;
    
        tail->next = NULL;
        while(p){
            NODE *temp = p;
            p = p->next;
            free(temp);
        }
    }
    
    void minmax(NODE *head, NODE *tail){
        NODE *p, *maxp, *minp;
        int temp;
    
        maxp = minp = p = head;
        do{
            if(maxp->num < p->num){
                maxp = p;
            }
            if(minp->num > p->num){
                minp = p;
            }
            p = p->next;
        }while(p != head);
        temp = maxp->num; maxp->num = tail->num; tail->num = temp;
        if(tail == minp)//exchanged minp
            minp = maxp;//fixed
        temp = minp->num; minp->num = head->num; head->num = temp;
    }
    
    int main(void){
        int i, x;
        NODE *head, *tail;
    
        tail = head = NULL;
        for(i=0;i<7;i++){
            printf("%d>", i+1);
            scanf("%d", &x);
            add(&head, &tail, x);
        }
        //print(head);
        minmax(head, tail);
        print(head);
        drop(head, tail);
    
        return 0;
    }