目录

零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)

一.单链表的实现与销毁 

        1.1 节点的定义

        1.2 单链表的尾插

        1.3 单链表的头插

        1.4 单链表的尾删

        1.5 单链表的头删 

        1.6 单链表的查找

        1.7 在指定位置之前插入数据

        1.8 在指定位置之后插入数据

        1.9 删除指定位置的数据

        1.10 删除指定位置之后的数据

        1.11 销毁单链表 

二. 单链表源码

SingleList.h

SingleList.c 

零.必备知识

1.一级指针 && 二级指针

2. 节点的成员列表

    a.数据

    b.指向下一个节点的指针.

3. 动态内存空间的开辟 (malloc-calloc-realloc)

一.单链表的实现与销毁 

注:具体解释都在代码的注释中!(在代码中具体分析)

        1.1 节点的定义

        1.2 单链表的尾插

 

        1.3 单链表的头插

 

        1.4 单链表的尾删

        1.5 单链表的头删 

        1.6 单链表的查找

        1.7 在指定位置之前插入数据

        1.8 在指定位置之后插入数据

        

 

        1.9 删除指定位置的数据

        1.10 删除指定位置之后的数据

        1.11 销毁单链表 

二. 单链表源码

SingleList.h

#define _CRT_SECURE_NO_WARNINGS

#pragma once

#include

#include

#include

// 节点的定义

typedef int SLTDateType;

typedef struct SingleListNode

{

SLTDateType date;

struct SingleListNode* next;

}SLTNode;

// 单链表的展示

void SLTPrint(SLTNode* phead);

// 单链表的尾插

void SLTPushBack(SLTNode** pphead, SLTDateType x);

// 单链表的头插

void SLTPushFront(SLTNode** pphead, SLTDateType x);

// 单链表的尾删

void SLTPopBack(SLTNode** pphead);

// 单链表的头删

void SLTPopFront(SLTNode** pphead);

// 单链表的查找

SLTNode* SLTFind(SLTNode* phead, SLTDateType x);

// 在指定位置之前插入数据

void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x);

// 在指定位置之后插入数据

void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x);

// 删除指定位置的数据

void SLTErase(SLTNode** pphead, SLTNode* pos);

// 删除指定位置之后的数据

void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);

// 销毁单链表

void SLTDestroy(SLTNode** pphead);

SingleList.c 

#define _CRT_SECURE_NO_WARNINGS

#include "SingleList.h"

// 单链表的展示

void SLTPrint(SLTNode* phead)

{

SLTNode* pcur = phead; //current 当前的,现在的 currect 正确的

while (pcur != NULL) {

printf("%d->", pcur->date);

pcur = pcur->next;

}

printf("NULL\n");

}

// 节点的创造

SLTNode* SLTCreat(SLTDateType x)

{

SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode));

if (newNode == NULL) {

printf("创建失败!\n");

exit(1);

}

newNode->date = x;

newNode->next = NULL;

return newNode;

}

// 单链表的尾插

void SLTPushBack(SLTNode** pphead, SLTDateType x)

{

assert(pphead);

// 创建节点

SLTNode* newNode = SLTCreat(x);

// 没有节点

if ((*pphead) == NULL) {

(*pphead) = newNode;

}

else { // 有一个或多个节点

SLTNode* pcur = (*pphead);

while (pcur->next != NULL) {

pcur = pcur->next;

}

pcur->next = newNode;

}

}

// 单链表的头插

void SLTPushFront(SLTNode** pphead, SLTDateType x)

{

assert(pphead);

SLTNode* pcur = (*pphead);

// 创建节点

SLTNode* newNode = SLTCreat(x);

// 没有节点

if ((*pphead) == NULL) {

(*pphead) = newNode;

}

else { // 有一个或者多个节点

newNode->next = (*pphead);

(*pphead) = newNode;

}

}

// 单链表的尾删

void SLTPopBack(SLTNode** pphead)

{

assert(pphead && (*pphead));

SLTNode* pcur = (*pphead);

SLTNode* prev = (*pphead);

// 只有一个节点

if (pcur->next == NULL) {

free(*pphead);

(*pphead) = NULL;

pcur = NULL;

prev = NULL;

}

else { // 有多个节点

while (pcur->next != NULL) {

prev = pcur;

pcur = pcur->next;

}

free(pcur);

pcur = NULL;

prev->next = NULL;

}

}

// 单链表的头删

void SLTPopFront(SLTNode** pphead)

{

assert(pphead && (*pphead));

SLTNode* pcur = (*pphead);

// 只有一个节点

if (pcur->next == NULL) {

free(*pphead);

(*pphead) = NULL;

pcur = NULL;

}

else { //有多个节点

(*pphead) = (*pphead)->next;

free(pcur);

pcur = NULL;

}

}

// 单链表的查找

SLTNode* SLTFind(SLTNode* phead, SLTDateType x)

{

SLTNode* pcur = phead;

while (pcur != NULL) {

if (pcur->date == x) {

printf("找到了!\n");

return pcur;

}

pcur = pcur->next;

}

printf("找不到!\n");

return NULL;

}

// 在指定位置之前插入数据

void SLTInsertBefore(SLTNode** pphead, SLTNode* pos, SLTDateType x)

{

assert(pphead);

SLTNode* pcur = (*pphead);

// 创建节点

SLTNode* newNode = SLTCreat(x);

// 头插

if (pos == (*pphead) || (*pphead) == NULL) {

SLTPushFront(pphead, x);

}

else { //正常插入

while (pcur->next != NULL) {

if (pcur->next == pos) {

newNode->next = pcur->next;

pcur->next = newNode;

break;

}

pcur = pcur->next;

}

}

}

// 在指定位置之后插入数据

void SLTInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x)

{

assert(pphead);

// 创建节点

SLTNode* newNode = SLTCreat(x);

if ((*pphead) == NULL || pos == (*pphead)) {

// 尾插

SLTPushBack(pphead, x);

}

else { //正常插入

SLTNode* pcur = (*pphead);

while (pcur->next != NULL) {

if (pcur == pos) {

newNode->next = pcur->next;

pcur->next = newNode;

break;

}

pcur = pcur->next;

}

}

}

// 删除指定位置的数据

void SLTErase(SLTNode** pphead, SLTNode* pos)

{

assert(pphead && (*pphead));

// 处理特殊情况(头删)

if ((*pphead) == pos) {

SLTPopFront(pphead);

}

else {

SLTNode* prev = (*pphead);

SLTNode* pcur = (*pphead);

while (pcur != NULL) {

if (pcur == pos) {

prev->next = pcur->next;

free(pcur);

pcur = NULL;

prev = NULL;

break;

}

prev = pcur;

pcur = pcur->next;

}

}

}

// 删除指定位置之后的数据

void SLTEraseAfter(SLTNode** pphead, SLTNode* pos)

{

assert(pphead && (*pphead));

SLTNode* pcur = (*pphead);

while (pcur->next != NULL) {

if (pcur == pos) {

SLTNode* tmp = pcur->next;

pcur->next = pcur->next->next;

free(tmp);

tmp = NULL;

break;

}

pcur = pcur->next;

}

}

// 销毁单链表

void SLTDestroy(SLTNode** pphead)

{

assert(pphead && (*pphead));

SLTNode* pcur = (*pphead);

SLTNode* prev = (*pphead);

while (pcur != NULL) {

prev = pcur;

pcur = pcur->next;

free(prev);

}

prev = NULL;

(*pphead) = NULL;

}

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: