SList.h
#pragma once
// copyright 2022 孙振国
// All right reserved
// 文件名称:SList.h
// 摘 要:关于单向不带头不循环链表的构建
//
// 作 者:孙振国
// 完成日期:2022年5月13日
// 取代版本:无
#include<stdio.h>
//定义链表中数据的类型
#define SLTDataType int
typedef struct SListNode SListNode;
//定义节点类型
struct SListNode
{
SLTDataType node;
SListNode* next;//下一个节点的地址
};
SListNode* BuySListNode(SLTDataType x);//建立一个新的节点
void SListNodePrint(SListNode* plist);//打印链表
void SListPushFront(SListNode** pplist, SLTDataType x);//链表前端插入
void SListPushBack(SListNode** pplist, SLTDataType x);//链表后端插入
void SListPopFront(SListNode** pplist);//链表前端删除
void SListPopBack(SListNode** pplist);//链表后端删除
SListNode* SListFind(SListNode* plist, SLTDataType x);//找到想要的节点地址
void SListInsertBefore(SListNode** pplist, SListNode* pos, SLTDataType x);//节点前插入
void SListInsertAfter(SListNode* pos, SLTDataType x);//节点后插入
void SListEraseAfter(SListNode* pos);//节点后删除
void SListEraseBefore(SListNode** pplist, SListNode* pos);//节点前删除
SList.c
#define _CRT_SECURE_NO_WARNINGS 1
// copyright 2022 孙振国
// All right reserved
// 文件名称:SList.c
// 摘 要:关于单向不带头不循环链表的构建
//
// 作 者:孙振国
// 完成日期:2022年5月13日
// 取代版本:无
#include"SList.h"
SListNode* BuySListNode(SLTDataType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
newnode->node = x;
newnode->next = NULL;
return newnode;
}
void SListNodePrint(SListNode* plist)
{
while (plist)
{
printf("%d->",plist->node);
plist = plist->next;
}
printf("NULL\n");
}
void SListPushFront(SListNode** pplist, SLTDataType x)
{
SListNode* phead = BuySListNode(x);
phead->next = *pplist;
*pplist = phead;
}
void SListPushBack(SListNode** pplist, SLTDataType x)
{
SListNode* cur = *pplist;
SListNode* ptail = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = ptail;
}
else
{
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = ptail;
}
}
void SListPopFront(SListNode** pplist)
{
if (*pplist == NULL)
{
return;
}
*pplist = (*pplist)->next;
}
void SListPopBack(SListNode** pplist)
{
SListNode* cur = *pplist;
SListNode* prev = NULL;
if (*pplist == NULL)
{
return;
}
if (cur->next == NULL)
{
*pplist = (*pplist)->next;
return;
}
while (cur->next != NULL)
{
prev = cur;
cur = cur->next;
}
prev->next = cur->next;
free(cur);
cur = NULL;
}
SListNode* SListFind(SListNode* plist, SLTDataType x)
{
SListNode* cur = plist;
if (plist == NULL)
{
return NULL;
}
while(cur != NULL)
{
if (cur->node == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void SListInsertBefore(SListNode** pplist, SListNode* pos, SLTDataType x)
{
if (pos == NULL||*pplist == NULL)
{
return;
}
SListNode* cur = *pplist;
SListNode* prev = NULL;
SListNode* newNode = BuySListNode(x);
while (cur != NULL)
{
if (cur == pos)
{
break;
}
prev = cur;
cur = cur->next;
}
if (prev == NULL)
{
*pplist = newNode;
newNode->next = cur;
}
else
{
prev->next = newNode;
newNode->next = cur;
}
}
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
if (pos == NULL)
{
return;
}
SListNode* newNode = BuySListNode(x);
newNode->next = pos->next;
pos->next = newNode;
}
void SListEraseAfter(SListNode* pos)
{
if (pos == NULL)
{
return;
}
SListNode* cur = pos;
SListNode* next = pos->next;
if (next != NULL)
{
cur->next = next->next;
free(next);
next = NULL;
}
}
void SListEraseBefore(SListNode** pplist, SListNode* pos)
{
SListNode* prev = NULL;
SListNode* cur = *pplist;
if (pos == NULL || pos == *pplist)
{
return;
}
while (cur->next != pos)
{
prev = cur;
cur = cur->next;
}
if (prev == NULL)
{
*pplist = cur->next;
free(cur);
cur = NULL;
}
else
{
prev->next = pos;
free(cur);
cur = NULL;
}
}
main.c
这是调试用的,主要是为了确保函数能正常使用。
#define _CRT_SECURE_NO_WARNINGS 1
#include"SList.h"
void test1()
{
SListNode* plist = NULL;
SListPushFront(&plist, 1);
SListPushFront(&plist, 2);
SListPushFront(&plist, 3);
SListPushFront(&plist, 4);
SListNodePrint(plist);
SListPushBack(&plist, 1);
SListPushBack(&plist, 2);
SListPushBack(&plist, 3);
SListPushBack(&plist, 4);
SListPushBack(&plist, 7);
SListNodePrint(plist);
SListNode* pos = SListFind(plist, 4);
SListEraseAfter(pos);
SListInsertBefore(&plist, pos, 5);
pos = SListFind(plist, 7);
SListInsertAfter(pos, 8);
SListNodePrint(plist);
SListEraseBefore(&plist, pos);
pos = SListFind(plist, 5);
SListEraseBefore(&plist, pos);
SListNodePrint(plist);
pos = SListFind(plist, 8);
SListEraseBefore(&plist, pos);
SListEraseBefore(&plist, pos);
SListNodePrint(plist);
}
int main()
{
test1();
return 0;
}
期待大佬的关注关注关注关注关注关注关注关注关注关注关注关注关注关注关注关注关注关注!!