Ми јавува многу грешки сеа кога сакам да компајлирам...
Ај види дали добро го правам ова? Вака ми е кодот на новата датотека.
Код:
#include "Linearno Povrzana Lista.h"
int identicni (nodep a, nodep b)
{
int brojac=0;
nodep p=a;
while(p!=NULL)
{
brojac++;
if(a->info!=b->info)
return brojac;
a=a->sleden;
b=b->sleden;
p=p->sleden;
}
return 0;
}
int main()
{
node *p1, *p2; /* pokazuvachi kon dvete listi i rezultantnata */
node *mk_link_list(); /* funkcija za kreiranje na lista */
int print_list(node *), free_link_list(node *); /* funkcii za pechatenje i brishenje na lista */
node *slej(node *, node *); /* funkcija za kreiranje nova lista od postoechkite dve */
int identicni (nodep a, nodep b);
printf("Vnesi gi elementite od prvata lista\n");
p1=mk_link_list();
printf("Vnesi gi elementite od vtorata lista\n");
p2=mk_link_list();
printf("Prva lista\n");
print_list(p1);
printf("Vtora lista\n");
print_list(p2);
if(identicni(p1, p2)==0)
printf("Listite se identicni\n");
else printf("Listite NE se identicni. Prvata razlicna pozicija e %d\n", identicni(p1, p2));
system("pause");
return (0);
}
PS: во датотеката Linearno Povrzana Lista.cpp го неам ставено header фајлот, т.е. немам направено #include "Linearno Povrzana Lista.h". Да не треба да го вметнам и овде?
Овде во кодов за поинтер коритиш nodep тип, а јас го сменав во pNode. Второво почесто се користи. И да треба да го вметниш и таму, во имплементацијата, и од таму да ја избришеш структурата оти ја има веќе еднаш во хедерот.
Е сега, во C/C++ има една работа, компајлрот не прави разлика меѓу хедерите и сорсот, тој само ги компајлира .c/.cpp и ништо друго. Е сега препорцесорот во компајлерот ако сретни include, содржината од датотеката посочена во #include ја додава на тоа место, и всушност компајлерот на крајот добива еден голем .cpp. (тој голем цпп можи и рачно да се изпиши) Пример:
Код:
typedef struct element
{
info_t info;
struct element *link;
} node, *pNode; //uste ovde mozi da se definira pointerot
node *mk_link_list();
void print_list (node *p);
void free_link_list(node *p);
node *mk_link_list()
{
....
....
}
void print_list (node *p)
{
....
....
}
Што е финтава со два пати внесување на името на функцијата. Првото (со само точказапирка на крајот) е декларација и значи, ова име постои, резевирај го и најди ја дефиницијата на функцијата некаде, во истиот или во друг фајл. Значи дури ти и немора да го додаваш stdio.h на почток, туку можи да си декларираш printf(const char*, ...); и кодот ќе ти работи.
Финтава со функции можи да се примени и со променливи, се прави со пишување на зборот extern, Пример extern int najdiMeNadvor; Истото важи, променливата треба да е дефинирана (да зафаќа место во меморија) во истиот фајл подолу или во друг, само: int najdiMeNadvor;
Тоа extern дури можи и да се напиши пред декларацијата на функцијата, но нема потреба, екплицитно компајлерот го пишува ако не го ставиш и никој не го става во декларациите.
Значи декларации се пишуваат со extern и значат постојам негде, најди ме, најди ми ја дефиницијата каде има код. Кај декларации на функции за заштеда на време направиле да немора да се пишува extern.
Хедерите служат за пишување декларации, .cpp за дефиниции.
Уште една работа за структурите. Тие (најчесто) се декларираат (не е дефинирање оти нигде не зафаќа меморија ако само испишиш структура) во самите хедери затоа што функциите подолу декларирани во хедерот ја користат структурата.