数据结构:单向链表,实现尾插尾删,头插头删,查找,在某个位置后插入删除

#define _CRT_SECURE_NO_WARNINGS 1

#include "SList.h"

TestSList()

{

//SListNode* phead = NULL;

SListNode* pList = NULL;//给一个初始结点

SListPushBack(&pList, 1);

SListPushBack(&pList, 2);

SListPushBack(&pList, 3);

SListPushBack(&pList, 4);

SListPrint(pList);

SListPopBack(&pList);

SListPopBack(&pList);

SListPopBack(&pList);

SListPopBack(&pList);

SListPopBack(&pList);

SListPrint(pList);

SListPushFront(&pList, 1);

SListPushFront(&pList, 2);

SListPushFront(&pList, 3);

SListPushFront(&pList, 4);

SListPushFront(&pList, 5);

SListPrint(pList);

SListPopFront(&pList);

SListPopFront(&pList);

SListPrint(pList);

SListNode* pos = SListFind(pList, 2);

if (pos)

{

pos->data = 20;

}

SListPrint(pList);

SListInsertAfter(pos,8);

SListPrint(pList);

SListEraseAfter(pos);

SListPrint(pList);

}

int main()

{

TestSList();

return 0;

}

#pragma once

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

typedef int SListDataType;

//创建一个结点

typedef struct SListNode

{

//int data;

SListDataType data;

struct SListNode* next;//创建一个指针存下一个结点的地址

}SListNode;

//打印

void SListPrint(SListNode* phead);

//尾插尾删

void SListPushBack(SListNode** pphead, SListDataType x);

void SListPopBack(SListNode** pphead);

//头插头删

void SListPushFront(SListNode** pphead, SListDataType x);

void SListPopFront(SListNode** pphead);

//查找某一个数

//找到返回下标

SListNode* SListFind(SListNode* phead, SListDataType x);

//在指定位置后面插入,删除

void SListInsert(SListNode** pphead, SListDataType x);

void SListInsertAfter(SListNode* pos);

#define _CRT_SECURE_NO_WARNINGS 1

#include "SList.h"

void SListPrint(SListNode* phead)

{

SListNode* cur = phead;

while (cur != NULL)

{

printf("%d->", cur->data);

cur = cur->next;//找到下一个结点的地址

}

printf("NULL\n");

}

SListNode* BuySListNode(SListDataType x)

{

//创建一个新结点

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

//判断申请结点是否成功

if (newNode == NULL)

{

printf("申请结点失败\n");

exit(-1);

}

newNode->data = x;

newNode->next = NULL;

return newNode;

}

void SListPushBack(SListNode** pphead, SListDataType x)

{

SListNode* newNode = BuySListNode(x);

if (*pphead == NULL)

{

//将值存进去

*pphead = newNode;

}

else

{

SListNode* tail = *pphead;

//先找到尾

//SListNode* tail = *pphead;

while (tail->next != NULL)

{

tail = tail->next;

}

tail->next = newNode;

}

}

void SListPopBack(SListNode** pphead)

{

//1.0个结点

//2.1个结点

//3.多个结点

if (*pphead == NULL)

{

return;

}

else if ((*pphead)->next==NULL)

{

free(*pphead);

*pphead = NULL;

}

else

{

SListNode* prev = NULL;

SListNode* tail = *pphead;

//先找到尾

//SListNode* tail = *pphead;

while (tail->next != NULL)

{

prev = tail;

tail = tail->next;

}

free(tail);//tail是局部变量,所以不用置为空

prev->next = NULL;

}

}

void SListPushFront(SListNode** pphead, SListDataType x)

{

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

SListNode* next = *pphead;

newNode->data = x;

*pphead = newNode;

newNode->next = next;

}

void SListPopFront(SListNode** pphead)

{

//1.空

//2.一个结点 + 3.一个以上结点

if (*pphead == NULL)

{

return;

}

else

{

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

free(*pphead);

(*pphead) = next;

}

}

SListNode* SListFind(SListNode* phead, SListDataType x)

{

SListNode* cur = phead;

while (cur != NULL)

{

if (cur->data == x)

{

return cur;

}

cur = cur->next;

}

//找不到

return NULL;

}

void SListInsertAfter( SListNode* pos, SListDataType x)

{

assert(pos);

SListNode* newNode = BuySListNode(x);

newNode->next = pos->next;

pos->next = newNode;

}

void SListEraseAfter(SListNode* pos)

{

assert(pos);

if (pos)

{

SListNode* next = pos->next;

SListNode* nextnext = next->next;

pos->next = nextnext;

free(next);

}

}

相关推荐
沐苏瑶32 分钟前
Java 搜索型数据结构全解:二叉搜索树、Map/Set 体系与哈希表
java·数据结构·算法
ccLianLian1 小时前
深度学习·DDPM
数据结构
云泽8082 小时前
深入 AVL 树:原理剖析、旋转算法与性能评估
数据结构·c++·算法
ZoeJoy86 小时前
算法筑基(一):排序算法——从冒泡到快排,一文掌握最经典的排序算法
数据结构·算法·排序算法
承渊政道6 小时前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio
承渊政道7 小时前
【优选算法】(实战推演模拟算法的蕴含深意)
数据结构·c++·笔记·学习·算法·leetcode·排序算法
历程里程碑9 小时前
Protobuf 环境搭建:Windows 与 Linux 系统安装教程
linux·运维·数据结构·windows·线性代数·算法·矩阵
代码探秘者9 小时前
【算法】吃透18种Java 算法快速读写模板
数据结构·数据库·python·算法·spring
WolfGang00732110 小时前
代码随想录算法训练营 Day21 | 回溯算法 part03
数据结构·算法
深邃-10 小时前
数据结构-队列
c语言·数据结构·c++·算法·html5