C语言实现单链表

来源:互联网 发布:淘宝客微博推广教程 编辑:程序博客网 时间:2024/06/06 05:57

List.h

#ifndef _LIST_H_#define _LIST_H_#include <stdio.h>#include <Windows.h>#include <assert.h>#include <malloc.h>typedef int DataType;typedef struct ListNode{    DataType _data;    struct ListNode* _next;}ListNode;void PrintList(ListNode* pList);ListNode* BuyNode(DataType x);void PushBack(ListNode** ppList, DataType x);void PopBack(ListNode** ppList);void PushFront(ListNode** ppList, DataType x);void PopFront(ListNode** ppList);ListNode* Find(ListNode* pList, DataType x); void Insert(ListNode** ppList, ListNode* pos, DataType x);void Erase(ListNode** ppList, ListNode* pos);#endif

List.c

#include "List.h"void PrintList(ListNode* pList){    if (pList == NULL)    {        printf("NULL\n");    }    ListNode* cur = pList;    while (cur)    {        printf("%d ", cur->_data);        cur = cur->_next;    }    printf("\n");}ListNode* BuyNode(DataType x){    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));    newNode->_data = x;    newNode->_next = NULL;    return newNode;}void PushBack(ListNode** ppList, DataType x){    //1.空 2.非空    assert(ppList);    if (*ppList == NULL)    {        *ppList = BuyNode(x);    }    else    {        ListNode* tail = *ppList;        while (tail->_next)        {            tail = tail->_next;        }        tail->_next = BuyNode(x);    }}void PopBack(ListNode** ppList){    //1.空  2.一个 3.多个    assert(ppList);    if (*ppList == NULL)    {        return;    }    else if ((*ppList)->_next==NULL)    {        free(*ppList);        *ppList = NULL;    }    else    {        ListNode* prev = NULL;        ListNode* tail = *ppList;        while (tail->_next)        {            prev = tail;            tail = tail->_next;        }        free(tail);        prev->_next = NULL;    }}void PushFront(ListNode** ppList, DataType x){    //1.空 2.非空    assert(ppList);    if (*ppList == NULL)    {        (*ppList) = BuyNode(x);        return;    }    else    {        ListNode* head = BuyNode(x);        head->_next = *ppList;        *ppList = head;    }}void PopFront(ListNode** ppList){    //1.空 2.一个 3.多个    assert(ppList);    if (*ppList == NULL)    {        return;    }    else if ((*ppList)->_next == NULL)    {        free(*ppList);        *ppList = NULL;    }    else    {           ListNode* cur = (*ppList)->_next;        free(*ppList);        *ppList = cur;    }}ListNode* Find(ListNode* pList, DataType x){    while (pList)    {        if (pList->_data == x)        {            return pList;        }        pList = pList->_next;    }    return NULL;}void Insert(ListNode** ppList, ListNode* pos, DataType x){    //1.头插 2.中间位置插入    assert(pos);    assert(ppList);    if (pos==*ppList)    {        PushFront(ppList, x);        return;    }    else    {        ListNode* cur = BuyNode(x);        ListNode* prev = *ppList;        while (prev->_next!=pos)        {            prev = prev->_next;        }        cur->_next = prev->_next;        prev->_next = cur;    }}void Erase(ListNode** ppList, ListNode* pos){    //1.头删 2.其余位置删除    assert(ppList);    assert(pos);    if (pos == *ppList)    {        PopFront(ppList);        return;    }    else    {        ListNode* prev = *ppList;        while (prev->_next != pos)        {            prev = prev->_next;        }        prev->_next = pos->_next;        free(pos);        pos = NULL;    }}

测试用例test.c

#include "List.h"void TestList1(){    ListNode* list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    PrintList(list);}void TestList2(){    ListNode* list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    PopBack(&list);    PopBack(&list);    PopBack(&list);    //PopBack(&list);    //PopBack(&list);    PrintList(list);}void TestList3(){    ListNode* list = NULL;    PushFront(&list, 1);    PushFront(&list, 2);    PushFront(&list, 3);    PushFront(&list, 4);    PrintList(list);}void TestList4(){    ListNode* list = NULL;    PushFront(&list, 1);    PushFront(&list, 2);    PushFront(&list, 3);    PushFront(&list, 4);    PopFront(&list);    PopFront(&list);    PopFront(&list);    //PopFront(&list);    //PopFront(&list);    PrintList(list);}void TestList5(){    ListNode* list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 4);    ListNode* ret = Find(list,1);    Insert(&list, ret, 0);     ret = Find(list, 4);    Insert(&list, ret, 3);    PrintList(list);}void TestList6(){    ListNode* list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    ListNode* ret = Find(list,1);    Erase(&list, ret);    PrintList(list);    ret = Find(list, 4);    Erase(&list, ret);    PrintList(list);    ret = Find(list, 2);    Erase(&list, ret);    PrintList(list);    ret = Find(list, 3);    Erase(&list, ret);    PrintList(list);}int main(){    TestList6();    system("pause");    return 0;}