【数据结构】单向链表的实现

     SList.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#include <stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;
typedef struct SListNode
{
    struct SListNode *pNext;//指向下一个结点的地址
    DataType  data;
}SListNode;

SListNode *BuySlistNode(DataType x);//创建新空间和数据
void SListNodePushBack(SListNode **ppHead, DataType data);//后插
void SListNodePushFront(SListNode **ppHead, DataType data);//前插
void SListNodeDelBack(SListNode **ppHead);//尾删
void SListNodeDelFront(SListNode **ppHead);//前删
void SListDestory(SListNode **ppHead);//销毁
SListNode *SListFind(SListNode **ppHead, DataType data);//查找第一个匹配的值,并返回地址
void SListInsert(SListNode **ppHead, SListNode *pos, DataType data);//指定位置插入
void SListErase(SListNode **ppHead, SListNode *pos);//指定位置删除
void SListRemove(SListNode **ppHead, DataType data);//删除第一个匹配的数据
void SListRemoveAll(SListNode **ppHead, DataType data);//删除所有匹配的数据
void SListPrint(SListNode *ppHead);//打印链表
int size(SListNode *ppHead);//链表数据个数
void TestSList();//测试函数

#endif //__SList_H__
     SList.c
#include"SList.h"

//创建一个新空间和数据
SListNode *BuySlistNode(DataType x)
{
    SListNode*node = (SListNode*)malloc(sizeof(SListNode));
    assert(node);
    node->data = x;
    node->pNext = NULL;
    return node;
}

//尾插
void SListNodePushBack(SListNode **ppHead, DataType data)
{
    if (*ppHead == NULL)
    {
        *ppHead = BuySlistNode(data);
        return;
    }
    else
    {
        SListNode*pNode = *ppHead;
        while (pNode->pNext != NULL)
        {
            pNode = pNode->pNext;
        }
        pNode->pNext = BuySlistNode(data);
    }
}

//头插
void SListNodePushFront(SListNode **ppHead, DataType data)
{
        SListNode*pNode = BuySlistNode(data);
        pNode->pNext = *ppHead;
        *ppHead = pNode;
}

//尾删
void SListNodeDelBack(SListNode **ppHead)
{
    //空
    if (*ppHead == NULL)
    {
        return;
    }
    //一个
    else if ((*ppHead)->pNext == NULL)
    {
        free(*ppHead);
        *ppHead = NULL;
    }
    //多个
    else
    {
        SListNode*prev = NULL;  //用两个指针来实现
        SListNode*pNode = *ppHead;
        while (pNode->pNext != NULL)
        {
            prev = pNode;
            pNode = pNode->pNext;
        }
        prev->pNext = NULL;
        free(pNode);
    }
}


void SListNodeDelFront(SListNode **ppHead)
{
    if (*ppHead == NULL)
    {
        return;
    }
    else
    {
        SListNode*pNode = (*ppHead)->pNext;//注意*和->优先级的问题
        free(*ppHead);
        *ppHead = pNode;
    }
}
void SListDestory(SListNode **ppHead)
{

    SListNode* pNode = *ppHead;
    while (pNode)
    {
        SListNode*pNext = pNode->pNext;//注意释放前需保存下一个指针,防止指针丢失
        free(pNode);
        pNode = pNext;
    }
    *ppHead = NULL;
}

SListNode *SListFind(SListNode **ppHead, DataType data)
{
    SListNode* pNode = *ppHead;
    while (pNode)
    {
        if (pNode->data == data)
        {
            return pNode;
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

//指定位置插入
void SListInsert(SListNode **ppHead, SListNode *pos, DataType data)
{
    //assert(pos&&(*ppHead));
    SListNode*pNode = *ppHead;
    SListNode*pNewNode = BuySlistNode(data);
    //头插
    if (pos == *ppHead)
    {
        SListNodePushFront(ppHead, data);
    }
    //中间
    else
    {
        while (pNode->pNext != pos)//注意循环条件
        {
            pNode = pNode->pNext;
        }
        pNode->pNext = pNewNode;
        pNewNode->pNext = pos;
    }

}

//删除指定位置
void SListErase(SListNode **ppHead, SListNode *pos)
{
    if (*ppHead == NULL)
    {
        return;
    }

    //只有一个,头删
    if (pos == *ppHead)
    {
        SListNodeDelFront(ppHead);
        return;
    }
    SListNode*pNode = *ppHead;
    while (pNode->pNext != pos)
    {
        pNode = pNode->pNext;
    }
    pNode->pNext = pos->pNext;
    free(pos);
    pos = NULL;
}

//删除第一个匹配的值
void SListRemove(SListNode **ppHead,DataType data)
{
    SListNode*pNode = SListFind(*ppHead,data);
    if (pNode != NULL)
    {
        SListErase(ppHead, pNode);
    }
}

//删除所有匹配的值
void SListRemoveAll(SListNode **ppHead, DataType data)
{
    if ((*ppHead)->data == data)
    {
        SListNodeDelFront(ppHead);
    }

    SListNode *pNode = *ppHead;
    SListNode *pDel=NULL;

    while (pNode->pNext != NULL)
    {
        if (pNode->pNext->data == data) 
        {
            pDel = pNode->pNext;
            pNode->pNext = pDel->pNext;
            free(pDel);
        }
        else 
        {
            pNode = pNode->pNext;
        }
    }
}

//打印链表
void SListPrint(SListNode *ppHead)
{
    SListNode*pNode = ppHead;
    while (pNode)
    {
        printf("%d->", pNode->data);
        pNode = pNode->pNext;
    }
    printf("NULL\n");
}

//链表的大小
int size(SListNode *ppHead)
{
    SListNode*pNode = ppHead;
    int size = 0;
    while (pNode != NULL)
    {
        pNode = pNode->pNext;
        size++;
    }
    return size;
}

//测试函数
void TestSList()
{
    SListNode *list = NULL;
    SListNodePushBack(&list, 1);//注意传地址
    SListNodePushBack(&list, 2);
    SListNodePushBack(&list, 3);
    SListNodePushBack(&list, 4);
    SListNodePushBack(&list, 5);
    SListPrint(list);

    SListNodeDelFront(&list);
    SListNodeDelFront(&list);
    SListNodeDelFront(&list);
    SListNodeDelFront(&list);
    SListNodeDelFront(&list);
    SListNodeDelFront(&list);
    SListPrint(list);


    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 2);
    SListNodePushFront(&list, 4);
    SListNodePushFront(&list, 1);
    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 7);
    SListPrint(list);

    SListNodeDelBack(&list);
    SListNodeDelBack(&list);
    SListNodeDelBack(&list);
    SListNodeDelBack(&list);
    SListNodeDelBack(&list);
    SListNodeDelBack(&list);
    SListPrint(list);

    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 2);
    SListNodePushFront(&list, 4);
    SListNodePushFront(&list, 1);
    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 7);
    SListPrint(list);

    SListDestory(&list);
    SListPrint(list);

    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 1);
    SListNodePushFront(&list, 4);
    SListNodePushFront(&list, 1);
    SListNodePushFront(&list, 5);
    SListNodePushFront(&list, 7);
    SListPrint(list);

    SListNode*pos;
    pos = SListFind(&list, 4);
    SListInsert(&list, pos, 0);
    SListPrint(list);

    pos = SListFind(&list, 4);
    SListErase(&list, 4);
    SListPrint(list);

    printf("%d\n", size(list));

    SListRemove(&list,1);
    SListPrint(list);

    SListRemoveAll(&list, 1);
    SListPrint(list);

    Destroy(&list);
    SListPrint(list);
}

            test.c

#include "SList.h"

int main()
{
    TestSList();
    system("pause");
    return 0;

}

猜你喜欢

转载自blog.csdn.net/lxf_style/article/details/80543169