基本形式
/*item* head, * tail, * temp;
tail = head = NULL;
for (int i = 0; i < nums.size(); i++)
{
temp = new item;
temp->next = NULL;
temp->num = nums[i];
if (head == NULL)
{
head = tail = temp;
}
else
{
tail->next = temp;
tail = temp;
}
}*/
遍历方法
while (cur != NULL) {
;
cur = cur->next;
}
习题
了解如何在数链中从小到大直接插入排序
题目描述
编写程序,用类实现单向链表结构。为每个输入的素数创建新节点,并按照从小到大的顺序插入到链表中的适当位置。最后将链表内的内容从首至尾遍历输出。请注意,输出内容严格单增,即输出的元素不能重复。不用考虑第一个就是非素数以及不单增等输入违法的情况。
输入
第一行:任意n个整数,彼此间用空格分隔,整数范围[-10000, 10000],n < 100。
输出
第一行:m个素数,并且保持严格单增(m < n)
样例输入
23 5 37 31 17 5 23 28
样例输出
5 17 23 31 37
#include "bits/stdc++.h"
using namespace std;
struct item {
int num;
item* next;
};
bool isprime(int x) {
if (x<=1)
{
return 0;
}
bool t = true;
for (int i = 2; i <= x / 2; i++) {
if (x % i == 0) { t = false; break; }
}return t;
}
bool chong(item * head,int k)
{
item* cur = head;
while (cur != NULL) {
if (k == cur->num)
{
return 0;
}
cur = cur->next;
}
return 1;
}
int main()
{
item* head, * tail, * temp,* cur;
cur=tail = head = NULL;
int k = 0;
while (cin >> k)
{
cur = head;
if (cin.get() == '\n') break;
if(isprime(k)==1&&chong(head,k)==1)
{
temp = new item;
temp->next = NULL;
temp->num = k;
if (head == NULL)
{
head = tail = temp;
}
else if(temp->num<head->num)
{
temp->next = head;
head = temp;
}
else if(temp->num>tail->num)
{
tail->next = temp;
tail = temp;
}
else
{
do
{
if(cur->num<temp->num&&cur->next->num>temp->num)
{
temp->next = cur->next;
cur->next = temp;
}
cur = cur->next;
} while (cur->next != NULL);
}
}
}
cur = head->next;
cout << head->num;
while (cur != NULL) {
cout << " " << cur->num ;
cur = cur->next;
}
return 0;
}
争对此题目,可以直接用vector容器写,一样可以通过测试
(水题目的愉悦)
#include "bits/stdc++.h"
using namespace std;
bool isprime(int x) {
if (x<=1)
{
return 0;
}
bool t = true;
for (int i = 2; i <= x / 2; i++) {
if (x % i == 0) { t = false; break; }
}return t;
}
bool chong(vector<int> nums,int k)
{
for (int i = 0; i < nums.size(); i++)
{
if (k==nums[i])
{
return 0;
}
}
return 1;
}
int main()
{
vector<int> nums;
int k = 0;
while (cin >> k)
{
if (cin.get() == '\n') break;
if(isprime(k)==1&&chong(nums,k)==1)
{
nums.push_back(k);
}
}
sort(nums.begin(), nums.end());
if (nums.size() == 0) { return 0; }
cout << nums[0];
for (int i = 1; i < nums.size(); i++)cout << " " << nums[i];
return 0;
}