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

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

}

}

相关推荐
code bean11 小时前
【C#】 `Channel<T>` 深度解析:生产者-消费者模式的现代解法
数据结构·c#
storyseek12 小时前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H12 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H13 小时前
数据结构与算法的通俗指南
数据结构·算法
2301_7644413313 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
ChaoZiLL14 小时前
我读数据结构5-树
数据结构
冻柠檬飞冰走茶17 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
雨落在了我的手上17 小时前
Java数据结构(八):双链表的实现
数据结构
paeamecium18 小时前
【PAT甲级真题】- Kuchiguse (20)
数据结构·c++·python·算法·pat考试·pat
青山木18 小时前
Hot 100 --- 全排列
java·数据结构·算法·leetcode·深度优先