实现单链表

单链表是一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素。单链表的结点由数据元素以及下一个数据元素存放的地址构成。
在这里插入图片描述

现将单链表的实现整理如:

//单链表的实现
typedef int DataType;

typedef struct SListNode
{
    struct SListNode* _next;
    DataType _data;
}SListNode;

SListNode* BuySListNode(DataType x);//申请一个新的结点
void SListPrint(SListNode* pHead);//打印
void SListDestory(SListNode** ppHead);//销毁

void SListPushBack(SListNode** ppHead, DataType x);//尾插
void SListPopBack(SListNode** ppHead);//尾删
void SListPushFront(SListNode** ppHead, DataType x);//头插

SListNode* SListFind(SListNode* pHead, DataType x);//查找
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x);//插入到指定位置之前
void SListErase(SListNode** ppHead, SListNode* pos);//删除指定位置

SListNode *BuySListNode(DataType x){
    SListNode *newnode = (SListNode *)malloc(sizeof(SListNode));
    newnode->_data = x;
    newnode->_next = NULL;
    return newnode;
}

void SListPrint(SListNode *pHead){
    if(pHead == NULL){
        printf("NULL\n");
    }
    SListNode *cur = pHead;
    while(cur != NULL){
        printf("%d -- ", cur->_data);
        cur = cur->_next;
    }
    printf("\n");
}

void SListDestory(SListNode **ppHead){
    assert(ppHead);
    SListNode *cur = *ppHead;
    while(cur != NULL){
        SListNode *del = cur;
        cur = cur->_next;
        free(del);
        del = NULL;
    }
    *ppHead = NULL;
}

void SListPushBack(SListNode** ppHead, DataType x){
    assert(ppHead);
    SListNode *newnode = BuySListNode(x);
    SListNode *cur = *ppHead;
    if(cur == NULL){
        *ppHead = newnode;
        return ;
    }
    while(cur->_next != NULL){
        cur = cur->_next;
    }
    cur->_next = newnode;
    
}

void SListPopBack(SListNode** ppHead){
    assert(ppHead);
    assert(*ppHead);
    SListNode *cur = *ppHead;
    //只有一个结点
    if(cur->_next == NULL){
        free(*ppHead);
        *ppHead = NULL;
        return ;
    }
    while(cur->_next->_next != NULL){
        cur = cur->_next;
    }
    SListNode *del = cur->_next;
    cur->_next = NULL;
    free(del);
}

void SListPushFront(SListNode** ppHead, DataType x){
    assert(ppHead);
    SListNode *newnode = BuySListNode(x);
    newnode->_next = *ppHead;
    *ppHead = newnode;
}


SListNode* SListFind(SListNode* pHead, DataType x){
    assert(pHead);
    SListNode *cur = pHead;
    while(cur != NULL){
        if(cur->_data == x){
            return cur;
        }
        cur = cur->_next;
    }
    return NULL;
}
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x){
    assert(ppHead);
    if(pos == *ppHead){
        SListPushFront(ppHead, x);
        return ;
    }
    SListNode *cur = *ppHead;
    while(cur->_next != pos){
        cur = cur->_next;
    }
    SListNode *newnode = BuySListNode(x);
    newnode->_next = cur->_next;
    cur->_next = newnode;
}

void SListErase(SListNode** ppHead, SListNode* pos){
    assert(ppHead);
    SListNode *cur = *ppHead;
    if(pos == cur){
        cur = cur->_next;
        free(*ppHead);
        *ppHead = cur;
        return ;
    }
    while(cur->_next != pos){
        cur = cur->_next;
    }
    SListNode *del = cur->_next;
    cur->_next = cur->_next->_next;
    free(del);
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值