#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef int SLDataType ;
typedef struct SListNode
{
SLDataType data;
struct SListNode* next;
}SListNode;
//创建一个节点
SListNode* BuySListNode(SLDataType x);
//打印
void PrintSList(SListNode* phead);
//尾插
void SListPushBack(SListNode** pphead ,SLDataType x);
//尾删
void SListPopBack(SListNode** pphead);
//头插
void SListPushFront(SListNode** pphead, SLDataType x);
//头删
void SListPopFront(SListNode** pphead);
---------------------------------------------------
SListNode* BuySListNode(SLDataType x)
//创建一个节点
//1.分配内存
//2.data区 赋值
//3.next区 置空
//4.返回节点
{
SListNode* newNode =( (SListNode*)malloc(sizeof(SListNode)) );
if (newNode == NULL)
{
printf("内存申请失败!\n");
exit(-1);
}
newNode->next = NULL ;
newNode->data = x;
return newNode;
}
//一级指针phead接收pList指针 phead是pList的一份临时拷贝,不能改变实参内部的内容
//自然也无法改变实参next指针的指向,达不到插入的效果
//最终pList无法改变指向,但若链表已经完成插入,其可用来打印链表
void PrintSList(SListNode* phead)
{
while (phead != NULL)
{
printf("%d->", phead->data);
phead = phead->next;
}
printf("NULL\n");
}
void SListPushBack(SListNode** pphead, SLDataType x)
{
SListNode* newNode = BuySListNode(x);
if ((*pphead) == NULL)//判断是否有头节点
{
*pphead = newNode;
}
else //循环找到尾节点
{
SListNode* tail = *pphead ;
while (tail->next != NULL)
{
tail = tail->next ;
}
tail->next = newNode;//在尾上插入节点
}
}
void SListPopBack(SListNode** pphead)
{
if (*pphead == NULL) //无节点
{
printf("该链表为空!\n");
return;
}
else if ((*pphead)->next == NULL) //一个节点
{
free(*pphead);
}
else //两个及以上
{
SListNode* Next = (*pphead)->next;
SListNode* Prev = *pphead;
while (Next->next != NULL)//找到倒数第一和第二个节点
{ //释放最后一个,倒数第二个next置空
Prev = Prev->next;
Next = Next->next;
}
free(Next);
Prev->next = NULL;
}
}
void SListPushFront(SListNode** pphead, SLDataType x)
{
SListNode* newNode = BuySListNode(x);
if (*pphead == NULL)
{
*pphead = newNode;
}
else
{
newNode->next = *pphead; //在头前插入节点
*pphead = newNode; //改变头节点
}
}
void SListPopFront(SListNode** pphead)
{
if (*pphead == NULL)
{
printf("该链表为空!\n");
return;
}
else
{
SListNode* cur = *pphead; //头节点后移,并释放第一个节点
*pphead = (*pphead)->next;
free(cur);
}
}
int main()
{
SListNode* pList = NULL;
SListPushFront(&pList, 13);
SListPushFront(&pList, 15);
SListPushFront(&pList, 18);
SListPushFront(&pList, 19);
SListPushFront(&pList, 43);
PrintSList(pList);
SListPopFront(&pList);
SListPopFront(&pList);
SListPopFront(&pList);
PrintSList(pList);
return 0;
}
单向无头链表
最新推荐文章于 2024-06-17 10:41:47 发布