链表复习

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>


//链表的结点类型定义
struct  LinkNode
{
	int data;
	struct LinkNode *next;
};


void test()
{
	struct LinkNode node1 = { 10, NULL };
	struct LinkNode node2 = { 20, NULL };
	struct LinkNode node3 = { 30, NULL };
	struct LinkNode node4 = { 40, NULL };
	struct LinkNode node5 = { 50, NULL };
	struct LinkNode node6 = { 60, NULL };
	
	node1.next = &node2;
	node2.next = &node3;
	node3.next = &node4;
	node4.next = &node5;
	node5.next = &node6;
	
	struct  LinkNode *pCurrent = &node1;

	while (pCurrent != NULL)
	{
		printf("%d", pCurrent->data);

		pCurrent = pCurrent->next;
	}






}


int main()
{

	test();
	system("pause");
	return EXIT_SUCCESS;
}

 

linklist.h

#pragma once
#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 delval);
	//遍历
	void Foreach_LinkList(struct LinkNode *header);
	//销毁
	void Destroy_LinkList(struct LinkNode *header);
	//清空
	void Clear_LinkList(struct LinkNode *header);
	//反转
	void Reverse_LinkList(struct LinkNode *header);


#ifdef __cplusplus
	}
#endif
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 

 linklist.c

#define _CRT_SECURE_NO_WARNINGS
#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 (1)
	{
		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;
	



}
//在值为oldval的后面插入一个新的数据newval
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;
	}
	//说明没找到 直接插入尾巴
	if (pCurrent == NULL)
	{
		//先创建新节点

		struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
		newnode->data = newval;
		newnode->next = NULL;
		//新节点插入链表中
		pPrev->next = newnode;

	}
	else{

		//先创建新节点

		struct LinkNode *newnode = malloc(sizeof(struct LinkNode));

		newnode->data = newval;
		newnode->next = NULL;
		//新节点插入链表中
		newnode->next = pCurrent;
		pPrev->next = newnode;

	}





}

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

	//两个辅助指针变量
	struct LinkNode *prev = NULL;
	struct LinkNode *pcur = header->next;
	struct LinkNode *pnext = NULL;




	while (pcur != NULL)
	{
	
		pnext = pcur->next;
		pcur->next= prev;
		prev = pcur;
		pcur = pnext;
	}

	header->next = prev;


}








//删除值为val的结点
void RemoveByValue_LinkList(struct LinkNode *header, int delval)
{
	if (NULL == header)
	{
		return;
	}

	//两个辅助指针变量
	struct LinkNode *pPrev = header;
	struct LinkNode *pCurrent = pPrev->next;
	
	while (pCurrent!=NULL)
	{
		if (pCurrent->data == delval)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}


	if (NULL == pCurrent)
	{
		return;
	}
	//删除
	pPrev->next = pCurrent->next;
	free(pCurrent);
	pCurrent = NULL;


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

	if (NULL == header)
	{
		return;
	}
	//辅助指针变量

	struct LinkNode *pcurrent = header->next;

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


}
//销毁
void Destroy_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}

	//辅助指针变量
	struct LinkNode *pCurrent = header;
	struct LinkNode *pNext = NULL;
	while (pCurrent!=NULL)
	{
		//先保存下一个节点地址
		pNext = pCurrent->next;
		free(pCurrent);
		pCurrent = pNext;
	}


}
//清空
void Clear_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}

	//辅助指针变量
	struct LinkNode *pCurrent = header->next;
	//先保存当前结点的下一个结点地址
	struct LinkNode *pNext = NULL;
	while (pCurrent!=NULL)
	{
		pNext = pCurrent->next;

		//释放当前结点内存
		free(pCurrent);
		//pcurrent 指向下一个节点
		pCurrent = pNext;

	}

	header->next = NULL;

}



test.c

#define _CRT_SECURE_NO_WARNINGS
#include "linklist.h"

void test()
{

	struct  LinkNode *header = Init_LinkList();
	Foreach_LinkList(header);
	InsertByValue_LinkList(header,22,18);
	printf("插入数据后=============================\n");
	Foreach_LinkList(header);
	Clear_LinkList(header);
	printf("清空后=============================\n");
	Foreach_LinkList(header);
	InsertByValue_LinkList(header, 22, 19);
	InsertByValue_LinkList(header, 22, 20);
	InsertByValue_LinkList(header, 22, 21);
	InsertByValue_LinkList(header, 22, 22);
	InsertByValue_LinkList(header, 22, 23);
	printf("重新插入后=============================\n");
	Foreach_LinkList(header);


	Reverse_LinkList(header);
	printf("反转链表后=============================\n");
	Foreach_LinkList(header);


	RemoveByValue_LinkList(header, 20);
	printf("删除后=============================\n");
	Foreach_LinkList(header);

	Destroy_LinkList(header);

	printf("销毁后=============================\n");
	//Foreach_LinkList(header);

}


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


}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值