2012-10-11 77 views
0

我對循環鏈表有點問題:我想在最後插入一個元素(整數)。我的函數在最後添加元素,但我的鏈表不是真的是圓形的(我有這種印象)。 這是.H與結構使用:Circular LinkedList

struct liste_circulaire { 
    int val; 
    struct liste_circulaire *suivant; /* suivant = next element */ 
}; 

typedef結構liste_circulaire清單當然;

int main(void) { 
    liste *l, *deb; 
    deb = (liste *)malloc(sizeof(liste)); 
    l = deb; 
    l -> suivant = deb; /* suivant = next element */ 
    ajouter_element(l,0); 
    ajouter_element(l,1); 
    ajouter_element(l,2); 
    ajouter_element(l,3); 
    affiche(l,l->suivant); 
    printf("%d\n",l->suivant->suivant->suivant->suivant->suivant->val); 
    return 0; 
} 
void ajouter_element(liste *l,int x) { 
    liste *deb = l; /* with this line, I have a pointeur on the first element of my list */ 
    while(l->suivant != deb) {  
     l = l -> suivant; 
    } 
    l -> suivant = (liste *)malloc(sizeof(liste)); 
    l = l -> suivant; 
    l -> val = x; 
    l -> suivant = deb; 
} 

void affiche(liste *l,liste *deb) { 
    if(l == deb) { 
    printf(" Fin\n"); 
    return; 
    } 
    printf(" %d -->",deb->val); 
    affiche(l,deb->suivant); 
} 

在我的主,我有隨機數,當我問到打印我的名單,但在我的例子中的第一個元素,我的清單中0,所以如果有人能幫助我的第一個值(希望要清楚,我是法國學生)謝謝!

回答

2

您的程序打印一個隨機數,因爲這樣:

liste *l, *deb; 
deb = (liste *)malloc(sizeof(liste)); 
l = deb; 
l -> suivant = deb; 

在列表中的第一個元素,是您正確分配節點,但你不給任何號碼。你應該嘗試添加:

l -> val = 0; 

,擺脫的:

ajouter_element(l,0); 

這應該可以解決您的問題。

0

請注意,您從不設置第一個元素的值。 (埃爾南剛剛擊敗我在這裏...)

當你調用ajouter_element(),它不僅增加了列表的末尾的新元素,它設置列表的開頭是新元素:

l = l -> suivant;

affiche()先打印第二個元素,最後打印第一個元素。首先打印的是deb->val,主要是l->suivant->val


如果您想要affiche()打印第一項...打印它! :]

void affiche(liste *l,liste *deb) { 
    if (deb == 0) 
    { 
    deb = l; 
    } 

    printf(" %d -->",l->val); 

    if(l->suivant == deb) { 
    printf(" Fin\n"); 
    return; 
    } 

    affiche(l->suivant,deb); 
} 

調用此方法:

affiche(l,0); 

affiche(l,l); 

他們都會做同樣的事情。您也可以將其重載爲僅採用單個值。

我還沒有運行這個(甚至編譯),但希望它是相當接近。

+0

謝謝你你的答案,但我總是有問題的功能affiche(打印我的鏈表)。我明白第一個元素不是打印。爲了解決這個問題,我是否改變了調用函數的方式? – FiratAli

+0

Okeeeeey我放棄遞歸版本,我有一個迫切的版本,它的工作非常weel :)感謝您的幫助 – FiratAli

+0

謝謝!我明白爲什麼我的最後一個功能沒有奏效!我保留遞歸版本,最好使用命令式編程! – FiratAli

1

您可以使用預定義的頭文件list.h爲循環鏈表:

下面的鏈接中包含的如何做到這一點的example

list.h包含與像定義循環鏈表的管理的所有功能,加入了頭,添加在尾部,刪除的foreach功能瀏覽循環鏈表...