2014-04-01 61 views
0

我面臨着一個關於動態分配結構的問題,一個鏈接鏈包含一個指向結構的指針更具體。動態分配和添加一個鏈接鏈內的結構

代碼鏈接的鏈:

typedef struct Queue Queue; 
struct Queue{ 
    Real* elmt; 
    Queue* next; 
    Queue* prev; 
}; 

所以,這個結構是圓形的,具有下一個指向下一

結構實的代碼(其表示):

typedef struct Real Real; 
struct Real{ 
    int* nb; //int array containing the number 
    size_t size; 
    int neg; /*0=positive 1=negative*/ 
    int com; /*-1 = no comma, otherwise integer indicating the position*/ 
}; 

所以,正如所解釋的,我希望動態地分配一個包含多個元素的隊列,所以我創建了這個函數:

Queue* mallocQueueElmt(const Real* arg){ 
    Queue* res=NULL; 

    res=mallocQueue(); 

    res->elmt=NULL; 
    res->elmt=mallocReal(arg->size); 

    memmove(res->elmt->nb, arg->nb, sizeof(int)*arg->size); 

    res->elmt->com=arg->com; 
    res->elmt->neg=arg->neg; 

    res->next=res; 
    res->prev=res; 

    return res; 
} 

mallocReal()只返回在含有一個指針一個真正的結構指向的指針(意味着構件的結構Realnb)在int數組(動態分配)的尺寸等於arg->size

該作品指向我用一個函數測試它:

void printQueue(Queue* arg){ 
    Queue* cur=NULL; 
    cur=arg->prev; 

    if(cur == arg->prev){; 
     printReal(cur->elmt); 
     printf(" "); 
    } 
    else  
     while(cur != arg){ 
      cur=cur->next; 
      if(cur->elmt){ 
       printReal(cur->elmt); 
       printf(" "); 
      }else{ 
       printf("no element "); 
      } 
     } 


} 

但是當我嘗試添加的元素,由於這項功能:

Queue* addElement(Queue* arg, const Real* arg1){ 
    Queue* res=NULL; 

    res=mallocQueue(); 

    res->elmt=NULL; 
    res->elmt=mallocReal(arg1->size); 

    memmove(res->elmt->nb, arg1->nb, sizeof(int)*arg1->size); 

    res->elmt->neg=arg1->neg; 
    res->elmt->com=arg1->com; 

    res->prev=arg->prev; 
    res->next=arg; 
    res->prev->next=res; 
    arg->prev=res; 

    res=arg; 

    return res; 
} 

和召回printQueue(),那麼只顯示第二個元素(因此添加了addElement())爲 ,並且沒有任何異常發生,一切似乎都運行良好。

預先感謝您的幫助

回答

1

你如果打印隊列語句總是隻在打印隊列的最後添加的項目。

嘗試這樣的事情,而不是:

void printQueue(Queue* arg){ 
    Queue* cur=arg; 

    do { 
     printReal(cur->elmt); 
     printf(" "); 

     cur=cur->next; 
    } while (cur != arg); 
}