链表基本操作

目录

链表基本操作

1. 初始化链表

2. 遍历链表

3. 插入结点

4. 删除节点

5. 清空链表

6.  销毁链表

7.  反转链表

完整代码


链表基本操作

1. 初始化链表

       建立带有头结点的单向链表,,结点数据域中的数值从键盘输入,以 -1 作为输入结束标志,链表的头结点地址由函数值返回。

//初始化链表
struct LinkNode * Init_LinkList()
{
	//待插入数据
	int a;  
	//创建头节点
	struct LinkNode * pHeader = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	//记录尾节点位置,方便尾插入新的数据
	struct LinkNode * pTail = pHeader;

	while (true)
	{
		//让用户初始化几个节点,如果用户输入的是-1,代表插入结束
		printf("请输入数据,输入-1停止\n");
		scanf("%d", &a);
		if (a == -1)
		{
			break;
		}
		struct LinkNode * pADD= (struct LinkNode *)malloc(sizeof(struct LinkNode));
		pADD->m = a;
		pADD->next = NULL;

		//更改指针的指向
		pTail->next = pADD;
		//更新新的尾节点的指向
		pTail = pADD;
	}
	return pHeader;
}

2. 遍历链表

     顺序输出单向链表各项结点数据域中的内容:

//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}
	//指定第一个有真实数据的节点
	struct LinkNode * pCurrent = pHeader->next;

	while(pCurrent!= NULL)
	{
		printf("%d\n" , pCurrent->m);
		pCurrent = pCurrent->next;
	}
}

3. 插入结点

       在指定值后面插入数据data,如果值val不存在,则在尾部插入。

//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader, int oldVal, int newVal)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while(pCurrent != NULL)
	{
		if (pCurrent->m == oldVal)
		{
			break;
		}
		//如果没找到对应的位置,辅助指针向后移动
		pPrve = pCurrent;
		pCurrent = pCurrent->next;
	}
	struct LinkNode * pADD = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	pADD->m = newVal;
	pADD->next = NULL;

	//建立关系
	pPrve->next = pADD;
	pADD->next = pCurrent;
}

4. 删除节点

       删除第一个值为val的结点。

//删除链表
void Delete_LinkList(struct LinkNode *pHeader, int Val)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while (pCurrent->m != Val)
	{
		if (pCurrent == NULL)
		{
			printf("没有找到要删除\n");
			return;
		}
		//如果没找到对应的位置,辅助指针向后移动
		pPrve = pCurrent;
		pCurrent = pCurrent->next;
	}
	//更改指针的指向进行删除
	pPrve->next = pCurrent->next;
	//删除掉待删除的节点
	free(pCurrent);
	pCurrent = NULL;
}

5. 清空链表

//清空链表
void Clean_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while (pCurrent != NULL)
	{
		pPrve = pCurrent;
		pCurrent = pCurrent->next;

		free(pPrve);
		pPrve = NULL;
	}
	pHeader->next = NULL;
}

6.  销毁链表

      销毁链表,释放所有节点的空间.

//销毁链表
void destroy_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}

	//先清空链表
	Clean_LinkList(pHeader);

	//再释放头节点
	free(pHeader);
	pHeader = NULL;
}

7.  反转链表

//反转链表
void reverse_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}

	//创建三个个临时的节点
	struct LinkNode *pPrve = NULL;
	struct LinkNode *pCurrent = pHeader->next;
	struct LinkNode *pNext = pCurrent->next;

	while(1)
	{
		pCurrent->next = pPrve;

		if (pNext == NULL)
		{
			break;
		}
		//移动三个结点
		pPrve = pCurrent;
		pCurrent = pNext;
		pNext = pCurrent->next;
	}
	pHeader->next = pCurrent;
}

完整代码

listLink.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

struct LinkNode {
	int m;
	struct LinkNode * next;
};

//初始化链表
struct LinkNode * Init_LinkList();

//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader);

//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader , int oldVal , int newVal);

//删除链表
void Delete_LinkList(struct LinkNode *pHeader , int Val);

//清空链表
void Clean_LinkList(struct LinkNode *pHeader);

//销毁链表
void destroy_LinkList(struct LinkNode *pHeader);

//反转链表
void reverse_LinkList(struct LinkNode *pHeader);

listLink.cpp

#include "listLink.h"

//初始化链表
struct LinkNode * Init_LinkList()
{
	//待插入数据
	int a;  
	//创建头节点
	struct LinkNode * pHeader = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	//记录尾节点位置,方便尾插入新的数据
	struct LinkNode * pTail = pHeader;

	while (true)
	{
		//让用户初始化几个节点,如果用户输入的是-1,代表插入结束
		printf("请输入数据,输入-1停止\n");
		scanf("%d", &a);
		if (a == -1)
		{
			break;
		}
		struct LinkNode * pADD= (struct LinkNode *)malloc(sizeof(struct LinkNode));
		pADD->m = a;
		pADD->next = NULL;

		//更改指针的指向
		pTail->next = pADD;
		//更新新的尾节点的指向
		pTail = pADD;
	}
	return pHeader;
}

//遍历链表
void Foreach_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}
	//指定第一个有真实数据的节点
	struct LinkNode * pCurrent = pHeader->next;

	while(pCurrent!= NULL)
	{
		printf("%d\n" , pCurrent->m);
		pCurrent = pCurrent->next;
	}
}

//插入链表
void InsertByVal_LinkList(struct LinkNode *pHeader, int oldVal, int newVal)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while(pCurrent != NULL)
	{
		if (pCurrent->m == oldVal)
		{
			break;
		}
		//如果没找到对应的位置,辅助指针向后移动
		pPrve = pCurrent;
		pCurrent = pCurrent->next;
	}
	struct LinkNode * pADD = (struct LinkNode *)malloc(sizeof(struct LinkNode));
	pADD->m = newVal;
	pADD->next = NULL;

	//建立关系
	pPrve->next = pADD;
	pADD->next = pCurrent;
}

//删除链表
void Delete_LinkList(struct LinkNode *pHeader, int Val)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while (pCurrent->m != Val)
	{
		if (pCurrent == NULL)
		{
			printf("没有找到要删除\n");
			return;
		}
		//如果没找到对应的位置,辅助指针向后移动
		pPrve = pCurrent;
		pCurrent = pCurrent->next;
	}
	//更改指针的指向进行删除
	pPrve->next = pCurrent->next;
	//删除掉待删除的节点
	free(pCurrent);
	pCurrent = NULL;
}


//清空链表
void Clean_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}
	//创建两个临时的节点
	struct LinkNode *pPrve = pHeader;
	struct LinkNode *pCurrent = pHeader->next;

	while (pCurrent != NULL)
	{
		pPrve = pCurrent;
		pCurrent = pCurrent->next;

		free(pPrve);
		pPrve = NULL;
	}
	pHeader->next = NULL;
}

//销毁链表
void destroy_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}

	//先清空链表
	Clean_LinkList(pHeader);

	//再释放头节点
	free(pHeader);
	pHeader = NULL;
}

//反转链表
void reverse_LinkList(struct LinkNode *pHeader)
{
	if (pHeader == NULL)
	{
		return;
	}

	//创建三个个临时的节点
	struct LinkNode *pPrve = NULL;
	struct LinkNode *pCurrent = pHeader->next;
	struct LinkNode *pNext = pCurrent->next;

	while(1)
	{
		pCurrent->next = pPrve;

		if (pNext == NULL)
		{
			break;
		}
		//移动三个结点
		pPrve = pCurrent;
		pCurrent = pNext;
		pNext = pCurrent->next;
	}
	pHeader->next = pCurrent;
}

main.cpp

#include "listLink.h"

int main()
{
	//初始化链表
	struct LinkNode * pHeader = Init_LinkList();
	printf("初始化遍历链表结果为:\n");
	Foreach_LinkList(pHeader);

	//插入链表
	InsertByVal_LinkList(pHeader, 2, 101);
	InsertByVal_LinkList(pHeader, 3, 102);
	printf("插入遍历链表结果为:\n");
	Foreach_LinkList(pHeader);

	//反转链表
	reverse_LinkList(pHeader);
	printf("反转链表遍历链表结果为:\n");
	Foreach_LinkList(pHeader);

	//删除链表
	Delete_LinkList(pHeader, 2);
	printf("删除遍历链表结果为:\n");
	Foreach_LinkList(pHeader);

	//清空链表
	Clean_LinkList(pHeader);
	InsertByVal_LinkList(pHeader, 1, 1);
	InsertByVal_LinkList(pHeader, 3, 3);
	printf("清空遍历链表结果为:\n");
	Foreach_LinkList(pHeader);

	//销毁链表
	destroy_LinkList(pHeader);

	system("pause");
	return -1;
}

 推荐一个不错的学习网站https://ke.qq.com/course/417774?flowToken=1010783#term_id=100498433

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值