簡體   English   中英

鏈表的遞歸升序和遞減降序函數

[英]Recursive Ascending and Recursive Descending Order Functions for a Linked List

這是一項家庭作業,我已經編寫了大部分代碼,我不知道的唯一事情是我必須具有一個遞歸函數來對鏈表進行升序排序,並需要一個遞歸函數來對鏈表進行排序。鏈表以降序排列。 我很迷路。

這是我的整個代碼。

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(或零)為止,在這種情況下,遞歸函數僅返回列表,否則在代碼中合並返回的左列表和右列表並返回合並列表的遞歸函數。

您是否了解了如何將鏈接列表分為兩個列表? 通常,這是使用兩個指針完成的。 我不確定您教過什么以及應該弄清楚什么。 這是什么級別的編程課?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM