单链表的简单函数实现

来源:互联网 发布:云安全软件好用吗 编辑:程序博客网 时间:2024/06/17 06:32

首先我们得了解一下什么是链表?什么是单链表
所谓链表其实就是一些包含数据的独立数据结构(通常称为结点)的集合,链表中的每个结点通过链或指针连接在一起,程序通过指针访问链表中的结点。
单链表中,每个结点包含一个指向链表下一个结点的指针,链表最后一个结点的指针字段的值为NULL。
下图为单链表的具体实现方式图
这里写图片描述
下面我们用代码来简单实现一下~
LinkList.h //函数声明

#ifndef _LINKLIST_H__#define _LINKLIST_H__#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>typedef int DataType;//假设结点的数据域类型为整型typedef struct Node//结点类型定义{    DataType data;//结点的数据域    struct Node* next;//结点的指针域}Node, *pNode, *pList;void InitLinkList(pList* pplist);void Display(pList pl);//打印void PushFront(pList* pplist, DataType x);//头插void PopFront(pList* pplist);//头删void PushBack(pList* pplist, DataType x);//尾插void PopBack(pList* pplist);//尾删pNode Find(pList pl, DataType d); //查找void Remove(pList *pplist, DataType x);//删除链表中指定元素void Destroy(pList* pplist);//销毁void Show(pList pl);//逆序打印(递归实现)void DelNotTail(pNode pos);//删除无头链表的非尾节点void InsertFrontNode(pNode pos, DataType d);//当前节点插入一个数据

LinkList.c //函数的具体实现

#define _CRT_SECURE_NO_WARNINGS 1 #include"LinkList.h"void InitLinkList(pList* pplist)//初始化{    assert(pplist != NULL);    *pplist = NULL;}void Display(pList pl){    if (pl == NULL)    {        return;    }    while (pl)    {        printf("%d-->", pl->data);        pl = pl->next;    }    printf("over\n");}void PushFront(pList* pplist, DataType d)//头插{    assert(pplist);    Node* newNode = (Node*)malloc(sizeof(Node));    if (newNode == NULL)    {        perror("use malloc");        exit(EXIT_FAILURE);    }    newNode->data = d;    newNode->next = NULL;    newNode->next = *pplist;    *pplist = newNode;}void PopFront(pList* pplist){    assert(pplist);    pNode cur = *pplist;    if (cur == NULL)    {        return;    }    else    {        *pplist = cur->next;        free(cur);    }}void PushBack(pList* pplist, DataType d){    pNode head = *pplist;    pNode cur = NULL;    pNode newnode = (Node*)malloc(sizeof(Node));    if (newnode == NULL)    {        perror("use malloc");        exit(EXIT_FAILURE);    }    newnode->data = d;    newnode->next = NULL;    if (head == NULL)    {        *pplist = newnode;        newnode->data = d;        newnode->next = NULL;    }    else    {        while (head != NULL)        {            cur = head;            head = head->next;        }        cur->next = newnode;    }}void PopBack(pList* pplist){    pNode prev = NULL;    pNode cur = *pplist;    if (*pplist == NULL)    {        return;    }    while (cur->next != NULL)    {        prev = cur;        cur = cur->next;    }    if (prev != NULL)    {        prev->next = NULL;        free(cur);    }    else    {        free(cur);        *pplist = NULL;    }}pNode Find(pList pl, DataType d){    pNode cur = pl;    while (cur != NULL)    {        if (cur->data == d)        {            return cur;        }        cur = cur->next;    }    return NULL;}void Remove(pList *pplist, DataType d)//删除链表中指定元素{    assert(pplist);    pNode prev = NULL;    pNode cur = Find(*pplist, d);    if (cur == NULL)    {        return;    }    prev = cur->next;    cur->data = prev->data;    cur->next = prev->next;    free(prev);    prev->next = NULL;}void Destroy(pList* pplist){        free(*pplist);        pplist = NULL;}void Show(pList pl){    if (pl == NULL)    {        return;    }    else    {        Show(pl->next);        printf("%d-->", pl->data);    }}void DelNotTail(pNode pos){    assert(pos != NULL);    pNode del = NULL;    del = pos->next;    pos->data = del->data;    pos->next = del->next;    free(del);    del->next = NULL;}void InsertFrontNode(pNode pos, DataType d){    pNode new = (Node*)malloc(sizeof(Node));    if (new == NULL)    {        perror("use malloc");        exit(EXIT_FAILURE);    }    else    {        new->data = pos->data;        pos->data = d;        new->next = pos->next;        pos->next = new;    }}

test.c //函数测试

#define _CRT_SECURE_NO_WARNINGS 1#include"LinkList.h"void test1()//头插和头删的测试{    pList plist;    InitLinkList(&plist);    PushFront(&plist, 1);    PushFront(&plist, 2);    PushFront(&plist, 3);    PushFront(&plist, 4);    Display(plist);    PopFront(&plist);    Display(plist);    PopFront(&plist);    Display(plist);    PopFront(&plist);    Display(plist);    PopFront(&plist);    Display(plist);    Destroy(&plist);}void test2(){    pList plist;    InitLinkList(&plist);    PushBack(&plist, 1);    PushBack(&plist, 2);    PushBack(&plist, 3);    PushBack(&plist, 4);    Display(plist);    PopBack(&plist);    Display(plist);    PopBack(&plist);    Display(plist);    PopBack(&plist);    Display(plist);    PopBack(&plist);    Display(plist);    Destroy(&plist);}void test3(){    pList plist;    InitLinkList(&plist);    PushBack(&plist, 1);    PushBack(&plist, 2);    PushBack(&plist, 3);    PushBack(&plist, 4);    Display(plist);    Remove(&plist, 3);    Display(plist);    Destroy(&plist);}void test4(){    pList plist;    InitLinkList(&plist);    PushBack(&plist, 1);    PushBack(&plist, 2);    PushBack(&plist, 3);    PushBack(&plist, 4);    Display(plist);    Show(plist);    Destroy(&plist);}void test5(){    pList plist;    pNode find = NULL;    InitLinkList(&plist);    PushBack(&plist, 1);    PushBack(&plist, 2);    PushBack(&plist, 3);    PushBack(&plist, 4);    Display(plist);    find= Find(plist, 3);    DelNotTail(find);    Display(plist);    Destroy(&plist);}void test6(){    pList plist;    pNode find = NULL;    InitLinkList(&plist);    PushBack(&plist, 1);    PushBack(&plist, 2);    PushBack(&plist, 3);    PushBack(&plist, 4);    Display(plist);    find = Find(plist, 3);    InsertFrontNode(find, 5);    Display(plist);    Destroy(&plist);}int main(){    //test1();    //test2();    //test3();    //test4();    //test5();    test6();    getchar();    return 0;}