BİLİŞİM - BİLGİSAYAR - EĞİTİM
  Dinamik Veri Yapıları
 

13- DİNAMİK VERİ YAPILARI :

 

Self-referential structure : üye, tanımlı olduğu yapıya bir işaretçi

struct yapi {

char adi[21];

struct yapi *ptr;

};

 

Sıralı Bağlı Liste :

 

Örnek : Sıralı bağlı listenin gerçekleştirilmesi.

 

#include <stdlib.h>

#include <string.h>

struct listyapi {

char adi[21];

struct listyapi *sonraki;

};

typedef struct listyapi listnode;

typedef listnode *listptr;

listptr headnode; /* Herzaman listenin baţýný gösterir */

void seeklist(char *searchthis, listptr *prevnode)

{

listptr c;

c = headnode;

*prevnode = c;

while ((c->sonraki != NULL)) {

c = c->sonraki;

if (strcmp(c->adi, searchthis) >= 0) break;

*prevnode = c;

}

}

void kayit(char *s)

/* prevnode kayıdı newnode kayıdını, newnode kayıdı prevnode'nin daha önce gösterdiği kayıdını gösterir. */

{

listptr newnode, prevnode;

newnode = malloc(sizeof(listnode)); /* yeni kayıda yer a‡ */

strcpy(newnode->adi, s); /*bilgiyi yeni kayıda yaz */

seeklist(newnode->adi, &prevnode); /* listedeki yerini bul */

newnode->sonraki = prevnode->sonraki; /* listeye ekle */

prevnode->sonraki = newnode;

}

void iptal(char *s)

/* newnode kayıdı silinir. prevnode kayıdı newnode kayıdının gösterdiği kayıdını gösterir. */

{

listptr newnode, prevnode;

seeklist(s, &prevnode);

newnode = prevnode->sonraki;

prevnode->sonraki = newnode->sonraki;

free(newnode);

}

void listlist(void)

{

listptr currentnode;

currentnode = headnode;

if (currentnode != NULL) currentnode = currentnode->sonraki;

while (currentnode != NULL)

{

printf("%s ",currentnode->adi);

currentnode = currentnode->sonraki;

}

printf("n");

} /* Procedure listlist; */

main()

{

char sec;

char *s;

headnode = malloc(sizeof(*headnode));

strcpy(headnode->adi," listenin baţý");

headnode->sonraki = NULL;

do {

clrscr();

printf("Boş yer : %ldnn",coreleft());

listlist();

printf("nn1 - Girişn2 - iptaln3 - SonnnSeç n");

sec = getch();

switch (sec) {

case '1':

printf("Adı "); gets(s);

kayit(s);

break;

case '2': printf("Adı n"); gets(s);

iptal(s);

break;

case '3': exit(0);break;

}

} while (1);

}

 

Problem : Polinomlar sıralı bağlı listede saklı. İki polinomun toplamını üçücnü polinomda oluşturan program

 

Stack (yığın) : Son giren ilk çıkar (LIFO)

 

(Fonksiyon çağırıldığında geri dönüş adresi, Fonksiyona gönderilecek parametreler )

 

Örnek : Stack kullanarak girilen cümleyi kelimeleri bozmadan tersten yazdır

 

#include <stdio.h>

#include <stdlib.h>

struct stackyapi {

char deger[50];

struct stackyapi *sonraki;

};

typedef struct stackyapi stacknode;

typedef stacknode *stackptr;

stackptr top;

void push(char *gelen)

{

stackptr newnode;

newnode = malloc(sizeof(stacknode));

strcpy(newnode->deger, gelen);

newnode->sonraki = top;

top = newnode;

}

int pop(char *giden)

{

stackptr oldnode;

if (top != NULL) {

oldnode = top;

strcpy(giden, top->deger);

top = top->sonraki;

free(oldnode);

return 0;

}

else

return 1; /* yığın boş */

}

main()

{

char *kelime, *cumle;

stackptr current;

top = NULL;

clrscr();

printf("Cumleyi girin : "); gets(cumle);

kelime = strtok(cumle, " ");

while (kelime) {

push (kelime);

kelime = strtok(NULL, " ");

}

kelime = (char *) malloc(20); /* kelime NULL idi, yer açalım*/

while (!pop(kelime))

printf("%s ", kelime);

printf("n");

getch();

}

Problem :

infix : operand operator operand 2 + 7

postfix : operand operand operator 2 7 +

Soldan sağa işlem yapılır. Öncelik (parantez) yok.

postfix biçimindeki ifadeyi hesaplama ?

infix à postfix dönüşümü ?

 

Kuyruk (queue) ilk giren ilk çıkar (FIFO):

Bilgisayarda çoklu işlem

Yazıcıyı ortak kullanım

 
Ağaç (tree) Doğrusal olmayan yapı:

İkili ağaç (kök, çocuk, yaprak, derece)

 
MEMORY MODELLERİ:

Tiny : Code + data + stack aynı 64 K lık segment te

Small : Code için 64 K, data + stack ayrı 64 K lık segment

Medium : Code için far pointer ( yani 1 MB code) , data 64 K ( data kullanmayan uzun programlar)

Compact: Medium un tersi. ( çok data kullanan kısa programlar)

Large : Code için 1 MB, data için 1 MB

Huge : Large ile aynı fakat static data 64 K dan fazla olabilir

 

ÖRNEKLER

 

Örnek 1: Paralel portun kullanımı

 

/* PC deki paralel porta erişim

 

oku          : paralel portu okur. Eski tip portlar çift yönlü olmadığı için

                  durum uçları giriş amaçlı kullanıldı

                           ( 4-bit , bi-directiona, EPP, ECP )

yaz          : paralel port data uçlarına bilgi gönderir

oku_yaz   : durum uçlarından okuduğunu veri uçlarına gönderir

 

*/

#include <stdio.h>

#include <dos.h>

#include <conio.h>

typedef unsigned word;

void binary_yaz(word);

void oku(void);

void yaz(void);

void oku_yaz(void);

word pdata=0x378;

word pstat=0x379;

word bout, bin;

char c;

main()

{

  do {

     clrscr();

     printf("1 - Okun");

     printf("2 - Yazn");

     printf("3 - Okuduğunu Yazn");

     printf("4 - Çıkn");

     c = getch();

     switch(c) {

         case '1' : oku(); break;

         case '2' : yaz(); break;

         case '3' : oku_yaz(); break;

         case '4' : exit(0);

     }

  } while (1);

}

void yaz(void)

{

  clrscr();

  printf("Gönderilecek veri :");

  scanf("%d", &bout);

  binary_yaz(bout); printf("n");

  outport(pdata, bout);

  c = getch();

}

void oku(void)

{

 clrscr();

  do {

     bin = inportb(pstat);

     binary_yaz(bin);

     printf("   %dn", bin);

     c = getch();

  } while (c != 'q');

}

void oku_yaz(void)

{

  clrscr();

  do {

     bin = inportb(pstat);

     gotoxy(1,8) ; printf("Okunan  = ");

     binary_yaz(bin);

     outport(pdata, bin);

     gotoxy(1,9) ; printf("Yazılan = ");

     binary_yaz(bin);

     printf("   %dn", bin);

     c = getch();

  } while (c != 'q');

}

void binary_yaz(word x)

{

  word i;

  word m;

  m = 0x8000;

  for (i = 0; i<16; i++) {

      if (x & m)

         printf("1");

      else

         printf("0");

      m = m >> 1;

  }

  printf(" ");

}

 

Örnek 2. Kesme (interrupt) kullanımı

 

Intel 8086 Registers

General Purpose Registers

 

AH/AL  AX  (EAX)  Accumulator  

BH/BL  BX  (EBX)  Base               

CH/CL  CX  (ECX)  Counter          

DH/DL  DX  (EDX)  Data              

(Exx) 386+ 32 bit register 

 Segment Registers

CS     Code Segment

DS     Data Segment

SS     Stack Segment

ES     Extra Segment

(FS)    386 and newer

(GS)    386 and newer

 

Pointer Registers                       Stack Registers

SI (ESI)  Source Index                  SP (ESP)  Stack Pointer

DI (EDI)  Destination Index          BP (EBP)  Base Pointer

IP        Instruction Pointer

 

FLAGS - Intel 8086 Family Flags Register

 

0              CF Carry Flag

1              1

2              PF Parity Flag

3              0

4              AF Auxiliary Flag

5              0

6              ZF Zero Flag

7              SF Sign Flag

8              TF Trap Flag  (Single Step)

9              IF Interrupt Flag

A            DF Direction Flag

B             OF Overflow flag

C,D         IOPL I/O Privilege Level  (286+ only)

E             NT Nested Task Flag  (286+ only)

F             0

10            RF Resume Flag (386+ only)

11            VM  Virtual Mode Flag (386+ only)

 

#include <dos.h>

#include <stdio.h>

main()

 {

    union REGS a;

clrscr();

    a.h.ah = 0x2A;       /* Dos servislerinden 2Ah = get system date */

    int86(0x21,&a,&a); /* int 21h dos servisleri */

    printf("makinanin tarihi = %d/%d/%dn", a.h.dl, a.h.dh, a.x.cx);

    a.h.ah = 0x36;       /* Diskteki bos alan */

    a.h.dh = 0;          /* bulunulan, A=1 */

    int86(0x21,&a,&a);

    printf("makinanadaki yer = %ldn", (long)a.x.ax*a.x.bx*a.x.cx);

    getch();

}

 
 
  Bugün 128 ziyaretçi (196 klik) www.bilisim-egitim.tr.gg  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol