链表的基本实现

来源:互联网 发布:欧盟对华反倾销数据 编辑:程序博客网 时间:2024/05/16 14:18

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;

相比较普通的线性结构,链表结构的可以总结一下:
(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小
(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据
(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表.

下面实现一个基本具有增删查改功能的单向链表:

头文件

#pragma once#include <stdio.h>#include <malloc.h>#include <assert.h>typedef int Datatype;typedef struct Listnode{    Datatype data;    struct Listnode* next;}Listnode;Listnode* BuyNode(Datatype x);//创建一个新的节点void PrintList(Listnode* plist);//打印链表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);//查找任意一个// 在pos的前面插入一个节点x void Insert(Listnode** pplist, Listnode* pos, Datatype x);void Erase(Listnode** pplist, Listnode* pos);//删除位置为pos的节点

函数实现

#include"list.h"Listnode* BuyNode(Datatype x)//创建一个新的节点{    Listnode* node = (Listnode*)malloc(sizeof(Listnode));    node->data = x;    node->next = NULL;    return node;}void PushBack(Listnode** pplist, Datatype x)//尾部插入{    if ((*pplist) == NULL)//没有节点时    {        *pplist = BuyNode(x);    }    else if ((*pplist)->next == NULL)//有一个节点时    {        (*pplist)->next = BuyNode(x);    }    else    {        Listnode* tmp = *pplist;        while (tmp->next)//有两个或两个以上个节点时        {            tmp = tmp->next;        }        tmp->next= BuyNode(x);    }}void PopBack(Listnode** pplist)//删除最后一个{    if (*pplist == NULL)//没有节点时    {        return;    }    else if ((*pplist)->next == NULL)//有一个节点时    {        free(*pplist);        *pplist = NULL;    }    else    {        Listnode* cur = *pplist;        Listnode* pos = cur;        while (cur->next )//有两个或两个以上个节点时        {            pos = cur;            cur = cur->next;        }        free(cur);        cur = NULL;        pos->next = NULL;    }}void PushFront(Listnode** pplist, Datatype x)//头插{    if ((*pplist) == NULL)//没有节点    {        (*pplist) = BuyNode(x);    }    else//有节点    {        Listnode *tmp = BuyNode(x);        tmp->next = *pplist;        *pplist = tmp;    }}void PopFront(Listnode** pplist)//头删{    if (*pplist == NULL)//没有节点    {        return;    }    else if ((*pplist)->next == NULL)//一个节点    {        free(*pplist);        (*pplist) = NULL;    }    else//多个节点    {        while ((*pplist)->next != NULL)        {            Listnode *tmp = (*pplist)->next;            free(*pplist);            (*pplist) = NULL;            (*pplist) = tmp;        }    }}Listnode* Find(Listnode* plist, Datatype x)//查找任意一个{    if (plist == NULL)    {        return NULL;    }    else    {        while (plist)        {            if (plist->data = x)                return plist;        }        plist = plist->next;    }    return NULL;}void PrintList(Listnode* plist)//打印链表{    Listnode* cur = plist;    while (cur)    {        printf("%d->", cur->data);        cur = cur->next;    }    printf("NULL\n");}void Insert(Listnode** pplist, Listnode* pos, Datatype x){    assert(pos);    if ((*pplist == NULL) || (*pplist)->next == NULL || (*pplist == pos))    {        PushFront(pplist, x);    }    else    {        Listnode*tmp = NULL;        Listnode*cur = *pplist;        while (cur->next!=pos)        {            cur = cur->next;        }        tmp = BuyNode(x);        cur->next = tmp;        tmp->next = pos;    }}void Erase(Listnode** pplist, Listnode* pos)//删除位置为pos的节点{    assert(pos);    if ((*pplist == NULL) || ((*pplist)->next == NULL) || (*pplist == pos))    {        PopFront(pplist);    }    else    {        Listnode* tmp = *pplist;        while (tmp->next != pos)        {            tmp = tmp->next;        }        tmp->next = pos->next;        free(pos);        pos = NULL;    }}

主函数

#define _CRT_SECURE_NO_WARNINGS 1#include"list.h"void test1(){    Listnode *list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    PushBack(&list, 4);    PrintList(list);    PopBack(&list);    PopBack(&list);    PopBack(&list);    PopBack(&list);    PrintList(list);}void test2(){    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 test3(){    Listnode* list = NULL;    PushBack(&list, 1);    PushBack(&list, 2);    PushBack(&list, 3);    Listnode* pos = Find(list, 2);    Insert(&list, pos, 4);    PrintList(list);    pos = Find(list, 2);    Erase(&list, pos);    PrintList(list);}int main(){    test3();    //test1();    test2();    getchar();    return 0;}

多谢各位大佬指点错误。