双向列表

时间:2016-11-29 12:48:40

标签: list visual-c++

以下代码计算大于3且小于8的单向列表项的元素总和,并将总和的结果更改为列表的开头。

#include <iostream>

using namespace std;

struct List 
{
    int num;
    List* nItem;
};

int Input()
{
    int number;
    cout << "Enter the number: "; cin >> number;
    return number;
}

void MakeList(List **head, int n)
{
    if (n > 0) {
        *head = new List;
        (*head)->num = Input();
        (*head)->nItem = NULL;
        MakeList(&(*head)->nItem, n - 1);
    }
}

void Print(List* head)
{

    if (head != NULL)  {
        cout << head->num << " ";
        Print(head->nItem);
    }
}

List* Add_start(List* head, int index, int elm)
{
    List* p = new List;
    p->num = elm;
    p->nItem = NULL;

    if (head == NULL)  {
        head = p;
    }
    else  {
        List* current = head;
        for (int i = 0; (i < index - 1) && (current->nItem != NULL); i++) 
        {
            current = current->nItem;
        }
        if (index == 0)  
        {
            p->nItem = head;
            head = p;
        }
        else  {
            if (current->nItem != NULL)  {
                p->nItem = current->nItem;
            }
            current->nItem = p;
        }
    }

    return head;
}

int Sum(List* head)
{
    int sum = 0;
    List* p = head;
    while(p) {
        if ((p->num > 3) && (p->num < 8))
            sum += p->num;
        p = p->nItem;
    }

    return sum;
}

void DeleteList(List* head)
{
    if (head != NULL) {
        DeleteList(head->nItem);
        delete head;
    }
}

int main()
{
    int n = 10;
    List* head = NULL;

    cout << "Enter 10 number to the list\n" << endl;
    MakeList(&head, n);
    int sum = Sum(head);
    head = Add_start(head, 0, sum);

    cout << "\nList: ";
    Print(head);
    cout << endl;

    DeleteList(head);

    system("pause");
    return 0;
}

如何使用双向列表执行相同的操作?

1 个答案:

答案 0 :(得分:1)

备注

  • 双向(或双链接)列表,也有一个指向前一个节点的成员:这是两个列表类型之间的全部差异(因此第一个元素 - 或左侧列表,将此成员指向NULL)。因此,当这样的节点被创建/插入到列表中时,这个新成员也应该被设置(我在发生这种情况的代码中注释),新节点和它后面的节点(如果有的话)。 / p>

  • 我修改了列表的创建方式 - MakeList替换为_MakeList2 + MakeList2; _MakeList2中的下划线(_)指定它以某种方式私有(从 Python 借用的约定) - 它&# 39;不是很好,但我觉得这样比较容易

  • 我在这台计算机上没有 Visual Studio ,因此我使用了 gcc 。它抱怨system功能,所以我不得不添加#include <stdlib.h>

  • 我重命名了一些标识符(List - &gt; NodeAdd_start - &gt; AddNodenItem - &gt; { {1}})因为新名称更有意义,或者名称一致

  • 我尝试将更改保持在最低限度(因此解决方案尽可能接近原始帖子)

  • 我增强了(通过添加一个额外的参数:nNode(默认值:1))toRight func,所以它可以两种方式迭代列表 - 我正在迭代在删除列表之前从右到左(用于测试目的)

  • 我纠正了一些(次要的)编码风格问题

以下是修改过的代码:

Print