关于单链表的实现,我就不啰嗦了,直接上代码
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);
}