Rabu, 30 Mei 2018

PROGRAM SILSILAH KELUARGA MENGGUNAKAN BINARY TREE

#define WINDOWS
//#define LINUX

/** FAMILY TREE */

#include<iostream>
#include<string.h>
#include<stdlib.h>

using namespace std;

struct node
{
    char name[50];
    short int age,x;    // x - height of node
    bool g;             // g- gender
    node* fc;           // Pointer to first child
    node* ns;           // Pointer to next sibiling

    node();
    void getData();
};

node::node()
{
    fc=ns=NULL;
    g=0;
    strcpy(name,"");
    age=x=0;
}

void node::getData()
{
    char ch;
    cout<<"\nName of the Person: ";
    cin>>name;
    cout<<"Age of "<<name<<": ";
    cin>>age;
    cout<<name<<" is (m/f): ";
    cin>>ch;
    if(ch=='m')
        g=1;
}

class familyTree
{

public:

    node* start;

    familyTree();

    node* traverseDown(node*,char[]);   // Search functions
    node* traverseRight(node*,char[]);
    node* search(char[]);

    void addSib(node*,node*);           // Functions for adding new members
    void addChild(node*,node*);
    void addNew();

    void find();                        // Function to find relations
    void show(node*);                   // Function to show details of particular person
    void display(node*);                // Function to display full tree
    void destroy(node*);                // Function to destroy full tree
    void updateX(node*,int);

};

familyTree::familyTree()
{
    start = NULL;
}

void familyTree::destroy(node* ptr)
{
    node* temp = ptr;

    if(ptr==NULL)
        return;

    while(ptr!=NULL)
    {
        destroy(ptr->fc);
        temp = ptr;
        ptr = ptr->ns;
        delete temp;
    }

    start = NULL;
}

void familyTree::show(node* ptr)
{
    char g[10];
    strcpy(g,"Female");
    if(ptr->g)
        strcpy(g,"Male");
    cout<<"\n\nName: "<< ptr->name <<endl;
    cout<<"Age: "<< ptr->age <<endl;
    cout<<"Gender: "<<g<<endl;
}

void familyTree::display(node* ptr)
{
    // Traverses the full n-array tree by recursion to display names of all people

    if(ptr==NULL)
        return;

    while(ptr!=NULL)
    {
        cout<< ptr->name <<endl;
        display(ptr->fc);
        ptr = ptr->ns;
    }
}

void familyTree::updateX(node* ptr,int x)
{
    // Traverses the full n-array tree by recursion and updates x value of all people

    if(ptr==NULL)
        return;

    while(ptr!=NULL)
    {
        updateX(ptr->fc,x++);
        if(ptr->ns!=NULL)
            ptr->ns->x = x;
        ptr = ptr->ns;
    }
}

void familyTree::find()
{

    /*
        Same hight: Sibiling if same parent, else cousin
        Difference of height = 1 - Parent if immediate, else uncule/aunt
        Difference oh height = 2 - Grand parents if same link, elss idk
    */

    char name1[50],name2[50];
    cout<<"Enter names of two persons:\n";
    cin>>name1>>name2;
    node* ptr1 = search(name1);
    node* ptr2 = search(name2);
    node* ptr;
    node* ptrk=ptr1;
    node* ptrk1=ptr2;

    switch(ptr1->x - ptr2->x)
    {

    case 0:
            char s[50];
            strcpy(s,"sister");
            if(ptr1->g)
                strcpy(s,"brother");

            ptr = ptr1;
            while(ptr!=NULL)
            {
                if(ptr==ptr2)
                {
                    cout<<endl<<name1<<" is "<<name2<<"'s "<<s<<endl;
                    return;
                }
                ptr = ptr->ns;
            }
            ptr = ptr2;
            while(ptr!=NULL)
            {
                if(ptr==ptr1)
                {
                    cout<<endl<<name1<<" is "<<name2<<"'s "<<s<<endl;
                    return;
                }
                ptr = ptr->ns;
            }
            cout<<endl<<name1<<" and "<<name2<<" are Cousins";
            break;

    case 1:
            char str3[50];
            strcpy(str3,"daughter");
            if(ptr1->g)
                strcpy(str3,"son");
            ptr2 = ptr2->fc;
            while(ptr2!=NULL)
            {
                if(ptr2==ptr1)
                {
                    cout<<endl<<name1<<" is "<<name2<<"'s "<<str3;
                    return;
                }
                ptr2=ptr2->ns;
            }
            strcpy(str3,"niece");
            if(ptr1->g)
                strcpy(str3,"nephew");
            cout<<endl<<name1<<" is "<<name2<<"'s "<<str3;
            break;
    case -1:
            char str[10];
            strcpy(str,"mother");
            if(ptrk->g)
                strcpy(str,"father");

            ptr = ptrk->fc;
            while(ptr!=NULL)
            {
                if(ptr==ptrk1)
                {
                    cout<<endl<<name1<<" is "<<name2<<"'s "<<str;
                    return;
                }
                ptr=ptr->ns;
            }
            strcpy(str,"aunt");
            if(ptrk->g)
                strcpy(str,"uncule");
            cout<<endl<<name1<<" is "<<name2<<"'s "<<str;
            break;

    case 2:
            char str1[50];
            strcpy(str1,"daughter");
            if(ptr2->g)
                strcpy(str1,"son");
            ptr2 = ptr2->fc->fc;
            while(ptr2!=NULL)
            {
                if(ptr2==ptr1)
                {
                    cout<<endl<<name1<<" is grand "<<str1<<" of "<<name2;
                    return;
                }
                ptr2 = ptr2->ns;
            }
            break;
    case -2:
            char str2[50];
            strcpy(str2,"mother");

            if(ptr1->g)
                strcpy(str2,"father");

             ptr1 = ptr1->fc->fc;

            while(ptr1!=NULL)
            {
                if(ptr1==ptr2)
                {
                    cout<<endl<<name1<<" is grand "<<str2<<" of "<<name2;
                    return;
                }
                ptr1 = ptr1->ns;
            }

            break;
    default:
            cout<<"Too far relationship";
            break;
    }
}



node* familyTree::search(char s[50])
{
    /*
        Searches for the given name from start to it's sibilings and their children
        Returns the pointer of node where the name is present
    */

    node *ptr = start;

    if(strcmp(ptr->name,s)==0)
        return ptr;
    else if(traverseRight(start,s)!=NULL)
        return traverseRight(start,s);
    else if(traverseDown(start,s)!=NULL)
        return traverseDown(start,s);
    else
    {
        return NULL;
        cout<<"***Not found***8";
    }
}

node* familyTree::traverseDown(node* ptr, char s[50])
{
    // Searches all the children

    ptr = ptr->fc;

    while(ptr!=NULL)
    {
        if(  strcmp(ptr->name,s)==0 )
            return ptr;
        else if(traverseRight(ptr,s)!=NULL)
            return traverseRight(ptr,s);
        else
            ptr = ptr->fc;
    }
    return NULL;
}

node* familyTree::traverseRight(node* ptr, char s[50])
{

    //  Searches all the sibilings

    ptr = ptr->ns;

    while(ptr!=NULL)
    {
        if(strcmp(ptr->name,s)==0)
            return ptr;
        else if (traverseDown(ptr,s)!=NULL)
            return traverseDown(ptr,s);
        else
            ptr = ptr->ns;
    }
    return NULL;
}

void familyTree::addNew()
{
    node* temp = new node;
    temp->getData();

    if(start == NULL)
    {
        start = temp;
        temp->x=0;
    }

    else
    {
        cout<<"\nEnter any relation's name: ";
        char name[50];
        cin>>name;
        cout<<"\n1. Child\n2. Sibiling\n\n"<< temp->name <<" is ____ to "<<name<<" : ";
        int opt;
        cin>>opt;
        switch(opt)
        {
            case 1:
                    addChild(search(name),temp);
                    break;
            case 2:
                    addSib(search(name),temp);
                    break;

        }
    }
    cout<<"\nPerson sucessfully added.\n";
}

void familyTree::addSib(node* a,node* b)
{
    // b is added as sibling of a

    while(a->ns!=NULL)
        a=a->ns;
    a->ns = b;

    b->x = a->x;
}

void familyTree::addChild(node* a,node* b)
{

    // b is added as child as a (or) b is added as sibiling to last child of a

    if(a->fc==NULL)
        a->fc = b;
    else
        addSib(a->fc,b);

    b->x = a->x+1;
}

void connect(familyTree *T1, familyTree *T2)
{
    char name[50];
    int opt;
    int x;
    cout<<"Name of person in 1st tree to merge: ";
    cin>>name;
    cout<<T2->start->name<<" is __ to "<<name<<"\n1. Child 2. Sibling - ";;
    cin>>opt;
    node *ptr = T1->search(name);
    switch(opt)
    {
        case 1:
            T1->addChild(ptr,T2->start);
            x = ptr->x + 1;
            break;
        case 2:
            T1->addSib(ptr,T2->start);
            x = ptr->x;
            break;
     }
     T2->updateX(T2->start,x);
     T2->destroy(T2->start);
     cout<<"\nMerged\n";
}

int main()
{
    familyTree T[100];
    int opt,n,n1,n2;
    char c,name[50];
    cout<<"\nEnter the family tree number = ";
    cin>>n;
    while(1)
    {
#ifdef WINDOWS
        system("cls");
#endif // WINDOWS
#ifdef LINUX
        system("clear");
#endif // LINUX
        cout<<"\n\n\n\tFamily tree no = "<<n<<"\n\n\t1. Add new person\n\t2. Find relationship b/w two persons\n\t3. Search\n\t4. Destroy\n\t5. Display\n\t6. Change family tree\n\t7. Connect two family trees\n\t8. Exit\n\n\tEnter your choice = ";
        cin>>opt;
        cout<<endl;

        switch(opt)
        {

        default:
                cout<<"Invalid input";
                break;

        case 1:
                T[n].addNew();
                break;

        case 2:
                T[n].find();
                break;

        case 3:
                cout<<"Enter name of person to search: ";
                cin>>name;
                T[n].show(T[n].search(name));
                break;

        case 4:
                T[n].destroy(T[n].start);
                cout<<"Tree "<<n<<" has been destroyed sucessfully";
                break;

        case 5:
                T[n].display(T[n].start);
                break;

        case 6:
                cout<<"Enter family tree number: ";
                cin>>n;
                break;

        case 7:
               cout<<"Merge __ to __ \n";
               cin>>n2>>n1;
               connect(&T[n1],&T[n2]);
               break;

        case 8:
            return 0;

        }
        cout<<"\n\nPress any key to continue.....";
        cin>>c;
    }
}

OUTPUT :


PROGRAM UNTUK MELAKUKAN OPERASI DATA QUEUE (ANTRIAN)
#include <iostream>
#include <conio.h>

#define max 10
using namespace std;
typedef struct
{
    int data[max];
    int head;
    int tail;
}Queue;

Queue antrian;

void create()
{
    antrian.head=antrian.tail=-1;
}

int IsEmpty()
{
    if(antrian.tail==-1)
        return 1;
    else
        return 0;
}

int IsFull()
{
    if(antrian.tail==max-1)
        return 1;
    else
        return 0;
}

void Enqueue(int data)
{
    if(IsEmpty()==1)
    {
        antrian.head=antrian.tail=0;
        antrian.data[antrian.tail]=data;
        cout<<"Data "<<antrian.data[antrian.tail]<< " Sudah Masuk!"<<endl;
    }
    else if(IsFull()==0)
    {
        antrian.tail++;
        antrian.data[antrian.tail]=data;
        cout<<"Data "<<antrian.data[antrian.tail]<<" Sudah Masuk!"<<endl;
    }
    else if(IsFull()==1)
    {
        cout<<"Antrian Penuh!"<<endl;
        cout<<data<<"Maaf Data Tidak Dapat Masuk !"<<endl;;
    }
}
void Dequeue()
{
    int i;
    int e = antrian.data[antrian.head];
    if(antrian.tail==-1)
    {
        cout<<"Tidak ada data... Antrian Kosong"<<endl;
    }
    else
    {
        for(i=antrian.head;i<antrian.tail-1;i++)
        {
            antrian.data[i]=antrian.data[i+1];
        }
        antrian.tail--;
        cout<<"Data yang keluar lebih dulu = "<<e<<endl;
    }
}
void clear()
{
    antrian.head=antrian.tail=-1;
    cout<<"Antrian Kosong "<<endl;
    cout<<"Data Clear";
}
void tampil()
{
    if(IsEmpty()==0)
    {
        cout<<"Data Dalam Antrian"<<endl;
        cout<<"======================================";
        cout<<endl;
        for(int i=antrian.head; i<=antrian.tail;i++)
        {
            cout<<"| " <<antrian.data[i]<<" |";
        }
    }
    else
    {
        cout<<"Tidak ada data..antrian kosong"<<endl;
    }
}
int main()
{
    int pil;
    int data;
    create();
    do
    {
        //clrscr();
        cout<<"Implementasi Antrian "<<endl;
        cout<<"=====================";
        cout<<endl;
        cout<<"1. Enqueue"<<endl;
        cout<<"2. Dequeue "<<endl;
        cout<<"3. Print "<<endl;
        cout<<"4. Clear "<<endl;
        cout<<"5. Exit "<<endl;
        cout<<"Masukkan pilihan anda : ";
        cin>>pil;
    switch(pil)
    {
    case 1:
        {
            cout<<endl;
            cout<<"Data = ";
            cin>>data;
            Enqueue(data);
            break;
        }
    case 2:
        {
            cout<<endl;
            Dequeue();
            break;
        }
    case 3:
        {
            cout<<endl;
            tampil();
            break;
        }
    case 4:
        {
            cout<<endl;
            clear();
            break;
        }
    }
    getch();
    }
    while(pil!=5);
    return 0;
}

OUTPUT :


Referensi : Modul Praktikum Struktur Data Universitas Muhammadiyah Surakarta

Selasa, 24 April 2018

LINKED LIST (SENARAI BERANTAI)

1. PENGERTIAN LINKED LIST

Linked List atau dikenal juga dengan sebutan senarai berantai adalah struktur data yang terdiri dari urutan record data dimana setiap record memiliki field yang menyimpan alamat/referensi dari record selanjutnya (dalam urutan). Elemen data yang dihubungkan dengan link pada Linked List disebut Node. Biasanya didalam suatu linked list, terdapat istilah head dan tail.

  • Head adalah elemen yang berada pada posisi pertama dalam suatu linked list
  • Tail adalah elemen yang berada pada posisi terakhir dalam suatu linked list

2. JENIS-JENIS LINKED LIST
  • Single Linked List
Tempat yang disediakan pada satu area memori tertentu untuk menyimpan data dikenal dengan sebutan node atau simpul. Setiap node memiliki pointer yang menunjuk ke simpul berikutnya sehingga terbentuk satu untaian, dengan demikian hanya diperlukan sebuah variabel pointer. Susunan berupa untaian semacam ini disebut Single Linked List (NULL memilik nilai khusus yang artinya tidak menunjuk ke mana-mana. Biasanya Linked List pada titik akhirnya akan menunjuk ke NULL).
Pembuatan Single Linked List dapat menggunakan 2 metode:
–LIFO (Last In First Out), aplikasinya : Stack (Tumpukan)
–FIFO (First In First Out), aplikasinya : Queue (Antrean)

  • Double Linked List
Salah satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat bergerak satu arah saja, maju/mundur, atau kanan/kiri sehingga pencarian data pada single linked list hanya dapat bergerak dalam satu arah saja. Untuk mengatasi kelemahan tersebut, dapat menggunakan metode double linked list. Linked list ini dikenal dengan nama Linked list berpointer Ganda atau Double Linked List.

  • Circular Linked List
Circular Linked List merupakan suatu linked list dimana tail (node terakhir) menunjuk ke head (node pertama). Jadi tidak ada pointer yang menunjuk NULL. Ada 2 jenis Circular Linked List, yaitu :

–Circular Single Linked List
contoh :
–Circular Double Linked List
contoh :

  • Multiple Linked List

Multiple Linked List merupakan suatu linked list yang memiliki lebih dar 2 buat variabel pointer. contoh :

  • Non Circular linked list

Pengertian :
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.

Ilustrasinya :
-Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data.
-Pada akhir linked list, node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list


3. OPERASI YANG ADA DI DALAM LINKED LIST
  • Operasi Pada Single Linked List 
–Insert = Istilah  Insert berarti menambahkan  sebuah  simpul baru ke dalam  suatu linked  list.
–Konstruktor = Fungsi ini membuat sebuah  linked  list yang baru dan masih kosong. 
–IsEmpty = Fungsi ini menentukan apakah  linked list kosong atau  tidak.
–Find First = Fungsi ini mencari elemen pert ama dari linked  list 
–Find Next = Fungsi ini mencari elemen  sesudah elemen yang ditunjuk now. 
–Retrieve = Fungsi  ini  mengambil  elemen  yang  ditunjuk  oleh  now.  Elemen  tersebut  lalu dikembalikan oleh fungsi. 
–Update = Fungsi ini mengubah elemen yang ditunjuk oleh  now dengan  isi dari  sesuatu. 
–Delete Now = Fungsi  ini  menghapus  elemen  yang  ditunj uk  oleh  now.  J ika  yang  dihapus  adalah elemen pertama dari  linked  list (head), head akan berpindah ke elemen berikut. 

  • Operasi –operasi pada Double Linked List
–Insert Tail = Fungsi  insert  tail  berguna  untuk  menambah  simpul  di  belakang  (sebelah  kanan)  pada sebuah linked list.
–Insert Head = Sesuai dengannamanya, fungsi Insert Head berguna untuk menambah simpul di depan (sebelah  kiri).   Fungsi  ini  tidak  berada  jauh  dengan  fungsi  Insert  Tail    yang  t elah dijelaskan  sebelumnya.
–Delete Tail = Fungsi  Delete  Tail  berguna  untuk  menghapus  simpul  dari  belakang.  Fungsi  ini merupakan kebalikan dari fungsi I nsert Tail yang menambah simpul dibelakang. Fungsi Delete  Tail  akan  mengarahkan  Now  kepada  Tail  dan  kemudian  memanggil  fungsi Delete Now.
–Delete Head  = Fungsi  Delete  Head  merupakan  kebalikan  dari  fungsi  Delete  Tail  yang  menghapus simpul  dari  belakang,  sedangkan  Delete  Head  akan  menghapus  simpul  dari  depan (sebelah  kiri).  Fungsi  Delete  Head  akan  mengarahkan  Now  kepada  Head  dan kemudianm memanggil fungsi Delete Now. 


4. AGORITMA DAN CONTOH PROGRAM UNTUK OPERASI-OPERASI DIDALAMNYA

a. Single Linked List
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
struct TNode{
    int data;
    TNode *next;
};
TNode *head, *tail;

void init(){
    head = NULL;
    tail = NULL;
}
int isEmpty(){
 if(tail == NULL) return 1;
 else return 0;
}
void insertDepan(int databaru){
  TNode *baru;
  baru = new TNode;
  baru->data = databaru;
  baru->next = NULL;
  if(isEmpty()==1){
          head=tail=baru;
          tail->next=NULL;
     }
  else {
         baru->next = head;
         head = baru;
  }
  cout<<"Data masuk\n";
}

void insertBelakang(int databaru){
 TNode *baru,*bantu;
 baru = new TNode;
 baru->data = databaru;
 baru->next = NULL;
 if(isEmpty()==1){
 head=baru;
 tail=baru;
 tail->next = NULL;
 }
 else {
  tail->next = baru;
  tail=baru;
 }
 cout<<"Data masuk\n";
}

void tampil(){
 TNode *bantu;
 bantu = head;
     if(isEmpty()==0){
          while(bantu!=NULL){
           cout<<bantu->data<<" ";
           bantu=bantu->next;
          }
     } else cout<<"Masih kosong\n";
  }

void hapusDepan(){
     TNode *hapus;
     int d;
     if (isEmpty()==0){
          if(head!=tail){
           hapus = head;
           d = hapus->data;
           head = head->next;
           delete hapus;
          } else {
           d = tail->data;
           head=tail=NULL;
          }
     cout<<d<<"terhapus";
     } else cout<<"Masih kosong\n";
}
void hapusBelakang(){
     TNode *bantu,*hapus;
     int d;
     if (isEmpty()==0){
      bantu = head;
          if(head!=tail){
               while(bantu->next!=tail){
                bantu = bantu->next;
               }
               hapus = tail;
               tail=bantu;
               d = hapus->data;
               delete hapus;
               tail->next = NULL;
            }else {
            d = tail->data;
             head=tail=NULL;
            }
      cout<<d<<" terhapus\n";
     } else cout<<"Masih kosong\n";
}
void clear()
{
        TNode *bantu,*hapus;
        bantu = head;
        while(bantu!=NULL)
        {
            hapus = bantu;
            bantu = bantu->next;
            delete hapus;
        }
        head = NULL;
      printf("CLEAR");
}

main()
{
    int pil,databaru;

    do
    {
        clrscr();
        cout<<endl<<endl;
        cout<<"   ==========================="<<endl;
        cout<<"   =  PROGRAM LINKED LIST    ="<<endl;
        cout<<"   ==========================="<<endl;
        cout<<"   = 1. Insert Depan         ="<<endl;
        cout<<"   = 2. Insert Belakang      ="<<endl;
        cout<<"   = 3. Delete Depan         ="<<endl;
        cout<<"   = 4. Delete Belakang      ="<<endl;
        cout<<"   = 5. Tampil Data          ="<<endl;
        cout<<"   = 6. Clear                ="<<endl;
        cout<<"   = 7. Exit                 ="<<endl;
        cout<<"   ==========================="<<endl;
        cout<<"   Masukan Pilihan : ";cin>>pil;
        switch (pil)
        {
            case 1: clrscr();{
                cout<<"Masukkan Data = ";
                cin>>databaru;
                insertDepan(databaru);
                break;
            }
            case 2: clrscr();{
                cout<<"Masukkan Data = ";
                cin>>databaru;
                insertBelakang(databaru);
                break;
            }
            case 3: clrscr();{
                hapusDepan();
                break;
            }
            case 4: clrscr();{
                hapusBelakang();
                break;
            }
            case 5: clrscr();{
                tampil();
                break;
            }
            case 6: clrscr();{
                clear();
                break;
            }
            case 7: {
            return 0;
             break;
            }
            default : clrscr();{
            cout<<"\n Maaf, Pilihan yang anda pilih tidak tersedia!";
            }

        }
        getch();
    }
    while(pil!=7);
}

b. Double Linked List
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
int pil;
void pilih();
void buat_baru();
void tambah_belakang();
void tambah_depan();
void hapus_belakang();
void hapus_depan();
void tampil();
void tambah_tengah();
void hapus_tengah();
struct node
{
char nama [20];
int umur;
float tinggi;
node *prev, *next;
};
node *baru, *head=NULL, *tail=NULL,*hapus,*bantu,*bantu2;
void main()
{
do
{
clrscr();
cout<<"MENU DOUBLE LINKEDLIST"<<endl;
cout<<"1. Tambah Depan"<<endl;
cout<<"2. Tambah Belakang"<<endl;
cout<<"3. Hapus Depan"<<endl;
cout<<"4. Hapus Belakang"<<endl;
cout<<"5. Tampilkan"<<endl;
cout<<"6. Tambah Tengah"<<endl;
cout<<"7. Hapus Tengah"<<endl;
cout<<"8. Selesai"<<endl;
cout<<"Pilihan Anda : ";
cin>>pil;
pilih();
} while(pil!=8);
}
void pilih()
{
if(pil==1)
tambah_depan();
else if(pil==2)
tambah_belakang();
else if(pil==3)
hapus_depan();
else if(pil==4)
hapus_belakang();
else if(pil==5)
tampil();
else if(pil==6)
tambah_tengah();
else if(pil==7)
hapus_tengah();
else
cout<<"selesai";
}
void buat_baru()
{
baru = new(node);
cout<<"input nama : ";cin>>baru->nama;
cout<<"input umur : ";cin>>baru->umur;
cout<<"input tinggi : ";cin>>baru->tinggi;
baru->prev=NULL;
baru->next=NULL;
}
void tambah_belakang()
{
buat_baru();
if(head==NULL)
{
head=baru;
tail=baru;
}
else
{
tail->next=baru;
baru->prev=tail;
tail=baru;
}
cout<<endl<<endl;
tampil();
}
void tambah_depan()
{
buat_baru();
if(head==NULL)
{
head=baru;
tail=baru;
}
else
{
baru->next=head;
head->prev=baru;
head=baru;
}
cout<<endl<<endl;
tampil();
}
void hapus_depan()
{
if (head==NULL)
cout<<"Kosong";
else if (head->next==NULL)
{
hapus=head;
head=NULL;
tail=NULL;
delete hapus;
}
else
{
hapus=head;
head=hapus->next;
head->prev=NULL;
delete hapus;
}
cout<<endl<<endl;
tampil();
}
void hapus_belakang()
{
if (head==NULL)
cout<<"Kosong";
else if (head->next==NULL)
{
hapus=head;
head=NULL;
tail=NULL;
delete hapus;
}
else
{
hapus=tail;
tail=hapus->prev;
tail->next=NULL;
delete hapus;
}
cout<<endl<<endl;
tampil();
}
void tampil()
{
if (head==NULL)
cout<<"Kosong";
else
{
bantu=head;
while(bantu!=NULL)
{
cout<<" nama : "<<bantu->nama;
cout<<" umur : "<<bantu->umur;
cout<<" tinggi : "<<bantu->tinggi<<endl;
bantu=bantu->next;
}
}
getch();
}
void tambah_tengah()
{
     int sisip;
     cout<<"Masukan Posisi Sisip Anda : ";cin>>sisip;
     bantu=head;
     for(int i=1;i<sisip-1;i++)
     {
       bantu=bantu->next;
     }
     buat_baru();
     bantu2=bantu->next;
     bantu->next=baru;
     baru->prev=bantu;
     baru->next=bantu2;
     bantu2->prev=baru;
}
void hapus_tengah()
{
  int sisip;
   cout<<"Masukan Posisi Sisip Anda : ";cin>>sisip;
   bantu=head;
   for(int i=1;i<sisip-1;i++)
   {
    bantu=bantu->next;
   }
   hapus=bantu->next;
   bantu2=hapus->next;
   bantu->next=hapus->next;
   bantu2->prev=bantu;
   delete hapus;
}


REFERENSI :
http://mudavih16.blogspot.co.id/2015/11/struktur-data-linked-list.html


Selasa, 06 Maret 2018

1.        Untuk bisa menghasilkan program yang baik memerlukan analisis yang baik pula, baik itu analisis sistem, stuktur data maupun analisis requirement, selin itu juga dipelukan persiapan-persiapan yang matang. Hal ini berlaku bagi siapapun, bahkan seorang programmer professional sekalipun.  Sedangkan tahapan apas aja untuk membuat program yang baik akan saya jelaskan dibawah.

      Program memang sudah menjadi kebutuhan pokok bagi masyarakat IT. Karena segala sesuatu yang dilakukan di dalam IT pastilah memerlukan program. Program yang paling sederhana sekalipun setidaknya memiliki 3 bagian:

Input – Masukan data.
Proses – pemrosesan input.
Output – keluaran program, kebutuhan yang kita harapkan.

Dalam membuat program, pemrograman adalah pokok dari proses pembuatan program itu sendiri namun pemrograman bergantung dari pemahaman persoalan, analisis sistem, perencanaan-perencanaan  dalam mendesain program itu sendiri.

2.        Struktur Data Sederhana
a. Array (Larik).
adalah struktur data statik yang menyimpan sekumpulan elemen bertipe sama.
Setiap elemen diakses secara langsung melalui indeksnya. Indeks larik harus tipe data yang menyatakan keterurutan, misalnya: integer atau karakter. Banyaknya elemen larik harus sudah diketahui sebelum program dieksekusi. Tipe elemen larik dapat berupa tipe sederhana, tipe terstruktur atau tipe larik lain. Nama lain dari Array adalah Larik, tabel, atau vektor.

b. Record (catatan)
adalah kumpulan data yang terdiri dari beberapa field(isian) dengan berbagai macam tipe data.

Struktur Data Majemuk

a. Linier.
Stack(tumpukan)
adalah list linier yang dikenali berupa elemen puncaknya(top), aturan penyisipan dan penghapusan elemennya tertentu (penyisipan selalu dilakukan "diatas"(top) dan penghapusan selalu dilakukan pada "top").

Karena aturan penyisipan dan penghapusan semacam itu, "top" adalah satu- satunya alamat tempat terjadinya operasi. Elemen yang paling akhir ditambahkan akan menjadi elemen yang akan dihapus. Dapat dikatakan elemen stack akan tersusun secara LIFO(last in first out).

Queue(antrian)
adalah list linier yang dikenali berupa elemen pertama(head) dan elemen terakhir(tail), dimana aturan penyisipan dan penghapusan elemennya didefinisikan sebagai penyisipan selalu dilakukan setelah elemen terakhir, penghapusan selalu dilakukan pada elemen pertama dengan kondisi satu elemen dengan elemen lainnya dapat diakses melalui informasi "next".

List dan Multi-List(Daftar)
adalah sekumpulan list linier yang dengan elemen yang bertype sama, yang memiliki keterurutan tertentu, yang setiap elemennya terdiri dari 2 bagian.

b. Non-Linier.
Binary-Tree(Pohon biner)
adalah himpunan terbatas yang mungkin kosong atau terdiri dari sebuah simpul yang disebut sebagai akar dan dua buah himpunan lain yang disjoint yang merupakan pohon biner yang disebut sebagai sub-pohon kiri(left) dan sub-pohon kanan(right) dari pohon biner tersebut.

Pohon biner merupakan type yang sangat penting dari struktur data dan banyak dijumpai dalam berbagai terapan. Karakteristik yang dimiliki oleh pohon biner adalah bahwa setiap simpul yang paling banyak hanya memiliki dua buah anak, dan mungkin tidak punya anak.

Istilah- istilah yang digunakan sama dengan istilah pada pohon secara umum.

Graph(graf)
merupakan struktur data yang paling umum. Jika struktur linier memungkinkan pendefinisian keterhubungan sekuensial antar entitas data, struktur data tree memungkinkan pendefinisian keterhubungan hirarkis, maka struktur graph memungkinkan pendefinisian keterhubungan tak terbatas antara entitas data.

Banyak entitas- entitas data dalam masalah- masalah nyata secara alamiah memiliki keterhubungan langsung(adjacency) secara tak terbatas.

3.        Penjelasan penggunaan Struktur data pada perangkat lunak sebagai pengembang  :
Dalam teknik pemograman, struktur data berarti tata letak data yang berisi kolom-kolom data, baik itu kolom yang tampak oleh pengguna (user) maupun kolom yang digunakan untuk keperluan pemograman yang tidak tampak oleh pengguna.
Analisis & Desain Model
Analisis terhadap kebutuhan dapat menggunakan beberapa alat seperti :
a)      Data Flow Diagram (DFD)
b)      Entity Relationship Diagram (ERD)
c)      State Transition Diagram (STD)
untuk menganalisis kebutuhan dibutuhkan suatu bekal dapat memudahkan penganalisisan suatu kebutuhan, bekal yang dibutuhkan ialah Data Dictionary.
Data Dictionary berisi gambaran objek data yang diperlukan dan akan dihasilkan oleh software. Diagram-diagram diatas mempunyai karakteristik masing masing.
DFD memberi gambaran bagaimana data berubah dalam sistem. ERD menggambarkan relasi antara objek data. STD menggambarkan bagaimana kerja sistem melalui kondisi dan kejadian yang menyebabkan data berubah, STD juga menggambarkan proses yang dilakukan karena kejadian tertentu.
Hasil  yang diperoleh dari proses penganalisian adalah model analisis yang kemudian menjadi bekal untuk melakukan desain.

4.        Analogi abstaction pada windows phone.
Saya telah menetapkan bahwa memiliki perakitan "inti" per platform untuk kode portabel (viewmodel, pembantu, dll.) Dan perakitan terpisah per basis data / toko penyimpanan (SqlCe, Sqlite, dll.) Bahwa rakitan inti spesifik platform nampaknya bekerja Ini berarti kelas model saya masih didefinisikan dalam majelis DAL, namun setidaknya saya bisa menyediakan antarmuka umum sederhana (yang didefinisikan di setiap majelis DAL, sayangnya, karena kelas model DAL) yang masih memberi saya dukungan IQueryable.

Berkat "copy as link" dalam Visual Studio, menyiapkan majelis inti dan memastikan bahwa antarmuka layanan database umum sama untuk setiap perakitan DAL cukup mudah. Dengan # ifdef saya bahkan dapat menggunakan kembali banyak file kelas model DAL dan mengkompilasi atribut secara bersyarat, kode khusus database, dll. Yang memungkinkan saya untuk menggunakan "copy as link" untuk mereka juga.

   public interface IDataService
{
IQueryable<ModelType1> ModelType1 { get; }
IQueryable<ModelType2> ModelType2 { get; }

void AddModelType1(ModelType1 item);
void RemoveModelType1(ModelType1 item);

void AddModelType2(ModelType2 item);
void RemoveModelType2(ModelType2 item);

void CreateDatabase();
void ResetDatabase();
}
The resulting map of references is kind of like this:

System.Data.Linq -> App.Data.SqlCe -> App.Core.WP -> App.WP
/                   /
(some shared code)  (all shared code)
/                /
Sqlite -> App.Data.Sqlite -> App.Core.Win8 -> App.Win8
Tempat itu sama bersihnya seperti yang kuinginkan, tapi setidaknya sepertinya berhasil.

5.        Terdapat dua pendekatan Umum yang bisa digunakan dalam merancang algoritma, yaitu pendekatan perancangan top down dan bottom-up,  pendekatan perancangan secara top-down dimulai dengan cara membagi algoritma yang kompleks menjadi satu atau lebih dari satu modul. Modul yang terbagi ini masih bisa duraikan lagi menjadi beberapa sub-modul, dan proses ini dilakukan berulang-ulang hingga kompleksitas modul yang diinginkan terpenuhi. Metode perancangan top-down merupakan bentuk perbaikan secara bertahap yang dimulai dengan modul paling atas kemudian secara bertahap menambah modul lain yang dipanggil.
Untuk pendekatan secara bottom-up, merupakan kebalikan dari top down.  Dimana modul ini dimulai dengan pembuatan modul paling dasar, kemudian dilanjutkan ke perancangan modul tingkat yang lebih tinggi.
Dari kedua pendekatan diatas, yaitu  top-down dan bottom-up, apakah strategi top down / bottom-up,  tentu tergantung pada aplikasi yang ditangani. Pendekatan top-down  mengkuti perbaikan secara bertahap dengan menguraikan algoritma ke dalam modul secara terkelola.
Sementara pendekatan bottom-up mendefinisikan modul terlebih dahulu baru kemudian mengelompokan beberapa , modul secara bersama untuk membentuk modul baru tingkat lebih tinggi. Pendekatan top-down sangat bagus dalam hal kemudahan membuat dokumentasi modul, menghasilkan uji kasus, implementasi kode, dan debugging.  Namun, terdaopat kekurangan karena sub-modul dianalisis dalam sebuah isolasi tanpa memperhatikan komuikasi dengan modul lain sehingga mengabaikan konsep penyembunyian informasi.
6.        Algoritma :

Inisialisaikan bil1, bil2, oprs, hasil
Input nilai a, b
Pilih salah satu operasi dari (+),(-),(x),(:)
Jika anda memilih operasi (+), maka hasil = a + b
Jika anda memilih operasi (-), maka hasil = a - b
Jika anda memilih operasi (x), maka hasil = a * b
Jika anda memilih operasi (:), maka hasil = a / b
Cetak hasil

Flowchart
7.        Notasi
Pernyataan “f(x) adalah O(g(x))” sebagaimana didefinisikan sebelumnya, biasa ditulis f(x) = O(g(x)) Pernyataan ini adalah penyalahgunaan notasi. Persamaan dari dua buah fungsi tidak dinyatakan. Properti O(g(x)) tidaklah simetrik: Karena alasan ini, beberapa penulis lebih memilih menggunakan notasi himpunan dan menulis Menganggap O(g) sebagai himpunan dari fungsi fungsi yang didominasi oleh g. Dalam penggunaan yang lebih rumit, , O( ) dapat muncul pada tempat yang berbeda di dalam sebuah persamaan, bahkan beberapa kali untuk masing-masing sisi.
Misalnya, pernyataan berikut benar untuk (n + 1)2 = n2 + O(n) nO(1) = O(en)
Maksud dari pernyataan diatas adalah :
Untuk setiap fungsi yang memenuhi untuk setiap O( ) pada sisi kiri, terdapat fungsi-fungsi yang memenuhi masing-masing O( ) pada sisi kanan, melakukan substitusi untuk semua fungsi-fungsi ini ke dalam persamaan menyebabkan kedua sisi menjadi sama. Misalnya, persamaan ke-3 diatas berarti: “Untuk setiap fungsi f(n) = O(1), terdapat fungsi-fungsi g(n) = O(en) sehingga nf(n) = g(n)”