SLLNC – lanjutan (penambahan data ditengah list)

Diilhami dari tugas kuliah. Terimakasih untuk dosen saya, Pak Iksan yang sudah memberi tugas ini. Jadinya saya jadi punya ‘bahan’ untuk diposting dan dibuat. Saya lihat di google sepertinya belum ada yang membahas link-list lanjutan, atau cuma saya yang kurang beruntung bisa menemukannya ==” . Langsung saja.

Di tulisan sebelumnya yang telah saya post di blog ini membahas tentang fungsi-fungsi umum pada program SLLNC (Single Linked-List Non Circular) seperti penambahan data dari depan, belakang, menampilkan data, menghapus dari depan, belakang, dan menghapus keseluruhan. Sekarang saya tambahi dengan penambahan data dari tengan link-list.

Logikanya sederhana, pertama kita harus mengetahui dulu jumlah data yang ada dalam link-list. Kemudian untuk mengetahui posisi tengah data, maka jumlah total data dibagi dua (jumlah/2). Kemudian dilakukan penyisipan data didalam link-list

dari program yang ada pada post http://ilmucerdas.wordpress.com/2012/05/22/program-sllnc-dengan-head-dan-tail-dengan-bahasa-c/, tambahkan fungsi berikut untuk melakukan penambahan data dari tengah.

 int jmlData(){
    struct node *tmp=first;
    int jml=0;
    if(first==NULL)return 0;
    else{ while(tmp!=NULL){
        tmp= tmp->link;
        jml++;}}
    return jml;
}
void addMiddle(){
    system("cls");
    struct node *tmp=first,*tmp2,*newData = malloc(sizeof(struct node));
    int jml = jmlData(),jml2=0,middle;
    if(jml<2)middle=0;
    else middle= (jml/2)-1;
    printf("\n _____Add from middle side_____");
    printf("\n\n Enter the item tobe created: ");
    scanf("%d", &newData->info);
    newData->link=NULL;
    if(first==NULL){
        first=last=newData;
        last->link=NULL;
    }
    else{
        while(jml2!=middle){
            tmp=tmp->link;
            jml2++;
        }
        tmp2= tmp->link;
        newData->link=tmp2;
        tmp->link=newData;
    }
    display();
}

Download program lengkapnya di link berikut :

 SLLNC dengan penambahan data ditengah

password: ilmucerdas

C – Stack of array

Pada dasarnya STACK atau tumpukan itu hampir sama dengan array, hanya saja dalam stack, prinsip ketersediaan ruang didefinisikan dalam konstanta. Dan pengambilan data tidak dapat langsung diambil di index yang dituju seperti pada array, tetapi diambil dari data teratas terlebih dahulu. Sistemnya adalah data yang terakhir masuk adalah yang pertama keluar. Seperti pada contoh program sederhana berikut.

#include <stdio.h>
#include <stdlib.h>#define MAX 6
void push();
void pop();
int isFull();
int isEmpty();
void display();
int stack[6], TOP= -1;
int main() {
int stack[6], TOP= -1, choice;
printf("\nENter the choice\n");
printf("1. PUSH\n");
printf("2. POP\n");
printf("3. DISPLAY\n");
scanf("%d",&choice);
switch(choice){
case 1: push(); break;
case 2: pop(); break;
case 3: display();default : printf("invalid choice");
}
main();
return 0;
}
int isFull(){
if(TOP==MAX-1) return 1;
else return 0;
}
int isEmpty(){
if(TOP==-1) return 1;
else return 0;
}
void push(){
if(isFull()==1) printf("Overflow");
else {
int item;
printf("Enter the item :");
scanf("%d", &item);
TOP=TOP+1;
stack[TOP]=item;
}
}
void pop(){
int temp;
if(isEmpty()==1) printf("under flow");
else{
temp=stack[TOP];
TOP=TOP-1;
}
}
void display(){
int i, temp=TOP;
if(isEmpty()==1)printf("\nNo data");
else{
printf("\nStack contens are\n");
printf("\n\tLocation data\n");
printf("\n-------------\nTOP->");
for(i=TOP;i>=0;i--){
printf("\t%d\t->%d",temp--,stack[i]);
printf("\n\t------------\n");
}
}
}
 

Program SLLNC dengan Head dan Tail dengan bahasa C

Berikut adalah contoh sederhana program SLLNC (Single Link List Non Circular) dengan pointer head dan tail yang dilengkapi fungsi inisialisasi, pengecekan list, penambahan dari depan, penambahan dari belakang, penghapusan dari depan, penghapusan dari belakang, serta fungsi untuk menghapus semua list.

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

struct node{
    int info;
    struct node *link;
};

struct node *first=NULL, *last=NULL;
void addFront();
void addBack();
void clearFront();
void clearBack();
void clearAll();
void cekElement();
void display();
void back();
void exitGate();
int isEmpty();

int main()
{
    system("cls");
    char choice;
    printf("\n _____Single Link-list Non Circular_____");
    printf("\n\n Enter the choice:\n");
    printf("\n 1. Add from front side "
           "\n 2. Add from back side "
           "\n 3. Delete from front side "
           "\n 4. Delete from back side "
           "\n 5. Delete all data record "
           "\n 6. Display record "
           "\n 7. Exit "
           "\n\n ...");
    scanf("%c",&choice);
        switch(choice){
            case '1': addFront(); break;
            case '2': addBack();break;
            case '3': clearFront();break;
            case '4': clearBack();break;
            case '5': clearAll();break;
            case '6': display(); break;
            case '7': exitGate();break;
            default: system("cls"); printf("\n Please chose valid option...\n");
            back(); break;
            }
    return 0;
}
int isEmpty(){
    if(first == NULL) return 1;
    else return 0;
}

void addFront(){
 struct node *newData=malloc(sizeof(struct node));
 system("cls");
 printf("\n _____Add from front side_____");
 printf("\n\n Enter the item tobe created: ");
 scanf("%d", &newData->info);
 newData->link=NULL;
 if(isEmpty()==1){
 first=last=newData;
 last->link = NULL;
 }
 else {
 newData->link = first;
 first = newData;
 }
 printf(" Data has been created.");
 display();
}

void addBack(){
    struct node *newData=malloc(sizeof(struct node));
    system("cls");
    printf("\n _____Add from back side_____");
    printf("\n\n Enter the item tobe created: ");
    scanf("%d", &newData->info);
    newData->link=NULL;
    if(isEmpty()==1){
        first=last=newData;
        last->link=NULL;
    }
    else{
        last->link=newData;
        last=newData;
    }
      printf(" Data has been created.");
      display();
}
void clearFront(){
    char titik[]="...";
    int i,deleted;
    printf("\n Processing");
    for(i=0;titik[i]>0;i++){Sleep(200);printf("%c",titik[i]);}
    cekElement();
    struct node *hapus;
        if(first!=last){
            hapus=first;
            deleted=hapus->info;
            first=first->link;
        }
        else{
            deleted=first->info;
            first=last=NULL;
        }
    printf(" %d is deleted from link-list.",deleted);
    display();
}
void clearBack(){
    char titik[]="...";
    int i,deleted;
    printf("\n Processing");
    for(i=0;titik[i]>0;i++){Sleep(200);printf("%c",titik[i]);}
    cekElement();
    struct node *tmp,*hapus;
        tmp=first;
        if(first!=last){
            while(tmp->link!=last){
                tmp=tmp->link;
            }
            hapus=last;
            last=tmp;
            deleted=hapus->info;
            last->link=NULL;
        }
        else{
        deleted=last->info;
        first=last=NULL;
        }
    printf(" %d is deleted from link-list.",deleted);
    display();
}
void clearAll(){
    char titik[]="...";
    int i,deleted;
    printf("\n Processing");
    for(i=0;titik[i]>0;i++){Sleep(200);printf("%c",titik[i]);}
    cekElement();
    struct node *tmp,*hapus;
    tmp=first;
    while(tmp!=NULL){
        hapus = tmp;
        tmp = tmp->link;
    }
    first=last=NULL;
    printf("\n All record has been erased.");
    display();
}
void display(){
        cekElement();
        struct node *temp=first;
        printf("\n\n The elements are ... \n\n");
        while(temp!=NULL){
            printf("\t%d -> ",temp->info);
            temp=temp->link;
        }
       printf("NULL");
    back();
}
void back(){
    getchar();
    getchar();
    main();
}
void cekElement(){
    if(first==NULL)
        {printf("\n Status : No Data.");
        back();}
}
void exitGate(){
    system("cls");
    printf("\n Author : Iin aryani :) ");
    getch();exit(1);
}

Saya akan tulis ini berulang-ulang. Saya juga pemula, jadi tolong berikan tanggapan atau kritik dan saran agar blog ini bisa lebih baik. Terimakasih.

Aplikasi untuk mencatat informasi kontak personal

Berikut adalah source code sederhana untuk mencatat informasi kontak. Program ini menggunakan database berupa file txt yang diakses untuk menyimpan data.

/*------------------------------------*
 | Copyright:Ilmucerdas.wordpress.com |
 | Author:iin.aryani@yahoo.co.id      |
 |                                    |
 | Aplikasi pencatat informasi kontak |
 | Versi 01                           |
 | oleh : Iin Aryani                  |
 | 2012                               |
 *------------------------------------*/
/* kumpulan file library */
#include <stdio.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>
/* kumpulan deklarasi-deklarasi prototype fungsi dan variabel */
void tambahKontak();
void lihatKontak();
void cariKontakFromNama(char nama[]);
void cariKontakFromNo(char no[]);
void cekFile();
void keluar();
void back();
void errMsg();
struct kontak
{
    char nama[20];
    char nomor[20];
    char alamat[30];
}
kontak;
int jumlahKontak=0;
char keyword,cariNama[20],cariNomor[20];
FILE *Fileku,*Fileku2;

void main()
{
    mkdir("db");
    system("cls");
    printf("\n ________APLIKASI PENCATAT KONTAK________\n"
           "\n 1. Tambahkan data kontak"
           "\n 2. Lihat semua kontak"
           "\n 3. Cari kontak"
           "\n 4. Keluar"
           "\n\n Perintah : ");
    scanf("%c",&keyword);
    system("cls");
    if(keyword=='1'){
        tambahKontak();
    }
    else if(keyword=='2'){
        lihatKontak();
    }
    else if(keyword=='3'){
        printf("\n 1. Cari berdasarkan nama"
               "\n 2. Cari berdasarkan nomor"
               "\n\n Perintah : ");
        fflush(stdin);
        scanf("%c",&keyword);
        system("cls");
        printf("\n _________CARI KONTAK________\n");
        if(keyword=='1'){
            printf("\n Nama : ");
            fflush(stdin);
            gets(cariNama);
            cariKontakFromNama(cariNama);
        }
        if(keyword=='2'){
            printf("\n No : ");
            fflush(stdin);
            gets(cariNomor);
            cariKontakFromNo(cariNomor);
        }
        else errMsg();
    }
    else if(keyword=='4'){
        keluar();
    }
    else errMsg();
}
void tambahKontak(){
    Fileku=fopen("db/kontakList.txt","a+");
    printf("\n ________TAMBAH KONTAK________\n"
           "\n Nama : ");
    fflush(stdin);
    gets(kontak.nama);

    printf(" Alamat : ");
    fflush(stdin);
    gets(kontak.alamat);
    printf(" No.Telp/Hp. : ");
    fflush(stdin);
    gets(kontak.nomor);
    fwrite(&kontak, sizeof(kontak),1,Fileku);
    printf("\n Data berhasil ditambahkan...\n");
    fclose(Fileku);
    back();
}
void lihatKontak(){
    cekFile();
    Fileku = fopen("db/kontakList.txt","a+");
    printf("\n _____________________________DAFTAR SEMUA KONTAK______________________________\n");
    printf("\n %20s | %30s | %20s |\n","Nama","Alamat","Nomor");
    while(fread(&kontak, sizeof(kontak),1,Fileku)!=0){
    printf("\n %20s | %30s | %20s |",
           kontak.nama,kontak.alamat,kontak.nomor);
    }
    fclose(Fileku);
    printf("\n");
    back();
}
void cekFile(){
    Fileku=fopen("db/kontakList.txt","a+");
    if(fread(&kontak, sizeof(kontak),1,Fileku)==0){
    printf("\n Database kosong!\n");
    fclose(Fileku);
    back();
    }
    fclose(Fileku);
}
void cekJumlah(){
    Fileku = fopen("db/kontakList.txt","a+");
    while(fread(&kontak,sizeof(kontak),1,Fileku)==1)
            {
                jumlahKontak++;
            }
    fclose(Fileku);
}
void cariKontakFromNama(char nama[]){
    int ketemu=0;
    Fileku = fopen("db/kontakList.txt","a+");
    int no_rekaman=0;
            while(fread(&kontak,sizeof(kontak),1,Fileku)==1)
            {
                no_rekaman++;
                if(strcmp(kontak.nama,nama)==0)
                    {ketemu=1;break;}
            }
    fclose(Fileku);
    if(ketemu==1)
        {
            printf("\n _______DATA DITEMUKAN_______\n"
                   "\n Nama \t\t: %10s%20s"
                   "\n Alamat\t\t: %30s"
                   "\n No.Telp/Hp\t: %10s%20s"," ",
                   kontak.nama,kontak.alamat," ",kontak.nomor);
            printf("\n 1. Hapus"
                   "\n 2. Kembali"
                   "\n\n Perintah : ");
            fflush(stdin);
            scanf("%c",&keyword);
            if(keyword=='1'){
                Fileku = fopen("db/kontakList.txt","a+");
                Fileku2=fopen("db/kontakList2.txt","w+");
                no_rekaman--;
                int hit=0;

                while(fread(&kontak,sizeof(kontak),1,Fileku)==1)
                {
                 if(hit!=no_rekaman){
                 fwrite(&kontak, sizeof(kontak),1,Fileku2);
                 }
                 hit++;
                }
                fclose(Fileku);
                printf("\n Data berhasil dihapus ");
            fclose(Fileku2);
            unlink("db/kontakList.txt");
            rename("db/kontakList2.txt","db/kontakList.txt");
            }
    }
    else printf("\n TIDAK DITEMUKAN\n");
    fclose(Fileku);
    back();
}
void cariKontakFromNo(char no[]){
    int ketemu=0;
    Fileku = fopen("db/kontakList.txt","a+");
    int no_rekaman=0;
            while(fread(&kontak,sizeof(kontak),1,Fileku)==1)
            {
                no_rekaman++;
                if(strcmp(kontak.nomor,no)==0)
                    {ketemu=1;break;}
            }
    fclose(Fileku);
    if(ketemu==1)
        {
            printf("\n _______DATA DITEMUKAN_______\n"
                   "\n Nama \t\t: %10s%20s"
                   "\n Alamat\t\t: %30s"
                   "\n No.Telp/Hp\t: %10s%20s"," ",
                   kontak.nama,kontak.alamat," ",kontak.nomor);
            printf("\n 1. Hapus"
                   "\n 2. Kembali"
                   "\n\n Perintah : ");
            fflush(stdin);
            scanf("%c",&keyword);
            if(keyword=='1'){
                Fileku = fopen("db/kontakList.txt","a+");
                Fileku2=fopen("db/kontakList2.txt","w+");
                no_rekaman--;
                int hit=0;

                while(fread(&kontak,sizeof(kontak),1,Fileku)==1)
                {
                 if(hit!=no_rekaman){
                 fwrite(&kontak, sizeof(kontak),1,Fileku2);
                 }
                 hit++;
                }
                fclose(Fileku);
                printf("\n Data berhasil dihapus ");
            fclose(Fileku2);
            unlink("db/kontakList.txt");
            rename("db/kontakList2.txt","db/kontakList.txt");
            }
    }
    else printf("\n TIDAK DITEMUKAN\n");
    fclose(Fileku);
    back();
}
void back(){
    getchar();
    getchar();
    main();
}
void keluar(){
    system("cls");
    printf("\n Terimakasih...\n by:http://ilmucerdas.wordpress.com\n\n");
    getchar();
    getchar();
    exit(1);
}
void errMsg(){
    system("cls");
    printf("\n Perintah salah!\n");
    getchar();
    getchar();
    main();
}

Beritahu saya jika ada yang salah.

Program Kumpulan 4 macam sorting array (bubble, exchange, selection, insertion)

Sebenarnya ini adalah source kode untuk tugas kuliah saya. Mungkin masih banyak sekali kekurangannya, maka saya tidak akan bosan untuk meminta kritik dan saran teman-teman reader semua.

#include <stdio.h>
#include <stdlib.h>
void addArray();
void cekArray();
void tampil();
void bubbleSort();
void exchangeSort();
void selectionSort();
void insertionSort();
void resetArray();
int A[100]={'nol'},jml,i,j,k,no,tampung,pos;
int sekunder[100];
void main()
{
    system("cls");
    resetArray();
    char key;
    printf("\n _______PROGRAM PENGURUTAN KODE POS_______\n"
           "\n 1. Masukan data"
           "\n 2. Bubble Sort"
           "\n 3. Exchange Sort"
           "\n 4. Selection Sort"
           "\n 5. Insertion Sort"
           "\n 6. Keluar"
           "\n Perintah : ");
    scanf("%c",&key); system("cls");
    if(key=='1'){addArray();}if(key=='2'){bubbleSort();}
    if(key=='3'){exchangeSort();}if(key=='4'){selectionSort();}
    if(key=='5'){insertionSort();}if(key=='6'){exit(1);}
    else {printf("\n Perintah salah.");getchar();getchar();main();}
}
void tampil(){
    for(k=0;k<jml;k++){printf("[%d] ",A[k]);}
}
void cekArray(){
    if(A[0]=='nol'){printf("\n Array kosong!");
    getchar();getchar();main();}
}
void addArray(){
    printf("\n ______MENAMBAHKAN DATA______\n"
           "\n Berapa data yang ingin diinput? ");
    scanf("%d",&jml);
    for(i=0;i<jml;i++){
        printf(" data ke-%d : ",i+1);
        scanf("%d",&A[i]);
        sekunder[i]=A[i];
    }
    printf("\n Data berhasil diinput : ");
    tampil();getchar();getchar();main();
}
void bubbleSort(){
    cekArray();
    printf("\n ______BUBBLE SORT METODE______\n"
           "\n Data sebelum disorting : "); tampil();
    for(i=1;i<jml;i++){
        printf("\n Proses ke-%d",i);
        for(j=1;j<jml;j++){
            if(A[j-1]>A[j]){
                printf("\n tukar %d <-> %d --->",A[j-1],A[j]);
                tampung=A[j-1];
                A[j-1]=A[j];
                A[j]=tampung;
                tampil();
            } } }
    printf("\n\n Data setelah disorting : ");
    tampil();getchar();getchar();main();
}
void exchangeSort(){
    cekArray();
    printf("\n ______EXCHANGE SORT METODE______\n"
           "\n Data sebelum disorting : ");
           tampil();no=0;
    for(i=jml-1;i>0;i--){
        no++;
        printf("\n\n Proses ke-%d",no);
        for(j=i-1;j>-1;j--){
            if(A[i]<A[j]){
                printf("\n tukar %d <-> %d --->",A[i],A[j]);
                tampung=A[i];
                A[i]=A[j];
                A[j]=tampung; tampil();
            } } }
    printf("\n\n Data setelah disorting : ");
    tampil();getchar();getchar();main();
}
void selectionSort(){
    cekArray();
    printf("\n ______SELECTION SORT METODE______\n"
           "\n Data sebelum disorting : ");
    tampil();no=0;
    for(i=0;i<jml-1;i++){
        pos=i;no++;
        printf("\n_______________________________________"
               "\n______________Proses %2d________________\n",no);
        for(j=0;j<jml;j++){printf("%5d ",j);}
        printf("\n");
        for(j=0;j<jml;j++){printf("%5d ",A[j]);}
        printf("\n\n Pembanding        Pos");
        for(j=i+1;j<jml;j++){
            if(A[pos]<A[j])
            printf("\n %d < %d            [%d]",A[pos],A[j],pos);
            if(A[pos]>A[j]){
            printf("\n %d > %d    <->     [%d]",A[pos],A[j],j);
            pos=j;}
        }
        if(pos!=i){
            printf("\n tukar data ke-%d [%d] dengan data ke-%d [%d]",i,A[i],pos,A[pos]);
            tampung=A[pos];
            A[pos]=A[i];
            A[i]=tampung;
        } }
    printf("\n\n Data setelah disorting : ");
    tampil();getchar();getchar();main();
}
void insertionSort(){
    cekArray();
    printf("\n ______INSERTION SORT METODE______\n"
           "\n Data sebelum disorting : ");
    tampil();
    for(i=1;i<jml;i++){
        tampung=A[i];
        printf("\n____________________________________"
               "\n_____________Proses %2d______________\n",i);
        for(j=0;j<jml;j++){printf("%5d ",j);}
        printf("\n");
        for(j=0;j<jml;j++){printf("%5d ",A[j]);}
        printf("\n yang ditampung : %d\n\n",tampung);
        j=i-1;
        for(k=1;k<=i;k++){
            if(A[k-1]>tampung){
            printf(" %d < %d     Geser data[%d]->data[%d]\n",tampung,A[k-1],j,j+1);
            j--;}
        }
        j=i-1;
        while(A[j]>tampung && j>=0){
            A[j+1]=A[j];
            j--;
        }
        A[j+1]=tampung;
        printf("\n Tempatkan %d pada index[%d]",tampung,j+1);
    }
    printf("\n\n Data setelah disorting : ");
    tampil();getchar();getchar();main();
}
void resetArray(){
    for(i=0;i<jml;i++){
        A[i]=sekunder[i];
    }
}

Kalo ada yang salah beritahu saya ya :)