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

#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);

}

}

相关推荐
shinelord明3 分钟前
【大数据技术实战】Kafka 认证机制全解析
大数据·数据结构·分布式·架构·kafka
让我们一起加油好吗21 分钟前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs
草莓工作室35 分钟前
数据结构3:线性表2-顺序存储的线性表
数据结构·windows
1白天的黑夜11 小时前
递归-24.两两交换链表中的节点-力扣(LeetCode)
数据结构·c++·leetcode·链表·递归
1白天的黑夜12 小时前
递归-206.反转链表-力扣(LeetCode)
数据结构·c++·leetcode·链表·递归
靠近彗星2 小时前
3.1 栈
数据结构·算法
sulikey2 小时前
一文彻底理解:如何判断单链表是否成环(含原理推导与环入口推算)
c++·算法·leetcode·链表·floyd·快慢指针·floyd判圈算法
孤廖3 小时前
吃透 C++ 栈和队列:stack/queue/priority_queue 用法 + 模拟 + STL 标准实现对比
java·开发语言·数据结构·c++·人工智能·深度学习·算法
豆沙沙包?4 小时前
2025年--Lc197-077. 排序链表(链表,尾插法)--Java版
java·数据结构·链表
2201_758875444 小时前
LeetCode:19. 删除链表的倒数第 N 个结点
算法·leetcode·链表