单链表的简单函数实现

首先我们得了解一下什么是链表?什么是单链表
所谓链表其实就是一些包含数据的独立数据结构(通常称为结点)的集合,链表中的每个结点通过链或指针连接在一起,程序通过指针访问链表中的结点。
单链表中,每个结点包含一个指向链表下一个结点的指针,链表最后一个结点的指针字段的值为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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值