链接列表:在C ++中以物理和逻辑顺序显示列表

时间:2014-02-18 21:25:05

标签: c++

我试图弄清楚如何让我的链接列表以数字顺序显示数值变量。我知道我需要设置另一个空格,但是我很遗憾按数字顺序设置它。这是我的源代码:

#include <iostream>
struct node
{
    int number;
    node *next;
};
bool isEmpty(node *head);
char menu();
void insertAsFirstElement(node *&head, node *&last, int number);
void insert(node *&head, node *&last, int number);
void remove(node *&head, node *&last);
void showList(node *current);
void showLogic(node *current);

bool isEmpty(node *head)
{
    if (head == NULL)
        return true;
    else 
        return false;
}

char menu()
{
    char choice;
    cout << "Menu\n";
    cout << "1. Add an item.\n";
    cout << "2. Remove an item.\n";
    cout << "3. Show the list Physically.\n";
    cout << "4. Show the list Logically.\n";
    cout << "5. Exit.\n";

    cin >> choice;
    return choice;

}

void insertAsFirstElement(node *&head, node *&last, int number)
{
    node *temp = new node;
    temp->number = number;
    temp->next = NULL;
    head = temp;
    last = temp;
}

void insert(node *&head, node *&last, int number)
{
    if (isEmpty(head))
        insertAsFirstElement(head, last, number);
    else
    {
        node *temp = new node;
        temp->number = number;
        temp->next = NULL;
        last->next = temp;
        last = temp;
    }
}

void remove(node *&head, node *&last)
{
    if (isEmpty(head))
        cout << "The list is already empty.\n";
    else if (head == last)
    {
        delete head;
        head == NULL;
        last == NULL;
    }
    else
    {
        node *temp = head;
        head = head->next;
        delete temp;
    }
}

void showList(node *current)
{
    if (isEmpty(current))
        cout << "The list is empty\n";
    else
    {
        cout << "The list contains: \n";
        while(current != NULL)
        {
            cout << current->number << endl;
            current = current->next;
        }
    }
}

void showLogic(node *current)
{

}

int main()
{
    node *head = NULL;
    node *last = NULL;

    char choice;
    int number;

    do
    {
        choice = menu();
        switch(choice)
        {
        case '1': cout << "Please enter a number: ";
                  cin >> number;
                  insert (head,last,number);
                  break;
        case '2': remove(head,last);
                  break;
        case '3': showList(head);
                  break;
        case '4': 
            break;
        default: cout << "System Exit\n";
        }
    }
    while(choice != '5');

    system ("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

一种解决方案是对链表进行排序。最简单的方法是获取列表中的值,将它们存储在容器中,然后对容器进行排序。由于您不允许更改节点的顺序(保持物理顺序),这可能是显示排序列表的最佳选择。

首先,从头到尾遍历列表 - 你的showList()函数已经做了很多工作。但是,不是显示每个节点,而是将该节点的数据放在容器中(动态数组,向量或简单数组)。如果它是一个简单的数组,请确保所有元素都有空间,并跟踪元素的数量。

然后你拿走容器,并使用任意数量的排序算法进行排序 - 最简单的是冒泡排序。然后,您将显示已排序的容器给用户。

总而言之,您实际上并未更改链接列表,甚至在很大程度上不使用链接列表。你所做的只是收集每个节点中的所有数据,将它放在一个容器中,然后所有真正的排序工作从链表转移到容器。