C语言单链表的基本操作

链表在数据管理中应用广泛,现给出单链表的使用范例以供参考:

#include "stdio.h"
#include <cstdlib>
typedef int STLDataType;

typedef struct SListNode {
    STLDataType data;
    struct SListNode *next;
} SLTNode;

// 创建链表节点
SLTNode *SListCreateNode(STLDataType x)
{
    SLTNode *nextNode = (SLTNode *)malloc(sizeof(SLTNode));
    nextNode->data = x;
    nextNode->next = NULL;
    return nextNode;
}

// 尾插节点
void SListPushBack(SLTNode **phead, STLDataType x)
{
    SLTNode *nextNode = SListCreateNode(x);
    if (*phead == NULL) { // 1、头节点为空,即整个链表没有元素,直接将待插入元素的地址赋值给头结点即可
        *phead = nextNode;
    } else { // 找到尾节点
        SLTNode *tail = *phead;
        while (tail->next != NULL) { // 2、如果只有一个节点,即head->next为NULL,此时如果不判空,直接访问,则会崩溃
            tail = tail->next; // 3、找到链表的尾节点
        }
        tail->next = nextNode;
    }
}

// 头插节点
void SListPushFront(SLTNode **phead, STLDataType x)
{
    SLTNode *nextNode = SListCreateNode(x);
    nextNode->next = *phead;
    *phead = nextNode;
}

// 尾删节点
void SListPopBack(SLTNode **phead)
{
    if (*phead == NULL) {
        return;
    } else if ((*phead)->next == NULL) { // 如果只有一个节点
        free(*phead);
        *phead = NULL;
    } else {
        SLTNode *prev = NULL;
        SLTNode *tail = *phead;
        while (tail->next != NULL) { // 找到最后一个节点以及前一个节点,将最后节点释放掉,并将前一个节点的指针域置空
            prev = tail;
            tail = tail->next;
        }
        free(tail);
        prev->next = NULL;
    }
}

// 头删节点
void SListPopFront(SLTNode **phead)
{
    if (*phead == NULL) {
        return;
    }
    SLTNode *nextNode = (*phead)->next; // 先把头节点的下个节点取出来
    free(*phead);
    *phead = nextNode;
}

// 查找data为x的节点,并返回该节点
SLTNode *SListFind(SLTNode *phead, STLDataType x)
{
    SLTNode *cur = phead;
    while (cur != NULL) {
        if (cur->data == x) {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

// 在指定节点前插入新节点
void SListInsert(SLTNode **phead, SLTNode *pos, STLDataType x)
{
    if (*phead == pos) { // 相当于头插节点
        SListPushFront(phead, x);
    } else {
        SLTNode *newCode = SListCreateNode(x);
        SListNode *prev = *phead;
        while (prev->next != pos) { // 找到pos的前面节点
            prev = prev->next;
        }
        prev->next = newCode;
        newCode->next = pos;
    }
}

// 删除指定节点pos
void SListErease(SLTNode **phead, SLTNode *pos)
{
    if (*phead == pos) { // 相当于删除头结点
        SListPopFront(phead);
    } else {
        SLTNode *prev = *phead;
        while (prev->next != pos) {
            prev = prev->next;
        }
        prev->next = pos->next;
        free(pos);
    }
}
// 遍历链表
void SListPrint(SLTNode *phead)
{
    SLTNode *cur = phead;
    while (cur != NULL) {
        printf("%d->", cur->data);
        cur = cur->next;
    }
    printf("NULL\n");
}

// 清空链表
void SListClear(SLTNode **phead)
{
    SLTNode *cur = *phead;
    SLTNode *next = NULL;
    while (cur != NULL) {
        next = cur->next;
        free(cur);
        cur = next;
    }
    *phead = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小朋友的大哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值