目录
[1.1 实现单链表](#1.1 实现单链表)
[1.1.1 文件创建](#1.1.1 文件创建)
[1.1.2 链表功能了解](#1.1.2 链表功能了解)
[1.1.3 链表的结点](#1.1.3 链表的结点)
[1.1.4 链表的函数声明](#1.1.4 链表的函数声明)
[1.1.5 链表功能的实现](#1.1.5 链表功能的实现)
链表是一种链式结构,物理结构不连续,逻辑结构是连续的,在计算机中链表的实际存储是按照一个结点内存放下一个结点的地址来实现链接的
1.单链表
单链表也称不带头无循环单向链表
链表的概念相信大家都了解,说的再多不如自己实现一个链表来的理解深入
我们现在开始手搓一个单链表出来
1.1 实现单链表
1.1.1 文件创建
首先我们创建一个头文件slist.h,用来包含头文件和函数的声明
再创建一个源文件slist.c,用来函数的实现
最后创建一个main.c来测试我们的单链表功能
这样我们的代码耦合性会更高,以后哪里需要单链表去完成什么功能直接使用当前的文件就可以了
好了!现在我们可以开始愉快的写代码了
1.1.2 链表功能了解
- 单链表的申请元素
- 单链表的初始化
- 单链表的头部插入删除
- 单链表的尾部插入删除
- 单链表的pos位置之后的插入删除
- 单链表的打印元素
好了了解这些功能建议不要立即去抄代码,而是自己带着功能去自己试着实现,这样理解的更深刻
1.1.3 链表的结点
单链表只保存下一个结点的地址,所以结点是很简单的
cpp
#pragma once
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SListNodeDataType; //将需要存入链表的元素类型typedef,代码耦合性变低
typedef struct SListNode //将链表结点类型typedef为Slist
{
SListNodeDataType _val; //链表保存的数据
struct SListNode* _next;//链表的下一个结点的地址
}SList;
1.1.4 链表的函数声明
cpp
SList* CreateSLNode(SListNodeDataType val); //创建新结点
void SListPushBack(SList** st, SListNodeDataType val);//尾插
void SListPopBack(SList** st);//尾删
void SListPushFront(SList** st, SListNodeDataType val);//头插
void SListPopFront(SList** st);//头删
void SListInsert(SList** pos, SListNodeDataType val);//pos位置之后的插入
void SListErase(SList** pos);//pos位置之后的删除
void SListPrint(SList* st);//打印链表元素
这些都是存放在slist.h中的
将函数的实现放在slist.c中
1.1.5 链表功能的实现
cpp
#include"slist.h"
SList* CreateSLNode(SListNodeDataType val)
{
SList* newNode = (SList*)malloc(sizeof(SList));
assert(newNode);
newNode->_next = NULL;
newNode->_val = val;
return newNode;
}
void SListPushBack(SList** st, SListNodeDataType val)
{
if (*st == NULL)
{
*st = CreateSLNode(val);
return;
}
SList* cur = *st;
while (cur->_next)
{
cur = cur->_next;
}
cur->_next = CreateSLNode(val);
}
void SListPopBack(SList** st)
{
assert(*st);
SList* cur = *st;
SList* prev = *st;
while (cur->_next)
{
prev = cur;
cur = cur->_next;
}
free(cur);
prev->_next = NULL;
}
void SListPushFront(SList** st, SListNodeDataType val)
{
SList* newNode = CreateSLNode(val);
newNode->_next = *st;
*st = newNode;
}
void SListPopFront(SList** st)
{
assert(*st);
SList* cur = *st;
*st = cur->_next;
free(cur);
}
void SListInsert(SList** pos, SListNodeDataType val)
{
assert(*pos);
SList* newNode = CreateSLNode(val);
SList* cur = *pos;
newNode->_next = cur->_next;
cur->_next = newNode;
}
void SListErase(SList** pos)
{
assert(*pos);
SList* cur = *pos;
SList* tmp = cur->_next;
if (cur->_next)
{
cur->_next = cur->_next->_next;
}
free(tmp);
}
void SListPrint(SList* st)
{
SList* cur = st;
while (cur)
{
printf("%d ", cur->_val);
cur = cur->_next;
}
printf("\n");
}