2015-04-06 86 views
0

所以我寫了一個雙向循環鏈表(無序)的代碼,在C中,我遇到了一個問題。我有用於打印出的元素(從頭部起)此代碼:如何打印出雙向循環鏈表?

void ShowListFromHead(List& l){ 
    if(l.head==l.tail){ 
     printf("%d", l.head->value); 
     return; 
    } 
    Element* p; 
    p=l.head; 
    while(p->next!= l.head){ 
     printf("%d,", p->value); 
     p=p->next;} 
} 

它工作正常除了尾巴,由於while循環工作,直到它到達尾部(直到對 - >下是頭部)。所以,這是我的問題:有沒有辦法顯示整個列表而不排除任何元素?然而,似乎我制定了循環,總是有一個元素被遺漏。使用do/while循環也不起作用。我試着在最後一個元素的循環之後添加一個printf,但它會弄亂代碼中其他函數的功能。我試圖解決這個問題幾天,仍然不知道如何,所以任何幫助,高度讚賞!

編輯我加了deleteHead函數,看來也許問題不是完全在show函數中。

bool deleteHead(List& l, int &oldHead){ 
     if(l.head!=NULL){ 
      oldHead= l.head->value; 
      Element *p=l.head; 
      if(l.head->next!=NULL){ 
       l.head=l.head->next; 
       l.head->prev=l.tail; 
       l.tail->next=l.head; 
       delete p; 
       return true; 
      }} 
     else if(l.head==NULL){ 
      return false; 
    } 
} 
+0

如何打印尾值混亂的其他功能?打印聲明不應更改列表的內容。 – mstbaum

+0

此代碼不是c代碼,它是C++。在c中沒有引用。 –

+0

@iharob抱歉,感謝編輯:) – Jake

回答

1

修改原始代碼:

void ShowListFromHead(List& l){ 
    if(l.head == 0) 
     return; 
    Element* p = l.head; 
    do{ 
     printf("%d,", p->value); 
     p=p->next; 
    }while (p != l.head); 
} 

void ShowListFromHead(List& l){ 
    if(l.head == 0) 
     return; 
    Element* p = l.head; 
    do{ 
     std::cout << p->value << ", " ; 
     p=p->next; 
    }while (p != l.head); 
} 
1

你有使用print語句的問題後,你的循環是因爲你刪除代碼的原因:

bool deleteHead(List& l, int &oldHead){ 
    if(l.head!=NULL){ 
     oldHead= l.head->value; 
     Element *p=l.head; 
     if(l.head->next!=NULL){ 
      l.head=l.head->next; 
      l.head->prev=l.tail; 
      l.tail->next=l.head; 
     } // this is where you should close your if statement 
      delete p; 
      return true; 
     //} you don't account for the case where there is one element left 
    } 
    else if(l.head==NULL){ 
     return false; 
    } 
} 

然後你c應該添加打印語句以在循環之後打印尾部。或者你可以實現@rcgldr的解決方案。我喜歡這一個:

void ShowListFromHead(List& l){ 
    if(l.head == 0) 
     return; 
    Element* p = l.head; 
    do{ 
     printf("%d,", p->value); 
     p=p->next; 
    }while (p != l.head); 
} 
+0

非常感謝你,我改變了這種方式,我想我知道了,事情是,我想它會刪除它,但它會打印出一些隨機值而不是顯示空行。從最後一個刪除的值開始,然後像1398975那樣編號。你知道它爲什麼會發生嗎?我很抱歉有很多問題,但我真的很想完成它:) – Jake

+0

雖然等待,爲什麼我必須關閉if語句?這是一個循環列表,所以尾部在技術上絕不會爲空... – Jake

+0

打印隨機值的原因是因爲當列表爲空時,您仍嘗試打印指向隨機數據的頭。你必須關閉if語句的原因,我說的是你仍然刪除列表中的最後一個元素。當你到最後一個元素時,head-> next將是null,並且tail將指向與head相同的東西,所以當你刪除它時,tail將爲null。合理? – mstbaum