2014-03-06 227 views
0

這是一項家庭作業,我已經編寫了大部分代碼,唯一無法弄清楚的是我必須有一個遞歸函數來排序鏈接列表按升序排列,遞歸函數按降序排列鏈接列表。我很迷茫。鏈接列表的遞歸遞增和遞歸降序功能

這是我的整個代碼。

using namespace std; 

struct ListNode; 
typedef ListNode* ListPtr; 

struct ListNode 
{ 
    int number; 
    ListPtr next; 

    ListNode(int value, ListPtr ptr = NULL) 
    { 
     number = value; 
     next = ptr; 
    } 
}; 

char Menu(); 
void Add(ListPtr &, int); 
void Delete(ListPtr &, int); 
void Ascend(ListPtr &); 
void Descend(ListPtr &); 
void Print(ListPtr &); 
void DeleteList(ListPtr &); 

int main() 
{ 
    ListPtr head = NULL; 
    char answer; 
    int input; 

    answer = Menu(); 
    while(answer != 'Q') 
    { 
     if(answer == 'A') 
     { 
      cout << "Please enter in an integer: "; 
      cin >> input; 
      Add(head, input); 
     } 
     else if(answer == 'D') 
     { 
      cin >> input; 
      Delete(head, input); 
     } 
     else if(answer == 'P') 
     { 
      Ascend(head); 
     } 
     else if(answer == 'O') 
     { 
      Descend(head); 
     } 
     else if(answer == 'N') 
     { 
      Print(head); 
     } 
     else 
     { 
      cout << "Incorrect input, please try again.\n"; 
     } 

     answer = Menu(); 
    } 

    DeleteList(head); 
    return 0; 
} 

char Menu() 
{ 
    char uinput; 

    cout << "Please enter in one of the following:\n"; 
    cout << "A: Add an item to the end of the list.\n"; 
    cout << "D: Delete an item from the list.\n"; 
    cout << "P: Print the list in ascending order.\n"; 
    cout << "O: Print the list in descending order.\n"; 
    cout << "N: Display the number of items in the list.\n"; 
    cout << "Q: Quit.\n"; 

    return toupper(uinput); 
} 

void Add(ListPtr &start, int item) 
{ 
    if(start->number > item || start == NULL) 
     start = new ListNode(item, start); 
    else 
     Add(start->next, item); 
} 

void Delete(ListPtr &start, int item) 
{ 
    if(start != NULL) 
    { 
     if(start->number == item) 
      ListPtr cur = start; 
     start = start->next; 
     delete cur; 
    } 
    else 
    { 
     Delete(start->next, item); 
    } 
} 

void Ascend(ListPtr &start) 
{ 

} 

void Descend(ListPtr &start) 
{ 

} 

void Print(ListPtr &start) 
{ 
    ListPtr cur = start; 
    int count = 0; 

    if(cur == NULL) 
    { 
     cout << "The list is empty.\n"; 
    } 
    else 
    { 
     if(cur != NULL) 
     { 
      if(count % 10 == 0) 
       cout << endl; 
      cout << setw(5) << cur->number; 
      cur = cur->next; 
      count++; 
     } 
    } 
    cout << endl; 
} 


void DeleteList(ListPtr &start) 
{ 
    if(start != NULL) 
    { 
     DeleteList(start->next); 
     cout << "Deleting item " << start->number << endl; 
     delete start; 
    } 
} 
+1

歡迎來到SO!特別是有這麼多的代碼,格式化它一貫將幫助人們閱讀它來幫助你。此外,一定要解釋什麼是不工作,你試過什麼等。 – J0e3gan

+0

你的問題到底是什麼?函數的邏輯?您是否熟悉遞歸函數以及如何編寫一個? –

+0

Sup的傢伙,抱歉,我很新,如何寫出來,我在一個C++編程2類,編程1和2都是入門級。問題是我不知道如何編寫這兩個部分,升序函數應該將列表中的數字按升序打印出來,而降序函數按降序排列。我只允許使用一個循環(我的菜單功能),所以這兩個函數必須遞歸。我們已經完成了一些遞歸任務,因此我在基本層面上理解了它們,但是我們只是開始鏈接列表,所以將它與遞歸結合起來會讓人困惑。 – Sayynt

回答

0

對於遞歸部分,一種方法是將列表遞歸劃分成兩個列表,左和右,直到列表大小減小到1(或零),在該情況下,遞歸函數只是返回列表,否則它會在遞歸函數中跟隨代碼合併返回的左列表和右列表,並返回合併列表。

您是否學過如何將鏈表分成兩個列表?通常這是使用兩個指針完成的。我不確定你已經教過什麼,以及你應該弄清楚什麼。這是什麼水平的編程課?

+0

這是一個編程2與C++類,入門級。我還沒有學會將鏈表分成兩部分。目的是爲了能夠從菜單中選擇一個選項,以升序或降序的順序打印列表(從我輸入的整數,如5,10和6)。 – Sayynt

+0

除頭指針外,還使用兩個指針,ptr2 = ptr1 = head,前進一個指針兩次(ptr2 = ptr2-> next-> next),另一次(ptr1 = ptr1-> next),直到ptr2達到該列表,在這種情況下,ptr1是列表的中點。在推進ptr2或ptr1時,您需要檢查...-> next和...-> next-> next的NULL。然後ptr2 = ptr1-> next,ptr1-> next = NULL。名單的前半部分從頭開始,第二個名單從第二部分開始。 – rcgldr

+0

你也可以在做這個時使用兩個計數器,當ptr2 = ptr2-> next-> next時,cnt2 + = 2,當ptr1 = ptr1-> next時,cnt1 + = 1。在ptr2到達列表末尾後,更正cnt2 = cnt2 - cnt1。然後通過傳遞指針和計數,代碼只需提前一個指針(count/2)次即可達到中點。 – rcgldr