目录
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的 。
- #pragma once
- #include<stdio.h>
- #include<stdlib.h>
- #include<assert.h>
-
- typedef int SLTDataType;
-
- typedef struct SListNode
- {
- SLTDataType data;//数据
- struct SListNode* next;//下一个节点
- }SLTNode;
-
- void SListPrint(SLTNode** pphead);//打印链表
- void SListDestroy(SLTNode** pphead);//释放链表
- void SListPushFront(SLTNode** pphead, SLTDataType x);//头插
- void SListPushBack(SLTNode** pphead, SLTDataType x);//尾插
- void SListPopFront(SLTNode** pphead);//头删
- void SListPopBack(SLTNode** pphead);//尾删
- SLTNode* SListFind(SLTNode** pphead, SLTDataType x);//查找指定的值,返回地址
- void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDataType x);//在 pos 后插入数据
- void SListEraseAfter(SLTNode** pphead, SLTNode* pos);//删除 pos 的后一个数据
- #include"SList.h"
-
- void SListPrint(SLTNode** pphead)//打印链表
- {
- assert(pphead);
-
- SLTNode* cur = *pphead;
- while (cur)
- {
- printf("%d ", cur->data);
- cur = cur->next;
- }
- printf("\n");
- }
-
- void SListDestroy(SLTNode** pphead)//释放链表
- {
- assert(pphead);
-
- SLTNode* cur = *pphead;
- while (cur)
- {
- SLTNode* del = cur;//保存当前节点
- cur = cur->next;
- free(del);
- del = NULL;
- }
- *pphead = NULL;
- }
-
- SLTNode* BuySLTNode(SLTDataType x)//创建新节点
- {
- SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
- assert(newnode);//判断是否开辟空间失败
- newnode->next = NULL;
- newnode->data = x;
- return newnode;
- }
-
- void SListPushFront(SLTNode** pphead, SLTDataType x)//头插
- {
- assert(pphead);
-
- SLTNode* newnode = BuySLTNode(x);
- newnode->next = *pphead;
- *pphead = newnode;
- }
-
- void SListPushBack(SLTNode** pphead, SLTDataType x)//尾插
- {
- assert(pphead);
-
- SLTNode* newnode = BuySLTNode(x);
-
- //当链表为空时,新节点即为头节点
- if (*pphead == NULL)
- {
- *pphead = newnode;
- return;
- }
-
- //当链表不为空,找到最后一个节点
- SLTNode* cur = *pphead;
- while (cur->next)
- {
- cur = cur->next;
- }
- cur->next = newnode;
- }
-
- void SListPopFront(SLTNode** pphead)//头删
- {
- assert(pphead);
- if (*pphead == NULL)
- return;
-
- SLTNode* del = *pphead;//保存头结点
- *pphead = (*pphead)->next;//更改头节点为下一个节点
- free(del);//删除头结点
- del = NULL;
- }
-
- void SListPopBack(SLTNode** pphead)//尾删
- {
- assert(pphead);
- SLTNode* cur = *pphead;
-
- if (cur == NULL)
- return;
-
- //当只有一个节点时,直接调用头删
- if (cur->next == NULL)
- {
- SListPopFront(pphead);
- return;
- }
-
- //当有多个节点时,需找倒数第二个节点
- while (cur->next->next != NU