Data Structure I

Jadi Untuk kali ini saya belajar Tentang Single Linked List dan Double Linked List

Bedanya Single dan Double Linked List adalah :

Single Linked List hanya mempunyai Next sedangkan Double Linked List mempunyai Next dan prev untuk mengubah node node di dalam linked List

Linked List dapat digunakan untuk proteksi data seperti membuat suatu langkah mendapatkan node dengan memanfaatkan next dan prev

Linked List akan terpakai karena dapat menginput data secara Dynamic menggunakan Memory Allocation / Malloc dengan return type void pointer

Malloc akan selalu di TypeCasting ke Struct agar tidak mereturn void pointer.

Berikut adalah Contoh dari Double Linked List


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

struct node{
    int data;
    node *next;
    node *prev;
}*head,*tail;

node *newnode(int data){
    node *curr = (node *)malloc(sizeof(node));
    curr->data = data;
    curr->next = curr->prev = NULL;
    return curr;
}

void view(){
    node *ptr = head;
    while(ptr != NULL){
        printf("%d ",ptr->data);
        ptr = ptr->next;
    }
}

void pushHead(node *data){
    if(head == NULL){
        head = tail = data;
    }
    else{
        head->prev = data;
        data->next = head;
        head = data;
    }
    head->prev = NULL;
}

void pushTail(node *data){
    if(head == NULL){
        head = tail = data;
    }
    else{
        tail->next = data;
        data->prev = tail;
        tail = data;
    }
    tail->next = NULL;
}

void pushMid(node *data){
    if(head == NULL){
        head = tail = data;
    }
    else{
    if(data->data<head->data){
        pushHead(data);
    }
    else if(data->data >tail->data){
        pushTail(data);
    }
    else{
        node *ptr = head;
        while(ptr->next->data<data->data){
            ptr = ptr->next;
        }
            data->next = ptr->next;
            ptr->next->prev = data;
            data->prev = ptr;
            ptr->next = data;
    }
    }
}

void popHead(){
    node *temp = head;
    head = head->next;
    temp->next = NULL;
    free(temp);
}

void popTail(){
    node *temp = tail;
    tail = tail->prev;
    temp->prev = NULL;
    tail->next = NULL;
    free(temp);
}

popMid(int data){
    node *temp = head;
    if(head == tail){
       
    }
    else{
        while(temp){
            if(temp->data == data)break;
            temp = temp->next;
        }
        temp->prev->next = temp->next;
        temp->next->prev = temp->prev;
        temp->next = NULL;
        temp->prev = NULL;
        free(temp);
    }
}

void popAll(){
    while(head != NULL){
        popHead();
    }
}

int main(int agrs,char **argv){
//    pushTail(newnode(15));
//    pushTail(newnode(7));
//    pushTail(newnode(5));
//    pushTail(newnode(25));
//    pushTail(newnode(3));
//    pushHead(newnode(1));
//    pushHead(newnode(2));
//    pushHead(newnode(3));
//    pushHead(newnode(4));
    pushMid(newnode(1));
    pushMid(newnode(3));
    pushMid(newnode(2));
    pushMid(newnode(4));
    pushMid(newnode(5));
//    popHead();
//    popTail();
    popAll();
    view();
    return 0;
}

Komentar