Bağlantılı listeyi ana işlevdeki başa göre arama yapabilmek için işaretçiyi nasıl geçeceğimi düşünüyorum. Bir polinom için bir katsayı ve bir üssü ihtiva eden bir yapı olması amaçlanmıştır. AllocateTerm işlevinde, oluşturmak üzere olan terimin polinomda zaten ortak bir terime sahip olup olmadığını aramak ve görmek için çift göstericiyi başka bir işleve aktarmaya çalışıyorum. Kod aşağıdaki gibidir:Bir başka işleve çift işaretçi geçirme
typedef struct PolyTerm{
int iCoeff;
int iExp;
struct PolyTerm *pNext;
}PolyTerm;
PolyTerm *allocateTerm(int iCoeff, int iExp, PolyTerm **ppHead, PolyTerm *pCurr);
PolyTerm *findTerm(int iCoeff, int iExp, PolyTerm ***ppHead);
void main(int argc, char *argv[])
{
PolyTerm *pPolyAHead = NULL;
PolyTerm *pCurr = NULL;
allocateTerm(2,3,&pPolyAHead, pCurr);
pCurr = allocateTerm(3,4,&pPolyAHead, pCurr);
pCurr = allocateTerm(4,5,&pPolyAHead, pCurr);
pCurr = allocateTerm(5,6,&pPolyAHead, pCurr);
printf("%p\n", pPolyAHead);
for(pCurr = pPolyAHead; pCurr != NULL; pCurr=pCurr->pNext)
printf("coeff: %d exp: %d address: %p\n", pCurr->iCoeff, pCurr->iExp, pCurr);
PolyTerm *pPolyBHead = NULL;
allocateTerm(7,8,&pPolyBHead, pCurr);
pCurr = allocateTerm(9,10,&pPolyBHead, pCurr);
pCurr = allocateTerm(11,12,&pPolyBHead, pCurr);
pCurr = allocateTerm(13,14,&pPolyBHead, pCurr);
for(pCurr = pPolyBHead; pCurr != NULL; pCurr=pCurr->pNext)
printf("coeff: %d exp: %d address: %p\n", pCurr->iCoeff, pCurr->iExp, pCurr);
}
PolyTerm *allocateTerm(int iCoeff, int iExp, PolyTerm **ppHead, PolyTerm *pCurr)
{
PolyTerm *pFind = NULL;
if(*ppHead == NULL)
{
*ppHead = (PolyTerm *)malloc(sizeof(PolyTerm));
if(*ppHead == NULL)
{
printf("Memory allocation error with ppHead\n");
}
(*ppHead)->iCoeff = iCoeff;
(*ppHead)->iExp = iExp;
(*ppHead)->pNext = NULL;
}
else
{
// Search to see if that exponent already exists
printf("%p\n", *ppHead);
pFind = findTerm(iCoeff, iExp, /*????? (some form of **pHead)*/);
if(pFind == NULL)
{
PolyTerm *pNew = NULL;
pNew = (PolyTerm *)malloc(sizeof(PolyTerm));
if(pNew == NULL)
printf("Memory allocation error with pNew\n");
if((*ppHead)->pNext == NULL)
{
(*ppHead)->pNext = pNew;
}
else
{
pCurr->pNext = pNew;
}
pNew->iCoeff = iCoeff;
pNew->iExp = iExp;
pNew->pNext = NULL;
}
else
{
pFind->iCoeff += iCoeff;
}
}
}
PolyTerm *findTerm(int iCoeff, int iExp, PolyTerm ?????/*????? (some form of **pHead)*/)
{
//printf("%p", &head);
/*
PolyTerm *pFind = NULL;
for(pFind = (*ppHead); pFind != NULL; pFind = (*ppHead)->pNext)
{
if(pFind->iExp == iExp)
return pFind;
}
return NULL;*/
}
böylece tekrar kontrol etmek istediğiniz PolyTerm' zaten doğru 'findTerm' işlevini kullanarak' pPolyAHead' listesinde var 'a? – JanLeeYu
Evet. Ben sadece 3x^2 ve diğeri 2x^2 olan bir terim söylemek istemiyorum. Ama eşdeğer bir üssü kontrol etmek için ** ppHead'in arama fonksiyonuna nasıl geçeceğini anlayamıyorum. –
İlgili, "pCurr" ile "allocateTerm" öğesinin gerçekleşmesi gereken olası duygular nelerdir? – WhozCraig