单向链表功能编写及测试

#pragma once

#include<stdio.h>

#include<Windows.h>

#include<assert.h>

#include<stdlib.h>

 

typedef int DataType;

typedef struct SListNode

{

DataType data;

struct SListNode *pNext;

}SListNode;

 

 

//初始化

void SListNodeInit(SListNode **SL)

{

assert(SL);

*SL= NULL;

}

 

//按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL

SListNode *SListNodeFind(SListNode *SL,DataType data)

{

SListNode *pNode = SL;

while (pNode)

{

if (pNode->data == data)

{

return pNode;

}

pNode = pNode->pNext;

}

return NULL;

}

 

 

//尾插:申请空间(data=datapNext=NULL),找到倒数第一个,倒数第一个的pNEXT=NULL

void SListNodePushBack(SListNode **SL, DataType data)

{

assert(SL);

SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));

assert(pNewNode);

pNewNode->data = data;

pNewNode->pNext = NULL;

if (*SL == NULL)

{

*SL = pNewNode;

}

SListNode *pNode = *SL;

while (pNode->pNext)

{

pNode = pNode->pNext;

}

pNode->pNext = pNewNode;

pNewNode->pNext = NULL;

}

 

//头插

void SListNodePushFront(SListNode **SL, DataType data)

{

assert(SL);

SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));

assert(pNewNode);

pNewNode->data = data;

pNewNode->pNext = NULL;

if (*SL == NULL)

{

SListNodePushBack(SL, data);

}

pNewNode->pNext = *SL;

*SL = pNewNode;

}

 

//给定节点插入

void SListNodePushInsert(SListNode **SL,SListNode *Pos ,DataType data)

{

assert(*SL&&Pos);

SListNode *pNode=*SL;

if(Pos == *SL){

SListNodePushFront(SL,data);

return;

}

else

{

while (pNode->pNext != Pos){

pNode = pNode->pNext;

}

SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));

assert(pNewNode);

pNewNode->data = data;

pNewNode->pNext = Pos;

pNode->pNext = pNewNode;

}

}

 

//尾部删除

void SListNodePopBack(SListNode **SL)

{

assert(*SL);

assert(SL);

if ((*SL)->pNext == NULL)

{

free(*SL);

*SL = NULL;

}

SListNode *pNode = *SL;

while (pNode->pNext->pNext !=NULL)

{

pNode = pNode->pNext;

}

pNode->pNext = NULL;

free(pNode->pNext);

}

 

//头删:

void SListNodePopFront(SListNode **SL)

{

assert(SL);

assert(*SL);

SListNode *pNode = *SL;

*SL = (*SL)->pNext;

free(pNode);

}

 

//给定节点删除

void SListNodeErase(SListNode **SL, SListNode *Pos)

{

assert(SL);

assert(*SL);

if (*SL == Pos)

{

SListNodePopFront(SL);

return;

}

SListNode *pNode = *SL;

while (pNode->pNext != Pos)

{

pNode = pNode->pNext;

}

pNode->pNext = Pos->pNext;

free(Pos);

}

 

//按值删除遇到的第一个

void SListNodeRemove(SListNode **SL,DataType data)

{

assert(SL);

assert(*SL);

SListNode *pNode = SListNodeFind(*SL,data);

if (pNode)

{

SListNodeErase(SL,pNode);

}

}

 

//按值删除所有

void SListNodeRemoveAll(SListNode **SL, DataType data)

{

assert(SL);

assert(*SL);

SListNode *pNode=*SL;

SListNode *next=NULL;

while (pNode->pNext)

{

if (pNode->data == data){

 

//替换法删除

next = pNode->pNext;

pNode->pNext =next->pNext;

pNode->data = next->data;

free(next);

}

pNode = pNode->pNext;

}

if ((*SL)->data == data)

{

SListNodePopFront(SL);

}

}

 

 

//销毁

void SListNodeDestroy(SListNode **SL)

{

SListNode *pNode, *pNext;

pNode = *SL;

pNext = pNode->pNext;

while (pNode != NULL){

pNode = pNode->pNext;

free(pNode);

pNode = pNext;

}

*SL= NULL;

}

 

//打印链表

void SListNodePrint(SListNode *SL)

{

assert(SL);

SListNode *pNode;

for (pNode = SL; pNode; pNode = pNode->pNext)

{

printf("%d->", pNode->data);

}

printf("NULL");

printf("\n");

}

 

 

 

 

//测试

void test()

{

SListNode *SL;

SListNodeInit(&SL);

//尾插

SListNodePushBack(&SL, 3);

SListNodePushBack(&SL, 4);

SListNodePushBack(&SL, 5);

SListNodePushBack(&SL, 6);

SListNodePrint(SL);

 

//头插

SListNodePushFront(&SL,2);

SListNodePushFront(&SL,1);

SListNodePrint(SL);

 

//给定节点位置插入

SListNode *pNode = SListNodeFind(SL,3);

SListNodePushInsert(&SL,pNode,5);

SListNodePrint(SL);

 

//尾删

SListNodePopBack(&SL);

SListNodePrint(SL);

 

//头删

SListNodePopFront(&SL);

SListNodePrint(SL);

//给定节点删除

SListNodeErase(&SL,pNode);

SListNodePrint(SL);

 

//给定值删除遇到的第一个

SListNodeRemove(&SL, 3);

SListNodePrint(SL);

 

 

//给定值删除所有

SListNodeRemoveAll(&SL,5);

SListNodePrint(SL);

}

猜你喜欢

转载自blog.csdn.net/sd116460/article/details/80954124