dimanche 28 juin 2015

printing a doubly linked list by passing head argument

This code is not working properly

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

    struct dllnode{
    int data;
    struct dllnode *next;
    struct dllnode *prev;
};
    typedef struct dllnode *Ndptr;

    struct dllist{
    Ndptr head;
    Ndptr tail;
};
    typedef dllist *Dllist;


    void printlist(Dllist L){
    Ndptr p = L->head;
    while(p!=NULL){
        printf("%d\n",p->data);
        p = p->next;
    }
}

    Ndptr newnode(int val){
    Ndptr  pnew = (Ndptr)calloc(1,sizeof(struct dllnode));
    pnew->data = val;
    pnew->next = NULL;
    pnew->prev = NULL;
    return pnew;
}

    Dllist make_list(Ndptr pnew) {
    Dllist L = (Dllist)calloc(1,sizeof(struct dllist)); 
    L->head =L->tail=pnew; 
    if (pnew) { pnew->prev=pnew->next=NULL;}
    return L;
}


    Dllist insert_before_node (Dllist L, Ndptr pcurr, Ndptr pnew){
    if (!L) return  make_list(pnew);
    if (L->head==NULL){ L->head = L->tail = pnew;  return L;}
    if (!pcurr) return L;   /*error*/ 
    pnew->next = pcurr;
    pnew->prev = pcurr->prev;
    if (pcurr->prev ) 
     pcurr->prev->next = pnew;

    else { L->head = pnew;}
    return L; 
}

    int main(){
    int i;
    int n;scanf("%d",&n);
    Ndptr s = NULL;
    Ndptr p;
    Dllist m=NULL;
    while(n--){
        scanf("%d",&i);
        p = newnode(i);
        m = insert_before_node(m,s,p);
        Ndptr s = p;
    }
    printf("\n");
    printlist(m);

}

But this code does work. remaining every thing same just change in main function

    int main(){
    Ndptr p = newnode(4);
    Ndptr s = newnode(5);
    Ndptr k = newnode(8);
    Ndptr l = newnode(12);
    Dllist m = NULL;
    m = insert_before_node(m,s,p);
    m = insert_before_node(m,p,s);
    m = insert_before_node(m,s,k);
    m = insert_before_node(m,k,l);
    printf("\n");
    printlist(m);

}

please explain why? again there is change in only main function.

Aucun commentaire:

Enregistrer un commentaire