c::单链表的实现(值得一看)

关于单链表的实现,我就不啰嗦了,直接上代码大笑

1、头文件

#ifndef __TEST__
#define __TEST__
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
	DataType data; //存储的数据
	struct Node* pNext; //指向下一个节点
}Node,*PNode;
//初始化链表
void InitList(PNode* pHead);
//尾插
void PushBack(PNode* pHead, DataType data);
//尾删
void PopBack(PNode* pHead);
//头插
void PushFront(PNode* pHead, DataType data);
//头删
void PopFront(PNode* pHead);
//找特定的节点
PNode Find(PNode pHead, DataType data);
//插入一个节点
void Insert(PNode pos, DataType data);
//申请一个节点
PNode BuyNode(DataType data);
//打印链表
void PrintList(PNode pHead);
//从尾到头打印单链表
void Print(PNode pHead);


2、各模块函数的实现

#include"test.h"
//初始化链表
void InitList(PNode* pHead)
{
	*pHead = NULL;
}
//申请一个节点
PNode BuyNode(DataType data)
{
	PNode pNewnode = (PNode)malloc(sizeof(Node));
	if(pNewnode)
	{
		pNewnode->data = data;
		pNewnode->pNext = NULL;
	}
	return pNewnode;
}
//打印链表
void PrintList(PNode pHead)
{
	PNode pCur = pHead;
	if(pHead == NULL)
	{
		printf("链表为空,无法打印!");
	}
	else
	{
		while(pCur != NULL)
		{
			printf("%d->",pCur->data);
			pCur = pCur->pNext;
		}
		printf("\n");
	}
}
//尾插
void PushBack(PNode* pHead, DataType data)
{ 
	Node* pRet = *pHead;
	assert(pHead);
	if(*pHead == NULL)        //先进行链表的判空
	{
		*pHead = BuyNode(data);
	}
	else
	{
		while(pRet->pNext != NULL)
		{
			pRet = pRet->pNext;        //找最后一个节点
		}
		pRet->pNext = BuyNode(data);
	}
}
//尾删
void PopBack(PNode* pHead)
{
	Node *pCur = *pHead;
	assert(pHead);
	//注意PopBack有三种情况
	if(*pHead == NULL)     //链表为空
	{
		printf("单链表为空,不能删除!");
	}
	else if((*pHead)->pNext == NULL)   //头节点的下一个节点为空
	{
		free(*pHead);
		*pHead = NULL;
	}
	else                
	{
		PNode pCur = *pHead;
		PNode pPre = pCur;
		while(pCur->pNext != NULL)
		{
			pPre = pCur;
			pCur = pCur->pNext;
		}
		free(pCur);
		pPre->pNext = NULL;
	}
}
//头插
void PushFront(PNode* pHead, DataType data)
{
	Node *pCur = BuyNode(data);
	assert(pHead);
	if(*pHead == NULL)            //链表为空
	{
		*pHead = BuyNode(data);
	}
	else
	{                             
		pCur->pNext = *pHead;   //将申请的新节点的下一节点指向头节点
		*pHead = pCur;          //将新节点作为新的头节点
	}
}
//头删
void PopFront(PNode* pHead)
{
	PNode pCur = *pHead;
	assert(pHead);
	if(*pHead == NULL)
	{
		printf("单链表为空,无法删除!");
	}
	else if((*pHead)->pNext == NULL)
	{
		free(*pHead);            
		*pHead = NULL;
		/*PopBack(pHead);*/
	}
	else
	{
		*pHead = (*pHead)->pNext;   //注意这块是先将头节点的下一个节点指过去,	                           
		free(pCur);	             //不然就会找不到头节点了
	}
}
//找特定的节点
PNode Find(PNode pHead, DataType data)
{
	PNode pCur = pHead;
	while(pCur)
	{
		if(pCur->data == data)
		{
			return pCur;
		}
		pCur = pCur->pNext;
	}
	return NULL;
}
//插入一个节点
void Insert(PNode pos, DataType data)
{
	PNode pRet = BuyNode(data);
	if(pos == NULL)
	{
		return;
	}
	pRet->pNext = pos->pNext;
	pos->pNext = pRet;
}

//从尾到头打印单链表
void Print(PNode pHead)
{
	if(pHead != NULL)
	{
		Print(pHead->pNext);
		printf("%d ",pHead->data);
	}
}
//从尾到头打印单链表
void Print(PNode pHead)
{
	if(pHead != NULL)
	{
		Print(pHead->pNext);
		printf("%d ",pHead->data);
	}
}



 

3、测试函数

#include"test.h"
//尾插尾删
void Funtest1()
{
	PNode pHead;
	InitList(&pHead);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	PushBack(&pHead,4);
	PushBack(&pHead,5);
	PrintList(pHead);

	PopBack(&pHead);
	PopBack(&pHead);
	PopBack(&pHead);
	PrintList(pHead);

}
//测试头插头删
void Funtest2()
{
	PNode pHead;
	InitList(&pHead);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	PushBack(&pHead,4);
	PushBack(&pHead,5);
	PrintList(pHead);
	PopFront(&pHead);
	PrintList(pHead);
	//PushFront(&pHead, 8);
	//PrintList(pHead);
	
}
//测试在特定位置插入节点
void Funtest3()
{
	PNode pHead;
	InitList(&pHead);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	PushBack(&pHead,4);
	PushBack(&pHead,5);
	PrintList(pHead);

	Insert(Find(pHead,2),8);
	Insert(Find(pHead,3),8);
	PrintList(pHead);
}
//从尾到头打印链表
void Funtest10()
{
	PNode pHead;
	InitList(&pHead);
	PushBack(&pHead,1);
	PushBack(&pHead,2);
	PushBack(&pHead,3);
	PushBack(&pHead,4);
	PushBack(&pHead,5);
	PrintList(pHead);
	Print(pHead);
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值