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

在这里插入图片描述

#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;  //指针域
	//int m_size;  //链表长度
}SingleList;

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

	return list;
}

//尾插法创建单链表
SingleList* create_SingleListByTail(SingleList* list)
{
	SingleList* head, * pCreate, * pMove;  
	int num, data;
	head = (SingleList*)malloc(sizeof(SingleList));  //创建头结点
	head = list;
	if (head == NULL)
	{
		return NULL;
	}
	else
	{
		head->next = NULL;
	}
	pMove = head;   //让pMove指向head
	printf("请输入要插入结点的个数:");
	scanf_s("%d", &num);
	for (int i = 0; i < num; 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;
	}
	//list->m_size++;  //链表长度更新

	return list;
}

//删除链表中所有值为value的数
int delete_SingleListByValue(SingleList* list, int value)
{
	SingleList* pMove, * delete, * pre;
	int flag = 0;
	if (list == NULL)
		exit(0);
	pre = list;  //指向头结点
	pMove = list->next;  //指向链表头结点的后继结点
	while (pMove != NULL)
	{
		if (pMove->data == value)
		{
			delete = pMove;     //保存删除结点
			pre->next = pMove->next; //更改删除结点前驱结点指针的指向
			pMove = pMove->next; //当前指针下移
			free(delete);
			flag = 1;
		}
		else
		{
			//若值不相等,前驱结点指针下移,当前指针下移,继续循环操作
			pre = pMove;
			pMove = pMove->next;
		}
	}
	return flag;
}

//销毁单链表
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 value, flag;
	list = init_SingleList();  //初始化
	myList = create_SingleListByTail(list);  //尾插法创建单链表
	printf("删除前的链表:\n");
	printf_SingleList(myList);  //打印链表内容

	printf("请输入要删除的值:");
	scanf_s("%d", &value);
	flag = delete_SingleListByValue(myList, value);  //删除链表中所有值为value的数
	if (flag == 1)
	{
		printf("删除后的链表:\n");
		printf_SingleList(myList);  //打印链表内容
	}
	else
		printf("链表中没有与要删除的值相同的数!\n");

	destory_SingleList(myList);

	system("pause");
	return EXIT_SUCCESS;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值