王道数据结构链表算法题第七题

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>

typedef struct node
{
	int data;  //数据域
	struct node* next;  //指针域
}SingleList;

//初始化
SingleList* init_SingleList()
{
	SingleList* list = malloc(sizeof(SingleList));
	if (list == NULL)
	{
		return NULL;
	}
	list->data = 0;
	list->next = NULL;

	return list;
}

//尾插法创建单链表
SingleList* create_SingleListByTail(SingleList* list)
{
	SingleList* pMove, * pCreate, * head;
	int length, data;
	head = (SingleList*)malloc(sizeof(SingleList));
	head = list;
	if (head == NULL)
	{
		return NULL;
	}
	else
	{
		head->next = NULL;
	}
	pMove = head;
	printf("请输入创建链表的长度:");
	scanf_s("%d", &length);
	for (int i = 0; i < length; i++)
	{
		scanf_s("%d", &data);
		pCreate = (SingleList*)malloc(sizeof(SingleList));
		if (pCreate == NULL)
		{
			return NULL;
		}
		pCreate->data = data;
		pCreate->next = NULL;

		//插入操作
		pMove->next = pCreate;
		pMove = pCreate;
	}
	return list;
}

//删除在n和m间的值
void delete_SingleList(SingleList* list,int n,int m,int* flag)
{
	SingleList* pre, * pMove, * delete;//pre指针指向当前结点的前驱,pMove指针为工作指针,delete指针保存要删除的结点
	if(list==NULL)
		exit(-1);
	*flag = 0;
	pre = list;
	pMove = pre->next;
	while (pMove != NULL)
	{
		if (pMove->data >= n && pMove->data <= m)//在所要删除范围内,做删除结点操作
		{
			delete = pMove;
			pre->next = pMove->next;
			pMove = pMove->next;
			free(delete);
			(*flag)++;
		}
		else//不在删除范围,做指针下移操作,继续判断
		{
			pre = pMove;
			pMove = pMove->next;
		}
	}
}

//销毁单链表
void destory_SingleList(SingleList* list)
{
	SingleList* currentNode, * nextNode;
	currentNode = list->next;
	while (currentNode != NULL)
	{
		nextNode = currentNode->next;
		free(currentNode);
		currentNode = nextNode;
	}
	free(list);
	list = NULL;
}

//打印
void printf_SingleList(SingleList* list)
{
	SingleList* pMove;
	pMove = list->next;
	while (pMove != NULL)
	{
		printf("%d ", pMove->data);
		pMove = pMove->next;
	}
	printf("\n");
}


int main(void)
{
	SingleList* list, * myList;
	int n, m, flag;
	list = init_SingleList();  //初始化
	myList = create_SingleListByTail(list);  //尾插法创建单链表
	printf("原始链表为:\n");
	printf_SingleList(myList);  //打印

	printf("请输入要删除的区间值:");
	scanf_s("%d%d", &n, &m);
	delete_SingleList(myList, n, m, &flag);  //删除在n和m间的值
	
	if (flag != 0)
	{
		printf("删除后的链表为:\n");
		printf_SingleList(myList);
	}
	else
	{
		printf("链表中没有值在给定区间!\n");
	}

	destory_SingleList(myList);

	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值