【数据结构】链表分类,定义,优势与缺陷,C语言实现单向链表代码

请添加图片描述
请添加图片描述

LinkList.h(头文件,定义接口):

#pragma once  //防止头文件重复包含
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

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

	//初始化链表
	struct LinkNode* Init_LinkList();
	//在值为oldvalue的后面插入一个新的数据newvalue
	void InsertByValue_LinkList(struct LinkNode *header,int oldValue,int newValue);
	//删除值为val的结点
	void RemoveByValue_LinkList(struct LinkNode* header, int delValue);
	//遍历
	void Foreach_LinkList(struct LinkNode *header);
	//销毁链表
	void Destory_LinkList(struct LinkNode * header);
	//清空链表
	void Clear_LinkList(struct LinkNode *header);
#ifdef __cplusplus
}
#endif

LinkList.c(实现接口):

#include"LinkList.h"



struct LinkNode* Init_LinkList()
{
	struct LinkNode *header = malloc(sizeof(struct LinkNode));
	header->data = -1;
	header->next = NULL;
	int val = -1;
	struct LinkNode *pRear = header;

	while  (true)
	{
		printf("输入插入的数据:\n");
		scanf("%d", &val);
		if (val == -1)
		{
			break;
		}
		struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
		newNode->data = val;
		newNode->next = NULL;
		pRear->next = newNode;
		pRear = newNode;
	}
	return header;
}
//在值为oldvalue的后面插入一个新的数据newvalue
void InsertByValue_LinkList(struct LinkNode* header, int oldValue, int newValue)
{
	while (header==NULL)
	{
		return;
	}
	struct LinkNode* pPrev = header;
	struct LinkNode* pCurrent = pPrev->next;
	while (pCurrent!=NULL)
	{
		if (pCurrent->data==oldValue)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
#if 0   
	if (pCurrent == NULL)   //数据没找到	
	{
		return;
	}
#endif // 0

	struct LinkNode* newNode = malloc(sizeof(struct LinkNode));
	newNode->data = newValue;
	newNode->next = NULL;
	pPrev->next = newNode;
	newNode->next = pCurrent;
}
void RemoveByValue_LinkList(struct LinkNode* header, int delValue)
{
	if (header==NULL)
	{
		return;
	}
	struct LinkNode* pPrev = header;
	struct LinkNode* pCurrent = pPrev->next;
	while (pCurrent!=NULL)
	{
		if (pCurrent->data==delValue)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;  //移动俩指针
	}
	if (pCurrent==NULL)
	{
		return;
	}
	pPrev->next = pCurrent->next;
	free(pCurrent);
	pCurrent = NULL;
}
void Foreach_LinkList(struct LinkNode* header)
{
	if (header==NULL)
	{
		return;
	}
	struct LinkNode* pCurrent = header->next;
	while (pCurrent!=NULL)
	{
		printf("% d", pCurrent->data);
		pCurrent = pCurrent->next;
	}
}
void Destory_LinkList(struct LinkNode* header)
{
	if (header==NULL)
	{
		return;
	}
	struct LinkNode* pCurrent = header;
	while (pCurrent!=NULL)
	{
		struct LinkNode* pNext = pCurrent->next;
		printf("%d结点被销毁\n", pCurrent->data);
		free(pCurrent);
		pCurrent = pNext;
	}


}
void Clear_LinkList(struct LinkNode* header)
{
	if (header==NULL)
	{
		return;
	}
	//辅助指针变量
	struct LinkNode *pCurrent = header->next;
	while (pCurrent!=NULL)
	{
		struct LinkNode* pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;
	}
	header->next = NULL;
}

TestLinkList.c(测试接口):

	#include"LinkList.h"

void test()
{
	struct LinkNode* header = Init_LinkList();  //输入100 200 300 400 500 600
	Foreach_LinkList(header);
	InsertByValue_LinkList(header, 300, 66666666);  //插入后的
	printf("\n----------\n");
	Foreach_LinkList(header);
	printf("\n----------\n");
	Clear_LinkList(header);    //清空后
	Foreach_LinkList(header);


	printf("\n----------\n");
	InsertByValue_LinkList(header, 0, 111);
	InsertByValue_LinkList(header, 0, 222);
	InsertByValue_LinkList(header, 0, 333);
	InsertByValue_LinkList(header, 0, 444);
	InsertByValue_LinkList(header, 0, 555);
	printf("\n----------\n");
	Foreach_LinkList(header);
	printf("\n----------\n");
	RemoveByValue_LinkList(header, 444);
	Foreach_LinkList(header);
	Destory_LinkList(header);

}


int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值