C programming

Salam C də belə 1 problemim var yenə bəzi şeyləri örgənmək üçün etdiyim koddu ona görə dəxilsiz ola bilər [code]#include <stdlib.h> struct entry{ int value; struct entry * next; }; void removeEntry(struct entry head,struct entry * removeEntry){ struct entry * previous; findPrevious(head,removeEntry); previous->next = previous->next->next; } struct entry * findPrevious(struct entry head, struct entry * entry) int main(){ void insertEntry(struct entry * newEntry, struct entry * previous); void removeEntry(struct entry head, struct entry * removeEntry); void printList(struct entry head); struct entry * findPrevious(struct entry head, struct entry * entry); struct entry n, n1, n2, n3, n4, n2_5; n2_5.value = 500; n.next = &n1; n1.value = 100; n1.next = &n2; n2.value = 200; n2.next = &n3; n3.value = 200; n3.next = &n4; n4.value = 400; n4.next = (struct entry *)0; removeEntry(n,&n2); // printf("%p\n",findPrevious(n,&n3)); //printf("%p\n",&n1); // printf("%p\n",&n2); printList(n); printf("------------------\n"); printList(n); return 0; }[/code] findPrevious kodunu tam kopyalamadım bu kodda findPrevious metodunu remove metodunda çağıranda conflict ing types for deyə xəta alıram value səhf pass etdiyim üçündü bilirəm amma necə pass edəcəm onu bilmirəm

Verilmiş cavablar və yazılan şərhlər (6 cavab var)

ahmed (2016-12-15 15:24:39)
findPrevious funksiyası removeEntry funksiyasından əvvəl tərtib olunmalıdı, yada elanı yerləşdirilməlidi. düzgün variant belədi: [code] struct entry * findPrevious(struct entry head, struct entry * entry){ struct entry * listPtr = head.next; struct entry * previous = (struct entry *)0; while(listPtr != (struct entry *)0){ if(listPtr == entry) return previous; else previous = listPtr; listPtr = listPtr-&gt;next; } return previous; } void removeEntry(struct entry head,struct entry * removeEntry){ struct entry * previous; findPrevious(head,removeEntry); previous-&gt;next = previous-&gt;next-&gt;next; } [/code] ya da bu şəkildə: [code] struct entry * findPrevious(struct entry head, struct entry * entry); void removeEntry(struct entry head,struct entry * removeEntry){ struct entry * previous; findPrevious(head,removeEntry); previous-&gt;next = previous-&gt;next-&gt;next; } struct entry * findPrevious(struct entry head, struct entry * entry){ struct entry * listPtr = head.next; struct entry * previous = (struct entry *)0; while(listPtr != (struct entry *)0){ if(listPtr == entry) return previous; else previous = listPtr; listPtr = listPtr-&gt;next; } return previous; } [/code] C tələb edir ki, hər bir müraciət olunan funksiya və ya dəyişən müraciət nöqtəsindən əvvəl elan olunsun.

Mövla (2016-12-15 13:48:39)
[code]#include struct entry{ int value; struct entry * next; }; void insertEntry(struct entry * newEntry, struct entry * previous){ newEntry->next = previous->next; previous->next = newEntry; } void removeEntry(struct entry head,struct entry * removeEntry){ struct entry * previous; //findPrevious(head,removeEntry); previous->next = previous->next->next; } struct entry * findPrevious(struct entry head, struct entry * entry){ struct entry * listPtr = head.next; struct entry * previous = (struct entry *)0; while(listPtr != (struct entry *)0){ if(listPtr == entry) return previous; else previous = listPtr; listPtr = listPtr->next; } return previous; } void printList(struct entry head){ struct entry * listPtr = head.next; while(listPtr != (struct entry *)0){ printf("%i\n",listPtr->value); listPtr = listPtr -> next; } } int main(){ void insertEntry(struct entry * newEntry, struct entry * previous); void removeEntry(struct entry head, struct entry * removeEntry); void printList(struct entry head); struct entry * findPrevious(struct entry head, struct entry * entry); struct entry n, n1, n2, n3, n4, n2_5; n2_5.value = 500; n.next = &n1; n1.value = 100; n1.next = &n2; n2.value = 200; n2.next = &n3; n3.value = 200; n3.next = &n4; n4.value = 400; n4.next = (struct entry *)0; //removeEntry(n,&n2); // printf("%p\n",findPrevious(n,&n3)); //printf("%p\n",&n1); // printf("%p\n",&n2); printList(n); printf("------------------\n"); printList(n); return 0; } [/code] cox sagolun cavabiniz ucun tam olarag kod budu )) kitab kochan programming in C

ahmed (2016-12-15 09:36:41)
Hansı kitabı oxuyursan? pointeri -NULL -a mənimsədirsənsə elə ancaq NULL -dan da istifadə etmək lazımdır. Nə 0, nə də onun struct entry * -yə casti. Əslində proqramlaşdırmada qeyri anlaşılan, mücərrəd heçnə yoxdu. Proqramlaşdırmada gördüyünüz hər şeyin arxasında ədədlər dayanır, birmənalı olaraq. bildiyimiz adi tam ədədlər. Sadəcə kompilyator bəzi məqamları özü üçün dəqiqləşdirməkdən ötrü müxtəlif tələblər qoyur. Misal üçün malloc ilə yer ayıranda malloc-dan əvvəl cast etmək lazımdır ki, kompilyator alignment -i, v.s. məsələlərində səhv eləməsin. Bu da optimallıq, təhlükəsizlik üçündür. Belə NULL elə 0 deməkdir, (void *)0 kimi təyin olunub. 0-dan əvvəl cast olunan (void *) kompilyatoru razı salmaq üçündür. Siz proqram mətnin tam daxil eləmirsiniz. Mətni tam daxil eləmək lazımdır. Səhv başqa yerdə ola bilər. Burda biraz haşiyə çıxmaq istəyirəm. Kompilyatorlar səhvləri təyin etmək də elə də inkişaf etməyiblər. Ən məşhur kompilyatorlar belə səhvlərin yerin və səbəbin təyin etməkdə çətinlik çəkirlər. Səhvləri müəyyən etmək üçün istifadə olunan ən məşhur panic mode , phrase - level , error productions , global correction error recovery v.s. algoritmlərin heç biri tam şəkildə realizə olunmayıb və tərtibatçının öhdəsinə buraxılıb. Hal-hazırda biz də Əsrin dilinin səhvləri tanınması sisteminin təkmilləşdirilməsi üzəridə çalışmalarımızı davam etdiririrk, daha doğrusu biz də səhvləri tapmaqda biraz çətinlik çəkirik. Sadəcə düz məsələnin üstünə gəldiyimizə görə biraz məlumat verdim.

Mövla (2016-12-14 22:17:29)
Day keçib 1 sualda verim oxuduğum kitabda #define NULL 0 yazıb linked listdeki listPtrn ı listPtr = NULL kimi yazmaq olar deyir yəni listPtr = 0 etməyə bərabər deyilmi bu ? onda adi vəziyyətdə niyə (struct entry *) 0 isdifadə edirik ümumiyyətlə (struct entry *) 0 tam izah olunmmur kitabda nə mənaya gəlir tam olarag ? 0 ı struct entry ye cast edirik ?

Mövla (2016-12-14 19:24:41)
Code Blocks isdifadə edirəm[code]struct entry * findPrevious(struct entry head, struct entry * entry){ struct entry * listPtr = head.next; struct entry * previous = (struct entry *)0; while(listPtr != (struct entry *)0){ if(listPtr == entry) return previous; else previous = listPtr; listPtr = listPtr->next; } return previous; }[/code] buda findPrevious funksiyyası

ahmed (2016-12-14 08:34:18)
Imkan varsa progamən tam mətnin daxil edərdiniz. hansı kompilyatorla kompilyasiya edirsiniz? Belə tiplərdə konflikt yoxdur.