链表 增删查改

#include<stdio.h>
#include<Windows.h>
#include<assert.h>
typedef int DataType;
typedef struct SListNode
{
    DataType data;
    struct SListNode *next;
}SListNode;



SListNode* BuySListNode(DataType x)//创建一个新的结点
{
    SListNode *p = (SListNode*)malloc(sizeof(SListNode));
    p->data = x;
    p->next = NULL;
    return p;
}
void SListPrint(SListNode* phead)//打印链表中的结点  
{
    assert(phead);
    SListNode *p = phead;
    while (p)
    {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");
}
void SListDestory(SListNode** pphead)//销毁链表
{
    assert(pphead);
    SListNode *p = NULL;
    while (*pphead)
    {
        p = (*pphead)->next;
        free(*pphead);
        *pphead = p;

    }
    free(p);
    free(*pphead);
    p = NULL;
    *pphead = NULL;
}

void SListPushBack(SListNode** pphead, DataType x)//尾插法
{
    //1.建立一个新节点,判断*phead是否为空,是则将node作为p的首个节点,不是则遍历至最后一个节点,接在p->next处
    assert(pphead);
    SListNode *node = BuySListNode(x);
    SListNode *p = *pphead;
    if (p == NULL)
    {
        *pphead = node;
    }
    else
    {
        while (p->next != NULL)
        {
            p = p->next;
        }       p->next = node;
    }
}
void SListPopBack(SListNode** pphead)  //尾删法
{
    //1判断链表是否为空
    //2找到最后一个节点的位置并free
    assert(pphead);

    if (*pphead == NULL)//无节点
    {
        printf("slistnode is empty!");
        return;
    }
    else if ((*pphead)->next == NULL)//一个节点
    {
        free(*pphead);
    }
    else//多个结点
    {
        SListNode *p = *pphead;
        SListNode *prev = NULL;
        while (p->next)
        {
            prev = p;
            p = p->next;
        }
        prev->next = NULL;
        free(p);
        p = NULL;
    }
}
void SListPushFront(SListNode** pphead, DataType x)
{
    assert(pphead);
    SListNode *p = BuySListNode(x);
    if (*pphead == NULL)//若原链表为空
    {
        *pphead = p;
    }
    else
    {
        p->next = *pphead;
        *pphead = p;
    }
}
SListNode* SListFind(SListNode* phead, DataType x)//查找x所在的位置
{
    assert(phead);
    if (phead == NULL)
    {
        printf("slistnode is empty!");
        return NULL;
    }
    else
    {
        SListNode *p = phead;
        while (p->next)
        {
            if (p->data == x)
            {
                return p;
            }
            else
            {
                p = p->next;
            }
        }
        printf("%d is not in this slistnode!",x);
        return NULL;
    }
}
void SListInsest(SListNode** pphead, SListNode* pos, DataType x)//任意位置插入
{
    assert(pphead);
    assert(pos);
    SListNode *p = *pphead;
    if (*pphead == pos)//如果插入位置是首地址
    {
        SListNode *u = BuySListNode(x);
        u->next = *pphead;
        *pphead = u;
    }
    else//插入位置非首地址
    {
        for (;p->next != pos;p = p->next)
        {
            ;
        }
        SListNode *u = BuySListNode(x);
        u->next = pos;
        p->next = u;
    }

}
void SListErase(SListNode** pphead, SListNode* pos)//任意位置删除
{
    assert(pphead);
    assert(pos);

    if (*pphead = pos)//如果删除位置是首地址
    {
        *pphead = (*pphead)->next;
    }
    else if (pos->next == NULL)//尾地址
    {
        SListPopBack(pphead);
    }
    else//删除位置非首尾地址
    {
        SListNode *p = *pphead;
        SListNode* next = pos->next;
        while (p->next != pos)
        {
            p = p->next;
        }
        p->next = next;
    }
}

猜你喜欢

转载自blog.csdn.net/ferlan/article/details/79617628