数据结构实验之素数链表

这是一个关于数据结构的实践问题,涉及素数链表的构建和操作。给定一个初始链表,需要根据指定操作删除非素数元素,并在所有操作后判断链表是否为素数链表。程序通过链表节点存储整数,然后进行素数判断和删除操作。最终,根据链表状态输出相应信息。
摘要由CSDN通过智能技术生成

数据结构实验之素数链表

Description
我们定义素数链表为元素全部是素数的链表。

给定一个初始含有 n 个元素的链表,并给出 q 次删除操作,对于每次操作,你需要判断链表中指定位置上的元素,如果元素存在且不是素数则删除。

在所有操作完成后你还需要检查一下最终链表是否是一个素数链表。

Input
输入数据有多组。第 1 行输入 1 个整数 T (1 <= T <= 25) 表示数据组数。

对于每组数据:

第 1 行输入 2 个整数 n (1 <= n <= 50000), q (1 <= q <= 1000) 表示链表初始元素数量和操作次数
第 2 行输入 n 个用空格隔开的整数(范围 [0, 1000])表示初始链表
接下来 q 行,每行输入 1 个整数 i (1 <= i <= 50000),表示试图删除链表中第 i 个元素
Output
对于每组数据:

先输出 1 行 “#c”,其中 c 表示当前是第几组数据
对于每次删除操作,根据情况输出 1 行:
如果要删除的位置不存在元素(位置超出链表长度),则输出 “Invalid Operation”
如果要删除的位置存在元素且此位置的元素是非素数,则删除元素并输出 “Deleted x”,其中 x 为成功删除的数(必须为非素数才能删除)
如果要删除的位置存在元素且此位置的元素是素数,则输出 “Failed to delete x”,其中 x 为此位置上的数
删除操作全部进行完毕后,则还需判断该链表现在是否为一个素数链表。如果链表非空且是素数链表,则输出 “All Completed. It’s a Prime Linked List”,否则输出 “All Completed. It’s not a Prime Linked List”
所有输出均不包括引号。

Sample
Input
2
1 2
0
5
1
6 3
1 2 3 3 4 5
1
1
4
Output
#1
Invalid Operation
Deleted 0
All Completed. It’s not a Prime Linked List
#2
Deleted 1
Failed to delete 2
Deleted 4
All Completed. It’s a Prime Linked List
Hint
推荐直接复制粘贴输出语句字符串到你的代码中,以防手打敲错。

链表中第 1 个元素的位置为 1,第 2 个元素的位置为 2,以此类推。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct node
{
	int data;
	struct node* next;
};
int main()
{
	int t, n, m, i, d, j, flag;
	struct node* head, * tail, * p, * q;
	scanf("%d", &t);
	for (j = 1; j <= t; j++)
	{
		head = (struct node*)malloc(sizeof(struct node));
		head->next = NULL;
		tail = head;
		scanf("%d %d", &n, &m);
		for (i = 0; i < n; i++)//建表
		{
			p = (struct node*)malloc(sizeof(struct node));
			p->next = NULL;
			scanf("%d", &p->data);
			tail->next = p;
			tail = p;
		}
		printf("#%d\n", j);
		while (m--)//操作次数
		{
			p = head;
			q = head->next;
			scanf("%d", &d);
			if (d > n)//如果要删除的位置不存在元素(位置超出链表长度),则输出 "Invalid Operation"
			{
				printf("Invalid Operation\n");
			}
			else
			{
				d = d - 1;//细节处理
				while (d--)
				{
					p = p->next;
					q = q->next;
				}
				if (q->data == 2)//素数判断
					flag = 1;
				else if(q->data==0||q->data==1)
					flag = 0;
				else
				{
					flag = 1;
					for (i = 2; i <= sqrt(q->data); i++)//i <= sqrt(q->data),不然会超时
					{
						if (q->data % i == 0)
						{
							flag = 0;
							break;
						}
					}
				}
				if (flag == 0)//如果要删除的位置存在元素且此位置的元素是非素数,则删除元素并输出 "Deleted x"
				{
					printf("Deleted %d\n", q->data);
					p->next = q->next;
					n--;
				}
				else//如果要删除的位置存在元素且此位置的元素是素数,则输出 "Failed to delete x"
					printf("Failed to delete %d\n", q->data);
			}
		}
		q = head->next;
		while (q)//依次遍历结点的数据判断是否为素数
		{
			if (q->data == 2)
				flag = 1;
			else if (q->data == 0 || q->data == 1)
				flag = 0;
			else
			{
				flag = 1;
				for (i = 2; i <= sqrt(q->data); i++)
				{
					if (q->data % i == 0)
					{
						flag = 0;
						break;
					}
				}
				if (flag == 0)
					break;
			}
			q = q->next;
		}
		if (flag == 1)
		{
			printf("All Completed. It's a Prime Linked List");
		}
		else
			printf("All Completed. It's not a Prime Linked List");
		if (j != t)
			printf("\n");
	}
}

按照题意做即可,思路的大方向大体相同,注意细节处理便是。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值