Çözüldü C linked list hatalı kod örneği

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

soon

Hectopat
Katılım
16 Şubat 2021
Mesajlar
542
Çözümler
2
Merhabalar,
Linked list konusunun daha başındayım, öğrendiğim kadarı ile bir şeyler yapmaya çalıştım fakat tam kavrayamadım sanırım, atacağım kod parçasındaki hatalarımı belirtir misiniz? Bu arada şunu belirteyim kod ile uğraştım hatalarımı bulmaya çalıştım ama bulamadım direkt atmıyorum yani buraya, uğraşmadan yardım istiyorum gibi bir düşünce oluşmasın lütfen, teşekkür ederim.

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

struct n {
 int x;
 struct n *next;
};
typedef struct n node;

void listeolustur(node *l){
 int i=0;
 for(;i<5;i++){
 l=(node*)malloc(sizeof(node));
 l=l->next;
 }
 l->next=NULL;
}

void doldur(node *d ){
 int i=1;
 for(;d->next!=NULL;i++){
 d->x=i*10;
 d=d->next;
 }
}

void bastir(node *b){
 while(b->next){
 printf("%d\n",b->x);
 b=b->next;
 }
}

int main() {
node *root,*iter;
root=(node*)malloc(sizeof(node));
root->x=1;
root->next=NULL;
iter=root->next;

listeolustur(iter);
doldur(root);
bastir(root);
}
 
Çözüm
L harfini tek başına kullanma. 1980'lerde yaşamıyoruz. Döngüleri öyle yapma. Malloc ile aldığın yerleri bırak. Fonksiyonlarında yolladığın şeyler yok oluyor. Yedek almalısın. Iter diye yedek almak bana saçma geldi.

Root'un next'ini NULL yapıp, onu iter'e atayıp sonra onu doldurmayı nasıl düşünüyorsunuz?

Yöntem olarak kötü bir kod. Linked list için ekleme ve çıkarma fonksiyonun olmalı. Sonra topluca doldurmak istiyorsan ayrı bir fonksiyon yazıp onun içinde eklemeyi veya çıkarmayı çağırmalısın.

Şu an hatasız çalışıyor gibi.

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

#define N   5
#define M   10

typedef struct node {
    struct node* next;  /* 8 byte */
    int x;              /* 4 byte */
} Node;

void listeOlustur(Node* n) {
    Node* temp = n;
    Node* temp2 = NULL;

    for (int i = 0; i < N; ++i) {
        temp2 = (struct node*)(malloc(sizeof(struct node)));

        if (NULL == temp2) {
            printf("malloc returns null\n");
            exit(1);
        }

        temp->next = temp2;
        temp = temp->next;
    }
}

void doldur(Node* n) {
    Node* temp = n;

    for (int i = 1; temp->next != NULL; ++i) {
        temp->x = M * i;
        temp = temp->next;
    }
}

void bastir(Node* n) {
    Node* temp = n;
    
    while (temp->next) {
        printf("%d\n", temp->x);
        temp = temp->next;
    }
}

void destroy(Node* n) {
    Node* temp = NULL;

    while (NULL != n) {
        temp = n;
        n = n->next;
        free(temp);
    }
}

int main() {
    Node* root = (Node*)malloc(sizeof(Node));
    root->x = 1;
    root->next = NULL;

    listeOlustur(root);
    doldur(root);
    bastir(root);
    destroy(root);

    return 0;
}
L harfini tek başına kullanma. 1980'lerde yaşamıyoruz. Döngüleri öyle yapma. Malloc ile aldığın yerleri bırak. Fonksiyonlarında yolladığın şeyler yok oluyor. Yedek almalısın. Iter diye yedek almak bana saçma geldi.

Root'un next'ini NULL yapıp, onu iter'e atayıp sonra onu doldurmayı nasıl düşünüyorsunuz?

Yöntem olarak kötü bir kod. Linked list için ekleme ve çıkarma fonksiyonun olmalı. Sonra topluca doldurmak istiyorsan ayrı bir fonksiyon yazıp onun içinde eklemeyi veya çıkarmayı çağırmalısın.

Şu an hatasız çalışıyor gibi.

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

#define N   5
#define M   10

typedef struct node {
    struct node* next;  /* 8 byte */
    int x;              /* 4 byte */
} Node;

void listeOlustur(Node* n) {
    Node* temp = n;
    Node* temp2 = NULL;

    for (int i = 0; i < N; ++i) {
        temp2 = (struct node*)(malloc(sizeof(struct node)));

        if (NULL == temp2) {
            printf("malloc returns null\n");
            exit(1);
        }

        temp->next = temp2;
        temp = temp->next;
    }
}

void doldur(Node* n) {
    Node* temp = n;

    for (int i = 1; temp->next != NULL; ++i) {
        temp->x = M * i;
        temp = temp->next;
    }
}

void bastir(Node* n) {
    Node* temp = n;
    
    while (temp->next) {
        printf("%d\n", temp->x);
        temp = temp->next;
    }
}

void destroy(Node* n) {
    Node* temp = NULL;

    while (NULL != n) {
        temp = n;
        n = n->next;
        free(temp);
    }
}

int main() {
    Node* root = (Node*)malloc(sizeof(Node));
    root->x = 1;
    root->next = NULL;

    listeOlustur(root);
    doldur(root);
    bastir(root);
    destroy(root);

    return 0;
}
 
Çözüm
L harfini tek başına kullanma. 1980'lerde yaşamıyoruz. Döngüleri öyle yapma. Malloc ile aldığın yerleri bırak. Fonksiyonlarında yolladığın şeyler yok oluyor. Yedek almalısın. Iter diye yedek almak bana saçma geldi.

Root'un Next'ini null yapıp, onu Iter'e atayıp sonra onu doldurmayı nasıl düşünüyorsunuz?

Yöntem olarak kötü bir kod. Linked list için ekleme ve çıkarma fonksiyonun olmalı. Sonra topluca doldurmak istiyorsan ayrı bir fonksiyon yazıp onun içinde eklemeyi veya çıkarmayı çağırmalısın.

Şu an hatasız çalışıyor gibi.

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

#define N 5
#define M 10.

typedef struct node {
 struct node* next; /* 8 byte */
 int x; /* 4 byte */
} Node;

void listeOlustur(Node* n) {
 Node* temp = n;
 Node* temp2 = NULL;

 for (int i = 0; i < N; ++i) {
 temp2 = (struct node*)(malloc(sizeof(struct node)));

 if (NULL == temp2) {
 printf("malloc returns null\n");
 exit(1);
 }

 temp->next = temp2;
 temp = temp->next;
 }
}

void doldur(Node* n) {
 Node* temp = n;

 for (int i = 1; temp->next != NULL; ++i) {
 temp->x = M * i;
 temp = temp->next;
 }
}

void bastir(Node* n) {
 Node* temp = n;

 while (temp->next) {
 printf("%d\n", temp->x);
 temp = temp->next;
 }
}

void destroy(Node* n) {
 Node* temp = NULL;

 while (NULL != n) {
 temp = n;
 n = n->next;
 free(temp);
 }
}

int main() {
 Node* root = (Node*)malloc(sizeof(Node));
 root->x = 1;
 root->next = NULL;

 listeOlustur(root);
 doldur(root);
 bastir(root);
 destroy(root);

 return 0;
}

Tavsiyeleriniz ve yardımınız için teşekkür ederim.
 
L harfini tek başına kullanma. 1980'lerde yaşamıyoruz. Döngüleri öyle yapma. Malloc ile aldığın yerleri bırak. Fonksiyonlarında yolladığın şeyler yok oluyor. Yedek almalısın. Iter diye yedek almak bana saçma geldi.

Root'un next'ini NULL yapıp, onu iter'e atayıp sonra onu doldurmayı nasıl düşünüyorsunuz?

Yöntem olarak kötü bir kod. Linked list için ekleme ve çıkarma fonksiyonun olmalı. Sonra topluca doldurmak istiyorsan ayrı bir fonksiyon yazıp onun içinde eklemeyi veya çıkarmayı çağırmalısın.

Şu an hatasız çalışıyor gibi.

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

#define N   5
#define M   10

typedef struct node {
    struct node* next;  /* 8 byte */
    int x;              /* 4 byte */
} Node;

void listeOlustur(Node* n) {
    Node* temp = n;
    Node* temp2 = NULL;

    for (int i = 0; i < N; ++i) {
        temp2 = (struct node*)(malloc(sizeof(struct node)));

        if (NULL == temp2) {
            printf("malloc returns null\n");
            exit(1);
        }

        temp->next = temp2;
        temp = temp->next;
    }
}

void doldur(Node* n) {
    Node* temp = n;

    for (int i = 1; temp->next != NULL; ++i) {
        temp->x = M * i;
        temp = temp->next;
    }
}

void bastir(Node* n) {
    Node* temp = n;
   
    while (temp->next) {
        printf("%d\n", temp->x);
        temp = temp->next;
    }
}

void destroy(Node* n) {
    Node* temp = NULL;

    while (NULL != n) {
        temp = n;
        n = n->next;
        free(temp);
    }
}

int main() {
    Node* root = (Node*)malloc(sizeof(Node));
    root->x = 1;
    root->next = NULL;

    listeOlustur(root);
    doldur(root);
    bastir(root);
    destroy(root);

    return 0;
}

Maalesef üniversitelerde çoğu derste hala değişkenler i, j, k, l gibi rezil durumda. Bu neyin çabası anlamıyorum hocalarımızı :(
 
Maalesef üniversitelerde çoğu derste hala değişkenler i, j, k, l gibi rezil durumda. Bu neyin çabası anlamıyorum hocalarımızı :(
Mantıklı bir açıklaması varsa ve benim n kullanmam gibi basit bir şeyse kullanılmasında sakınca görmüyorum. Ama l harfi kullanılan fonta göre 1 ile sıkça karışıyor.
Buradaki tek sorun o da değil. Harfin bir anlamını göremedim ben. Parametreler fonksiyon adının ilk harfi olmalı diye bir kural var galiba.
 

Yeni konular

Geri
Yukarı