做系统网站,湖南网站建设公司 在线磐石网络,92素材网,群晖wordpress连接外网教程目录
零.必备知识
1.一级指针 二级指针
2. 节点的成员列表 a.数据 b.指向下一个节点的指针.
3. 动态内存空间的开辟 (malloc-calloc-realloc)
一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…
目录
零.必备知识
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 stdio.h
#include stdlib.h
#include assert.h// 节点的定义
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;
}