Understanding a double pointer in a doubly linked list in C

I have an exam tomorrow, and I tried to understand this double-connection example that the teacher posts on the class website, but I find it difficult to understand a little ...

Here is the code:

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

typedef struct dl {
    int key;
    float value;
    struct dl *next;
    struct dl *prev;
} DL;

DL *insert(int c, float f, DL *l) {
    DL *new = (DL*) malloc(sizeof(DL));
    if (new == NULL) exit(-1);
    new->key=c; new->value=f; 
    if (l==NULL) {
        new->next=NULL; new->prev=NULL;
    }
    else if (l->key < c) {
        while((l->next != NULL) && (l->next->key < c)) { l=l->next; }
        new->next=l->next; l->next=new; new->prev=l;
        if (new->next != NULL) {
            new->next->prev=new;
        }
    }
    else {
        while((l->prev != NULL) && (l->prev->key > c)) { l=l->prev; }
        new->prev=l->prev; l->prev=new; new->next=l;
        if(new->prev != NULL) {
            new->prev->next=new;
        }
    }
    return new;
}

int search(int c, float *f, DL **lptr) {
    if (*lptr == NULL) return 0;
    if (c < (*lptr)->key) {
        while(((*lptr)->prev!=NULL)&&((*lptr)->prev->key >= c)) {
            (*lptr)=(*lptr)->prev;
        }
    }
    else if (c > (*lptr)->key) {
                while(((*lptr)->next!=NULL)&&((*lptr)->next->key <= c)) {
                        (*lptr)=(*lptr)->next;
                }
    }
    if ((*lptr)->key == c) {
        *f = (*lptr)->value;
        return 1;
    }
    return 0;
}

void printList(DL *l) {
    if (l == NULL) return;
    while (l->prev != NULL) { l=l->prev; };
    while(l != NULL) {
        printf("%d,%f\n",l->key,l->value);
        l=l->next;
    }
}

int main(void) {
    DL *list=NULL;
    float f;
    list=insert(3,5.6,list); list=insert(4,5.3,list);
    list=insert(7,3.6,list); list=insert(1,7.7,list);
    list=insert(9,2.3,list); list=insert(0,9.0,list);
    printList(list);
    if (search(3,&f,&list)) {
        printf("Found %f.\n",f);
    }
    else {
        printf("Not found.\n");
    }
    printList(list);
    return 0;
}

Here's the conclusion:

0,9.000000
1,7.700000
3,5.600000
4,5.300000
7,3.600000
9,2.300000
Found 5.600000.
0,9.000000
1,7.700000
3,5.600000
4,5.300000
7,3.600000
9,2.300000

, , - . DL, ? , (* lptr) = (* lptr) → next ( prev), . , , - , printList() ... , search() , "" , ? , () , ?

, , search() (* lptr) = NULL , printList() , , NULL, . (* lptr) = (* lptr) → next? , printList() ?

EDIT:
, " " " ", , . , , , , . , printList(), , , , - search(). , , , , , , ...

+3
6

:

while (l->prev != NULL) { l=l->prev; };

:

while(l != NULL) {
    printf("%d,%f\n",l->key,l->value);
    l=l->next;
}

, , .

+4

printList .

while (l->prev != NULL) { l=l->prev; };

, .

+5

(, rmeador, ), search list, .

- printList. , ( NULL), :

while (l->prev != NULL) { l=l->prev; };

prev , , .

+2

printList() l = l->prev. .

+1

, printList() ... search() , "" , ? , , () ?

, , , . , printList , .

+1

:

while (l->prev != NULL) { l=l->prev; };

Remember that the list is double linked. The search does not change the list, but what part of its "list" currently points to.

+1
source

Source: https://habr.com/ru/post/1712783/


All Articles