C语言链表写法,练习链表

Posted 慕書

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言链表写法,练习链表相关的知识,希望对你有一定的参考价值。

C语言链表写法,练习链表

  1. 建立要一个文件:LinkList.h
    内容:
#define _CRT_SECURE_NO_WARNINGS

#pragma once

#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>

#ifdef __cplusplus
extern "C"
#endif
	//定义节点数据类型
	struct LinkNode
	
		int data;
		struct LinkNode *next;
	;

	//初始化链表
	struct LinkNode *Init_LinkList();
	//在值为oldval的位置插入新的数据newval
	void InsertByValue_LinkList(struct LinkNode *header, int oldval, int newval);
	//删除值为val的结点
	void RemoveByValue_LinkList(struct LinkNode *header, int delValue);
	//遍历
	void Foreach_LinkList(struct LinkNode *header);
	//销毁
	void Destroy_LinkList(struct LinkNode *header);
	//清空
	void Clear_LinkList(struct LinkNode *header);


#ifdef __cplusplus

#endif

2.建立一个文件:LinkList.c

#include"LinkList.h"

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

	//创建头结点
	struct LinkNode *header = malloc(sizeof(struct LinkNode));
	header->data = -1;//头节点
	header->next = NULL;

	//尾部指针
	struct LinkNode *pRear = header;

	int val = -1;
	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;


void InsertByValue_LinkList(struct LinkNode *header, int oldval, int newval)

	if (NULL == header)
	
		return;
	

	//两个辅助变量指针

	struct LinkNode *pPrev = header;
	struct LinkNode *pCurrent = pPrev->next;//为后一个指针

	while (pCurrent!=NULL)
	
		if (pCurrent->data == oldval)
		
			break;
		

		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	

	//先创建节点
	struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
	newnode->data = newval;
	newnode->next = NULL;

	//插入数据到链表
	pPrev->next = newnode;
	newnode->next = pCurrent;


//删除值为val的结点
void RemoveByValue_LinkList(struct LinkNode *header, int delValue)

	if (NULL == header)
	
		return;//不执行下面
	

	//两个辅助指针变量
	struct LinkNode *pPrev = header;
	struct LinkNode *pCurrent = pPrev->next;

	while (pCurrent != NULL)
	
		if (pCurrent->data == delValue)
		
			//删除操作
			pPrev->next = pCurrent->next;
			free(pCurrent);
			pCurrent = NULL;
		
		//删除了,pCurrent就为空,指针就不能后移
		if (NULL == pCurrent)
		
			return;
		
		
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	



//销毁
void Destroy_LinkList(struct LinkNode *header)

	if (NULL == header)
	
		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 (NULL == header)
	
		return;
	


	//辅助指针变量
	struct LinkNode *pCurrent = header->next;

	while (pCurrent != NULL)
	

		//先保存下当前结点的下一个节点地址
		struct LinkNode *pNext = pCurrent->next;

		//释放当前结点内存
		free(pCurrent);

		//pCurrent指向下一个节点
		pCurrent = pNext;

	

	header->next = NULL;



//遍历
void Foreach_LinkList(struct LinkNode *header)

	if (NULL == header)
	
		return;
	

	struct LinkNode *pPrint = header->next;
	while (pPrint!= NULL)
	
		printf("%d   ", pPrint->data);
		pPrint = pPrint->next;
	
	printf("\\n");





3.建立一个测试文件:TestLinkList.c

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

void test()

	//初始化链表
	struct LinkNode *header = Init_LinkList();
	//打印输出
	Foreach_LinkList(header);
	//插入数据
	InsertByValue_LinkList(header,20,100);

	Foreach_LinkList(header);
	//删除节点
	RemoveByValue_LinkList(header,10);
	printf("删除操作\\n");
	Foreach_LinkList(header);
	//清空
      Clear_LinkList(header);
	//销毁
     Destroy_LinkList(header);
	

int main()
	test();
	system("pause");
	return EXIT_SUCCESS;

4.检查结果

以上是关于C语言链表写法,练习链表的主要内容,如果未能解决你的问题,请参考以下文章

C语言复习——指针 链表 与 文件操作

链表(list)的实现(c语言)

经典算法_链表

数据结构-链表

go语言 链表练习

C语言的指针链表的原理和各类操作