链表

基本形式

/*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;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值