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

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

}

}

相关推荐
铅笔小新z6 分钟前
【C语言—数据结构】8种高效排序算法:从入门到实战
数据结构·算法·排序算法
Yolo_TvT8 分钟前
数据结构:双链表
网络·数据结构
geekmice9 分钟前
在单线程环境下,同一个 Service 中多个方法需要复用某个 List
数据结构·windows·list
sin_hielo23 分钟前
leetcode 2141
数据结构·算法·leetcode
明洞日记27 分钟前
【数据结构手册005】树结构入门 - 从二叉树到层次智慧
网络·数据结构·c++
youngee1128 分钟前
hot100-39二叉树层序遍历
数据结构·算法
杰克尼34 分钟前
蓝桥云课-小蓝做题
java·数据结构·算法
卿雪34 分钟前
MySQL【索引】篇:索引的分类、B+树、创建索引的原则、索引失效的情况...
java·开发语言·数据结构·数据库·b树·mysql·golang
_OP_CHEN40 分钟前
算法基础篇:(二十二)数据结构之单调队列:滑动窗口问题的 “最优解” 神器
数据结构·c++·算法·蓝桥杯·算法竞赛·单调队列·acm/icpc
Lenyiin41 分钟前
02.05、链表求和
数据结构·c++·算法·leetcode·链表