#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;
}