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

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

}

}

相关推荐
quaer3 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
xys_6787 小时前
深挖数据结构:树和二叉树(上)
数据结构·算法
BeiGuTing_code7 小时前
Java动态数组(一)
java·数据结构·windows
Code_Solitude11 小时前
传智杯备赛代码整理(前4题)
数据结构·算法
Jasmine_llq11 小时前
《P8816 [CSP-J 2022] 上升点列》
数据结构·算法·贪心·排序·二维动态规划 dp·类背包状态转移
辛苦才能12 小时前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
JasmineX-112 小时前
数据结构(笔记)——顺序栈
c语言·数据结构·笔记
凉茶钱14 小时前
list:哨兵节点,const_iterator 和 const iterator的区别与迭代器失效
数据结构·c++·list
敲代码的苦1315 小时前
头歌数据结构-排序的实现及其应用
数据结构
有同事要进步16 小时前
Leecode第68题:x的平方根
java·数据结构·算法