2016-03-28 33 views
0

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;*/ 
} 
+0

böylece tekrar kontrol etmek istediğiniz PolyTerm' zaten doğru 'findTerm' işlevini kullanarak' pPolyAHead' listesinde var 'a? – JanLeeYu

+0

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. –

+0

İlgili, "pCurr" ile "allocateTerm" öğesinin gerçekleşmesi gereken olası duygular nelerdir? – WhozCraig

cevap

0

İşlevlerinize birkaç değişiklik yaptım ve tam olarak hangi orijinal sözdiziminin sağlam olduğundan emin değilim. Aşağıdaki kodun peşinde olduğunuza ulaştığına inanıyorum. Eksik bir şey varsa lütfen yorum bırakın.

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

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[]) 
{ 
    setbuf(stdout, NULL); 

    PolyTerm *pPolyAHead = NULL; 
    PolyTerm *pCurr = NULL; 

    pCurr = allocateTerm(2,3,&pPolyAHead, pCurr); 
    //printf("%d %d %p %p\n",pCurr->iCoeff,pCurr->iExp,pPolyAHead,pCurr->pNext); 
    pCurr = allocateTerm(3,4,&pPolyAHead, pCurr); 
    //printf("%d %d %p\n",pCurr->iCoeff,pCurr->iExp,pCurr->pNext); 
    pCurr = allocateTerm(4,5,&pPolyAHead, pCurr); 
    pCurr = allocateTerm(5,6,&pPolyAHead, pCurr); 

    //printf("main: %p\n", pPolyAHead); 

    for(pCurr = pPolyAHead; pCurr != NULL; pCurr=pCurr->pNext) 
     printf("coeff: %d exp: %d address: %p\n", pCurr->iCoeff, pCurr->iExp, pCurr); 

    //exit(1); 

    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) { 
     // Occurs only on first entry. 
     *ppHead = (PolyTerm *)malloc(sizeof(PolyTerm)); 
     if(*ppHead == NULL) 
      printf("Memory allocation error with ppHead\n"); 

     (*ppHead)->iCoeff = iCoeff; 
     (*ppHead)->iExp = iExp; 
     (*ppHead)->pNext = NULL; 
     return *ppHead; 
    } else { 
     // Search to see if that exponent already exists 
     //printf("allocate: %p\n", *ppHead); 
     pFind = findTerm(iCoeff, iExp, ppHead); 
     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 **ppHead) 
{ 
    //printf("find: %p\n", *ppHead); 

    PolyTerm *pFind; 
    for(pFind = *ppHead; pFind->pNext != NULL; pFind = pFind->pNext) { 
     //printf("find: iExp %d %d\n",pFind->iExp, iExp); 
     if(pFind->iExp == iExp) { 
      //printf("find: returned\n"); 
      return pFind; 
     } 
    } 
    //printf("find: not found\n"); 
    return NULL; 
} 

Çıktı:

coeff: 2 exp: 3 address: 001B1C28 
coeff: 3 exp: 4 address: 001B1C40 
coeff: 4 exp: 5 address: 001B1C58 
coeff: 5 exp: 6 address: 001B1C70 
coeff: 7 exp: 8 address: 001B1668 
coeff: 9 exp: 10 address: 001B1680 
coeff: 11 exp: 12 address: 001B1698 
coeff: 13 exp: 14 address: 001B16B0 
+0

FindTerm'i ilk kez çalıştırmaya gittiğimde hala bir segmentasyon hatasına rastlıyorum. Kodu burada olduğu gibi çalıştırabiliyor muydunuz? –

+0

Evet, çıkışı kodun altına gönderdim. – PZwan

0

Bu konuda gerçekten emin değilim ama sadece bunu deneyin.

PolyTerm *findTerm(int iCoeff, int iExp, PolyTerm **pHead) 
{ 
    //process here ... 
} 

sonra aynen böyle diyoruz: Hala erişebilir ve değerlerini karşılaştırabilirsiniz böylece

pFind = findTerm(iCoeff, iExp, ppHead); 

Yine mi pPolyAHead bir başvuru geçmek zorunda. Bu yardımcı olur umarım.

+0

Sadece denedim, hala bir segmentasyon hatası ile havaya uçuyor. Eminim, bir hataya neden olan ppHead'i geçerken bir sözdizimi hatası olduğundan eminim, çünkü eğer her şey yolunda gidiyorsa, arama hatalarını bulursam. –

İlgili konular