以下代码计算大于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;
}
如何使用双向列表执行相同的操作?
答案 0 :(得分:1)
备注强>:
双向(或双链接)列表,也有一个指向前一个节点的成员:这是两个列表类型之间的全部差异(因此第一个元素 - 或左侧列表,将此成员指向NULL
)。因此,当这样的节点被创建/插入到列表中时,这个新成员也应该被设置(我在发生这种情况的代码中注释),新节点和它后面的节点(如果有的话)。 / p>
我修改了列表的创建方式 - MakeList
替换为_MakeList2
+ MakeList2
; _MakeList2
中的下划线(_)指定它以某种方式私有(从 Python 借用的约定) - 它&# 39;不是很好,但我觉得这样比较容易
我在这台计算机上没有 Visual Studio ,因此我使用了 gcc 。它抱怨system
功能,所以我不得不添加#include <stdlib.h>
我重命名了一些标识符(List
- &gt; Node
,Add_start
- &gt; AddNode
,nItem
- &gt; { {1}})因为新名称更有意义,或者名称一致
我尝试将更改保持在最低限度(因此解决方案尽可能接近原始帖子)
我增强了(通过添加一个额外的参数:nNode
(默认值:1))toRight
func,所以它可以两种方式迭代列表 - 我正在迭代在删除列表之前从右到左(用于测试目的)
我纠正了一些(次要的)编码风格问题
以下是修改过的代码:
Print