一:单链表
(1)基本结构:
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data; //存储的数据
struct SListNode* next; //下一个节点的指针
}SLTNode;
(2)特性:
物理结构:非线性 逻辑结构:线性
(3)单链表的基本功能以及实现
初始化与删除:void SListInit(SLTNode** pphead) ; vodi SListDestroy(SLTNode** pphead).
初始化:由于在进行初始化时要对于节点本身进行修改,所以我们要使用二级指针进行传参,以便可以去修改实参。
删除:对链表进行删除时,要对节点的空间进行一个一个的释放,也要传二级指针。在进行链表的删除时,从前往后逐次对节点的空间进行释放。
插入
PS:在进行插入时,创建新节点的步骤重复率高,可以单独写一个创建新节点的函数,简略代码。
SLTNode* NewNode(SLTDataType x)
void SListFrontPush(SLTNode** pphead , SLDataType x); (头插)
在进行头插时,头结点的位置一直在改变,故传参也要二级指针,在进行插入时,要注意判断链表是否为空。
void SListBackPush(SLTNode** pphead ,SLDataType x); (尾插)
在进行尾插时,头结点在链表为空的情况下,也要改变头结点的位置,故而也要传参二级指针
void SListPush(SLTNode* phead ,SLTNode* pure ,SLDataType x); (任意位置插入)(要分前后)
在进行任意位置时,可以自定义一个函数进行获取该数据的地址
SLTNode* SLTNSituation(SLTNode* phead, SLTNode* pure,SLTDataType x)
在其之前进行插入:
在其之后进行插入:
删除:
void SListFrontDes(SLTNode** pphead ); (头删)
在进行头删时,头结点的位置会一直在变化,所以依旧需要传递二级指针
voidSListBackDes(SLTNode* phead); (尾删)
void SListDes(SLTNode* phead ,SLTNode* p ); (任意位置删除)
二:队列
概念:以链表为基础的一种数据结构,遵循“先进先出”的原则。
typedef int QueueDataType;
typedef struct QListNode
{
QueueDataType val;
struct QueueNode* next;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* phead; //方便找尾节点,降低时间复杂度
QNode* ptail;
int size; //记录链表长度
}Queue;
队列的基本操作:
初始化与删除
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
出队列与入队列
void QueuePush(Queue* pq, QueueDataType x);
void QueuePop(Queue* pq);
出头节点与尾节点
QueueDataType QueueFront(Queue* pq); 返回该节点的数据
QueueDataType QueueBack(Queue* pq);
判断是否为空
bool QueueEmpty(Queue* pq);
打印队列
void QueuePrintf(Queue* pq);