实现链表的操作函数

本文详细探讨了如何实现链表的各种操作,包括插入、删除、遍历等基本功能,旨在帮助开发者更好地理解和掌握链表数据结构。
摘要由CSDN通过智能技术生成
本篇文章对单链表的基本操作做以简单的介绍,其中包含初始化、定义、头插(删)、尾插(删)等,若存在问题,请各位不吝赐教。
定义:
typedef int DataType;    
    
typedef struct SListNode    
{    
    DataType data;    
    struct SListNode *pNext;    
}SListNode;  
开辟新结点:
SListNode *NewSpace()    
{    
    SListNode *pNew = (SListNode *)malloc(sizeof(SListNode));    
    assert(pNew);    
    pNew->pNext = NULL;    
    pNew->data = 0;    
    return pNew;    
}   
初始化:
void SListInit(SListNode **ppFirst)    
{    
        assert(ppFirst);    
        (*ppFirst) = NULL;    
        return;    
}  
头插:
void PushFront(SListNode **ppFirst, DataType data)    
{    
        assert(*ppFirst);    
        SListNode *pTmpNode = NewSpace();    
        pTmpNode->data = data;    
        pTmpNode->pNext = (*ppFirst);    
        (*ppFirst) = pTmpNode;    
}   
尾插:
void PushBack(SListNode **ppFirst, DataType data)    
{    
        assert(ppFirst);    
        if ((*ppFirst) == NULL){    
            (*ppFirst) = NewSpace();    
            (*ppFirst)->pNext = NULL;    
            (*ppFirst)->data = data;    
            return;    
        }    
    
        SListNode *pTmpNode = (*ppFirst);    
        while (pTmpNode->pNext != NULL){    
            pTmpNode = pTmpNode->pNext;    
        }    
        pTmpNode->pNext = NewSpace();    
        pTmpNode->pNext->pNext = NULL;    
        pTmpNode->pNext->data = data;    
}    
头删:
void PopFront(SListNode **ppFirst)    
{    
        if ((*ppFirst) == NULL){    
            printf("ERROR\n");    
            return;    
        }    
        SListNode *pTmpNode = (*ppFirst);    
        (*ppFirst) = (*ppFirst)->pNext;    
        free(pTmpNode);    
        pTmpNode = NULL;    
}    
尾删:
void PopBack(SListNode **ppFirst)    
{    
        if ((*ppFirst) == NULL){    
            printf("ERROR\n");    
            return;    
        }    
        SListNode *pTmpNode = (*ppFirst);    
        while (pTmpNode->pNext->pNext != NULL){    
            pTmpNode = pTmpNode->pNext;    
        }    
        free(pTmpNode->pNext);    
        pTmpNode->pNext = NULL;    
}   
给定结点插入,插入到结点前:
void InsertFront(SListNode **ppFirst, SListNode *pPos, DataType data)    
{    
        assert(*ppFirst);    
        assert(ppFirst);    
    
        SListNode *pTmpNode = (*ppFirst);    
        if ((*ppFirst) == pPos){    
            pTmpNode = NewSpace();    
            pTmpNode->data = data;    
            pTmpNode->pNext = (*ppFirst);    
            (*ppFirst) = pTmpNode;    
            return;    
    
        }    
        while (pTmpNode->pNext != pPos){    
            pTmpNode = pTmpNode->pNext;    
    
        }    
        SListNode *pNode = NewSpace();    
        pNode->data = data;    
        pNode->pNext = pTmpNode->pNext;    
        pTmpNode->pNext = pNode;    
}    
按给定结点值删除:
void DeData(SListNode **ppFirst, DataType data)    
{    
        assert(*ppFirst);    
        SListNode *pTmpNode = (*ppFirst);    
    
        if (pTmpNode->data == data){               //判断是否为第一个结点的数据      
            (*ppFirst) = (*ppFirst)->pNext;    
            free(pTmpNode);    
            pTmpNode = NULL;    
            return;    
        }    
    
        while (pTmpNode->pNext != NULL){    
            if (pTmpNode->pNext->data == data){    
                SListNode *pNode = pTmpNode->pNext;    
                pTmpNode->pNext = pNode->pNext;    
                free(pNode);    
                pNode = NULL;    
                return;    
            }    
            pTmpNode = pTmpNode->pNext;    
        }    
        if (pTmpNode->data == data){               //上条语句退出后还剩最后一个结点没有判断      
            free(pTmpNode);    
            pTmpNode = NULL;    
            return;    
        }    
        printf("Not Found!\n");    
按值删除所有的:
void DeDataAll(SListNode **ppFirst, DataType data)    
{    
        assert(*ppFirst);    
        SListNode *pTmpNode = (*ppFirst);    
    
        if ((*ppFirst)->data == data){    
            pTmpNode = (*ppFirst);    
            (*ppFirst) = (*ppFirst)->pNext;    
            free(pTmpNode);    
            pTmpNode = NULL;    
        }    
    
        while (pTmpNode->pNext != NULL){    
            if (pTmpNode->pNext->data == data){    
                SListNode *pNode = pTmpNode->pNext;    
                pTmpNode->pNext = pNode->pNext;    
                free(pNode);    
                pNode = NULL;    
                continue;    
            }    
            pTmpNode = pTmpNode->pNext;    
        }    
    
        if (pTmpNode->data == data){    
            free(pTmpNode);    
            pTmpNode = NULL;    
    
        }    
}
按地址删除:
void DePos(SListNode **ppFirst, SListNode *pPos)  
{  
        assert(ppFirst);  
        assert(*ppFirst);  
  
        SListNode *pTmpNode = (*ppFirst);  
        if (pPos == (*ppFirst)){  
            (*ppFirst) = (*ppFirst)->pNext;  
            free(pTmpNode);  
            pTmpNode = NULL;  
            return;  
        }  
}  
按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL: 
void FindPos(SListNode **ppFirst, DataType data)    
{    
        assert(*ppFirst);    
    
        SListNode *pTmpNode = (*ppFirst);    
        while (pTmpNode != NULL){    
            if (pTmpNode->data == data){    
                printf("按值查找,返回地址      %p\n\n", pTmpNode);    
                return;    
    
            }    
            pTmpNode = pTmpNode->pNext;    
    
        }    
        printf("Not Found!\n");    
}    
    
销毁:
void Destory(SListNode **ppFirst)    
{    
        assert(*ppFirst);    
    
        SListNode *pTmpNode = (*ppFirst);    
        while ((*ppFirst) != NULL){    
            (*ppFirst) = (*ppFirst)->pNext;    
            free(pTmpNode);    
            pTmpNode = (*ppFirst);    
    
        }    
        pTmpNode = NULL;    
}  
打印函数:
void Display(SListNode *ppFirst)  
{  
        assert(ppFirst);  
        SListNode *pTmpNode = ppFirst;  
        while (pTmpNode->pNext != NULL){  
            printf("%d  ", pTmpNode->data);  
            pTmpNode = pTmpNode->pNext;  
  
        }  
        printf("%d  \n\n", pTmpNode->data);  
} 
主函数:
int main(void)    
{    
        SListNode *SL;    
        SListInit(&SL);    
        PushBack(&SL, 11);    
        PushBack(&SL, 3);    
        PushBack(&SL, 3);    
        PushBack(&SL, 66);    
        PushBack(&SL, 77);    
        printf("尾插                    ");    
        Display(SL);    
    
        PushFront(&SL, 4);    
        PushFront(&SL, 3);    
        PushFront(&SL, 2);    
        PushFront(&SL, 1);    
        printf("头插                    ");    
        Display(SL);    
    
        PopFront(&SL);    
        printf("头删                    ");    
        Display(SL);    
    
        PopBack(&SL);    
        printf("尾删                    ");    
        Display(SL);    
    
        DeData(&SL, 4);    
        printf("按数据删                ");    
        Display(SL);    
    
        DeDataAll(&SL, 3);    
        printf("按数据删除所有遇到的    ");    
        Display(SL);    
    
        DePos(&SL, (SL->pNext));    
        printf("按地址删                ");    
        Display(SL);    
    
    
        InsertFront(&SL, SL->pNext, 99);    
        printf("按地址插入              ");    
        Display(SL);    
    
        FindPos(&SL, 2);    
    
        printf("销毁          \n\n");    
        system("pause");    
        return 0;    
}    










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值