【发布时间】:2020-11-04 23:18:18
【问题描述】:
您好,我对 C++ 中的埃拉托色尼筛法有疑问。我必须使用单链表来做到这一点。我的程序正在运行并显示列表的第一个声明,但我不知道如何正确删除非素数。我的功能对我不起作用。我应该如何更改我的删除功能?
#include <iostream>
#include <cmath>
using namespace std;
struct List
{
int number;
List* next;
};
List* head = new List;
void l_add(int n)
{
List* temp = head;
for (int i = 2; i <= n; i++)
{
temp->next = new List();
temp->number = i;
temp = temp->next;
}
}
void l_print()
{
List* temp = head;
while (temp->next != 0)
{
cout << temp->number << " ";
temp = temp->next;
}
cout << endl;
}
void l_delete(int n)
{
List* temp = head;
for (int i = 2; i < sqrt(n); i++)
{
if (temp->number % i == 0)
{
head = temp->next;
delete temp;
temp = head;
}
while (temp->next != 0)
{
if (temp->next->number % i == 0)
{
temp->next = temp->next->next;
delete temp->next;
}
temp = temp->next;
}
}
}
int main()
{
int n;
cout << "Enter up to which number to find prime numbers using Sieve of Eratosthenes: " << endl;
cin >> n;
l_add(n);
l_print();
l_delete(n);
l_print();
return 0;
}
【问题讨论】:
-
请注意,遍历链表会影响性能,而哨兵节点会让您感到悲痛,因为我认为您没有任何方法可以知道它是哨兵节点。
标签: c++ singly-linked-list sieve-of-eratosthenes