单链表操作1-摘A链表中值位于min-max的结点到B链表(个人学习笔记,仅供参考)

题目要求

在一个带头结点的单链表A中,头指针为a,编写函数CountItems( )获取A中所有数据域大于等于min,而小于等于max的链点,将所得链点插入一个新的单链表B,要求B链表除了头结点b可以新开辟空间外,其余链点均利用A表的链点,最终打印出新链表B,并且打印出新链表元素在原链表中的序号。

单链表结点定义

带头结点的单链表结点定义如下:

typedef int DataType;
typedef struct Node
{
DataType data; 	// data域用于存储数据元素
struct Node *next; // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList; // LinkList为头指针

函数接口定义

函数接口如下:

int CountItems( LinkList a , LinkList *b , LinkList *no, DataType min , DataType max );

其中 a ,b , no,min,max都是用户传入的参数。 a是原始链表A的头指针,*b是新链表B的头指针,*no是存储B中元素在A中下标的链表头指针,min,max是数据域区间上下限。

测试程序样例

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

typedef int DataType;
typedef struct Node
{
DataType data; 	// data域用于存储数据元素
struct Node *next; // next域用于存放指向其后继的指针
}LNode, *PNode, *LinkList; // LinkList为头指针

int InitLinkList(LinkList *head); /* 初始化链表, 细节在此不表 */
PNode LinkListInsert(LinkList h, int pos, DataType x) ; /* 向链表插入新元素,返回新插入链点的指针,细节在此不表 */
void TraverseLinkList(LinkList h); /* 遍历单链表,细节在此不表 */
void DestroyLinkList(LinkList h); /* 销毁单链表,细节在此不表 */

int CountItems( LinkList a , LinkList *b , LinkList *no, DataType min , DataType max ); 
/* 本题要求函数 */

int main()
{
	LinkList h,s,xb;
	DataType x,lo,hi;
	char ch;
	int pos = 1;
	InitLinkList(&h);
	InitLinkList(&s);
	InitLinkList(&xb);
	do
	{
		scanf("%d",&x);
		LinkListInsert( h , pos++ , x );
	}while ((ch=getchar())!='\n');
	scanf("%d%d",&lo,&hi);
	if ( CountItems( h , &s , &xb, lo , hi ) == 1 )
	{
		printf("单链表B是: \n");
		TraverseLinkList(s);
		printf("单链表B中元素位于单链表A中的位置是:\n");
		TraverseLinkList(xb);
	}
	else
	{
		printf("A链表中没有位于[%d,%d]区间的数据!\n",lo,hi);
	}
	DestroyLinkList(h);
	DestroyLinkList(s);
	DestroyLinkList(xb);
	return 0;
}

输入样例

在这里给出一组输入。例如:

23 56 21 42 23 89 30 64 23
30 45

输出样例

在这里给出相应的输出。例如:

单链表B是:
42 30
单链表B中元素位于单链表A中的位置是:
4 7

答案

int CountItems(LinkList a, LinkList *b, LinkList *no, DataType min, DataType max)
{
	PNode pre = a;			//前一链点指针
	PNode p = pre->next;	//当前链点指针
	PNode b_taill = *b;		//链表B尾指针
	PNode no_taill = *no;	//序号链表尾指针
	PNode p_no; 			//新建链点存放序号
	int cnt = 0;
	int flag = 0;
	while (p)
	{
		if (p->data >= min && p->data <= max)
		{
			flag = 1;
			pre->next = p->next;
			p->next = NULL;
			b_taill->next = p;
			b_taill = p;			//尾插法将A中链点摘除挂至B尾
			p = pre->next;			//指针跳转回A中
			cnt++;
			p_no = (PNode)malloc(sizeof(LNode));	//开辟空间,存放序号
			p_no->data = cnt;
			p_no->next = NULL;
			no_taill->next = p_no;
			no_taill = p_no;		//尾插法将序号计数插入序号链表
		}
		else
		{
			pre = pre->next;
			p = p->next;			//不符合筛选要求时,指针后移
			cnt++;
		}
	}
	if (flag == 1)
		return 1;
	else
		return 0;
}

数据结构学习中,个人笔记,仅供参考
如有错误,烦请指正
参考视频: 【LinkList1-摘A链表中值位于min-max的结点到B链表】

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是Python语言的实现: ```python class Node: def __init__(self, value): self.value = value self.next = None def create_linked_list(): head = None tail = None while True: value = int(input()) if value == -1: break new_node = Node(value) if head is None: head = new_node tail = new_node else: tail.next = new_node tail = new_node return head def delete_node(head, m): # 删除头结点 while head is not None and head.value == m: head = head.next # 删除其他结点 current = head while current is not None and current.next is not None: if current.next.value == m: current.next = current.next.next else: current = current.next return head head = create_linked_list() m = int(input()) head = delete_node(head, m) # 输出删除后的链表 current = head while current is not None: print(current.value) current = current.next ``` 首先定义了一个`Node`类,表示链表一个结点,包含一个值和一个指向下一个结点的指针。然后定义了`create_linked_list`函数,用于建立单向链表,它会从输入读取一些正整数,直到读到-1为止。在读取每个正整数时,会创建一个新的结点,并将其添加到链表的末尾。 接下来定义了`delete_node`函数,用于删除链表中值为m的所有结点。它首先删除头结点所有值为m的结点,然后再依次删除其他结点所有值为m的结点。最后,它返回删除后的链表头结点。 最后,读取一个整数m,调用`delete_node`函数删除链表所有值为m的结点,并输出删除后的链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值