已知线性表中的元素以值递增顺序排列,并以双向链表为存储结构。试实现以下功能:删除表中所有[MinNum, MaxNum]范围内的数据。

本文介绍了一种在双向链表中删除指定数值范围内元素的算法。通过输入链表元素和待删除区间的最小最大值,实现了从链表中移除该范围内的所有数据。文章详细展示了创建链表、删除节点及遍历打印链表结果的C语言代码。

已知线性表中的元素以值递增顺序排列,并以双向链表为存储结构。试实现以下功能:删除表中所有[MinNum, MaxNum]范围内的数据。

编程要求:
输入:
键盘输入链表的数据元素(至少 5 个)
键盘输入 MinNum, MaxNum 值
输出:
屏幕打印链表操作的结果。

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct DuLNode{
	struct DuLNode *prior;
	ElemType data;
	struct DuLNode *next;
}DuLNode, *DuLList;

void CreateList(DuLList &L,int n)//建立有n个元素的双向链表L
{
	DuLList p,s;
	ElemType i;
	L=(DuLList)malloc(sizeof(DuLNode));
	L->prior=NULL;
	L->next=NULL;
	p=L;
	for(i=0;i<n;i++)
	{
		s=(DuLList)malloc(sizeof(DuLNode));
		printf("Please input the %d element:",i+1);
		scanf("%d",&s->data);
		p->next=s;
		s->prior=p;
		p=p->next;
	}
	p->next=NULL;
}

void ListDelete(DuLList &L,int i,ElemType &e)//删除第i个位置的元素并把值赋给e
{
	DuLList p,s;
	int j;
	p=L;
	for(j=0;p&&j<i-1;j++)
		p=p->next;
	if(!p||j>i-1) {printf("ERROR!\n"); return;}
	s=p->next;
	e=s->data;
	p->next=s->next;
	if(p->next)
		p->next->prior=p;
	free(s);
}

void Function(DuLList &L,int n,int min,int max)
{
	DuLList p,s;
	int i;
	ElemType tem;
	p=L;
	for(i=0;p&&i<n;)
	{
		s=p->next;
		if(s->data>=min&&s->data<=max)
		{
			ListDelete(L,i+1,tem);
			n--;
			continue;
		}
		p=p->next;
		i++;
	}
}

void ListPrint(DuLList L)
{
	DuLList p;
	int i;	
	p=L->next;
	if(!p) {printf("ERROR!\n"); return;}
	for(i=0;p;i++)
	{
		printf("No.%d\t%d\n",i+1,p->data);
		p=p->next;
	}
}

void main()
{
	DuLList List;
	int n;
	ElemType Min,Max;
	printf("Please input the number of element:");
	scanf("%d",&n);
	CreateList(List,n);
	printf("Please input the Minimum number:");
	scanf("%d",&Min);
	printf("Please input the Maximum number:");
	scanf("%d",&Max);
	Function(List,n,Min,Max);
	ListPrint(List);
}

### 删除线性表大于 `min` 且小于 `max` 的元素算法 在按递增顺序排列并以带头结点的单链表存储的线性表中,删除所有大于 `min` 且小于 `max` 的元素,可以通过遍历链表并在满足条件时调整指针来实现。以下是详细的算法实现[^1]。 #### 算法描述 - 创建一个工作指针 `p` 指向头结点。 - 遍历链表中的每个节点,检查当前节点的下一个节点是否满足条件 `min < p->next->data && p->next->data < max`。 - 如果满足条件,则删除该节点并释放内存。 - 如果不满足条件,则移动指针继续检查下一个节点。 - 最终返回修改后的链表。 #### 代码实现 以下是一个完整的 C 语言代码示例,展示如何实现上述算法: ```c #include <stdio.h> #include <stdlib.h> #define ElemType int // 定义单链表节点结构 struct LNode { ElemType data; // 数据域 struct LNode *next; // 指针域 }; typedef struct LNode *LinkList; // 定义链表类型 // 初始化带头结点的单链表 bool InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(struct LNode)); if (*L == NULL) return false; (*L)->next = NULL; return true; } // 按递增顺序插入元素 bool InsertElem(LinkList L, ElemType e) { LinkList p = L, q = NULL; while (p->next != NULL && p->next->data < e) { p = p->next; } q = (LinkList)malloc(sizeof(struct LNode)); if (q == NULL) return false; q->data = e; q->next = p->next; p->next = q; return true; } // 删除大于 min 且小于 max 的元素 void DeleteBetweenMinAndMax(LinkList L, ElemType min, ElemType max) { LinkList p = L, q = NULL; while (p->next != NULL) { if (p->next->data > min && p->next->data < max) { q = p->next; // 保存要删除的节点 p->next = q->next; // 调整指针 free(q); // 释放内存 } else { p = p->next; // 移动指针 } } } // 遍历链表并输出元素 void TraverseList(LinkList L) { LinkList p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { LinkList L; InitList(&L); // 初始化链表 // 插入元素 InsertElem(L, 1); InsertElem(L, 2); InsertElem(L, 3); InsertElem(L, 4); InsertElem(L, 5); printf("删除前:"); TraverseList(L); // 输出结果:1 2 3 4 5 // 删除大于 1 且小于 4 的元素 DeleteBetweenMinAndMax(L, 1, 4); printf("删除后:"); TraverseList(L); // 输出结果:1 4 5 return 0; } ``` #### 算法分析 - **时间复杂度**:由于需要遍历整个链表,时间复杂度为 O(n),其中 n 是链表的长度。 - **空间复杂度**:仅使用了常数个额外变量,因此空间复杂度为 O(1)。 ### 注意事项 - 在删除节点时,必须确保正确调整指针以避免链表断裂。 - 删除操作完成后,需释放被删除节点的内存,防止内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨尘儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值