数据结构之单向链表

数据结构之单向链表

链表是一种结构体和指针相结合的一种数据结构,如下图:
这里写图片描述
代码如下:

//链表结点
typedef struct LINKNODE
{
    void *data;//指向任何类型的数据 
    struct LINKNODE  *next;
}LinkNode;

每个结点的指针都指向下一个结点,因此第一个结点没有前驱结点,这里就需要一个“头指针”来指向第一个结点,由于最后一个结点没有结点所以就指向NULL。
这里写图片描述

//链表结点
typedef struct LINKNODE
{
    void *data;//指向任何类型的数据 
    struct LINKNODE  *next;//指向下一个结点
}LinkNode;

//链表头结点
typedef struct LINKLIST
{
    LinkNode  *head;
    int size;//结点数量
}LinkList;

链表的长度都是动态增长的,是可以增加新的结点的,新增的结点可以在最后一个结点插入也可以在任意位置插入
这里写图片描述

//指定位置插入
void Insert_LinkList(LinkList * list, int pos, void * data)
{
    //创建新的节点
    LinkNode  *nowNode = (LinkNode*)malloc(sizeof(LinkNode));
    nowNode->data = data;
    nowNode->next = NULL;

    //找节点
    //辅助指针变量
    LinkNode  *pCurrent = list->head;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }

    //新节点入链表
    nowNode->next = pCurrent->next;
    pCurrent->next = nowNode;

    list->size++;//结点数量增加

}

下面是全部代码

LinkList.h文件

#ifndef LINKLIST_H
#define LINKLIST_H

#include<stdio.h>
#include<iostream>
#include<stdlib.h>

//链表结点
typedef struct LINKNODE
{
    void *data;//指向任何类型的数据 
    struct LINKNODE  *next;
}LinkNode;

//链表头结点
typedef struct LINKLIST
{
    LinkNode  *head;
    int size;//结点数量
}LinkList;

//打印函数指针
typedef void(*PRINTLINKNODE)(void*);

//初始化链表
LinkList  *Init_LinkList();
//指定位置插入
void Insert_LinkList(LinkList  *list, int pos, void *data);
//删除指定位置的值
void Remove_LinkList(LinkList  *list, int pos);
//获取链表的长度
int Size_LinkList(LinkList  *list);
//查找某个值
int Find_LinkList(LinkList  *list,void  *data);
//返回第一个节点
void  *Front_LinkList(LinkList  *list);
//打印链表节点
void Print_LinkList(LinkList  *list, PRINTLINKNODE print);
//释放链表内存
void Free_LinkList(LinkList  *list);

#endif // !LINKLIST_H

LinkList.cpp文件

#include "LinkList.h"

LinkList * Init_LinkList()
{
    LinkList  *list = (LinkList*)malloc(sizeof(LinkList));
    list->size = 0;

    //头节点,是不保存数据的
    list->head = (LinkNode*)malloc(sizeof(LinkNode));
    list->head->data = NULL;
    list->head->next = NULL;
    return list;
}

void Insert_LinkList(LinkList * list, int pos, void * data)
{
    if (list == NULL)
    {
        return;
    }
    if (data == NULL)
    {
        return;
    }
    //友好处理,pos越界
    if (pos<0 || pos>list->size)
    {
        pos = list->size;
    }

    //创建新的节点
    LinkNode  *nowNode = (LinkNode*)malloc(sizeof(LinkNode));
    nowNode->data = data;
    nowNode->next = NULL;

    //找节点
    //辅助指针变量
    LinkNode  *pCurrent = list->head;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }

    //新节点入链表
    nowNode->next = pCurrent->next;
    pCurrent->next = nowNode;

    list->size++;

}

void Remove_LinkList(LinkList * list, int pos)
{
    if (list == NULL)
    {
        return;
    }
    if (pos < 0 || pos >= list->size)
    {
        return;
    }
    //查找删除节点的前一个节点
    LinkNode  *pCurrent = list->head;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }
    //缓存删除的节点
    LinkNode  *pDel = pCurrent->next;
    pCurrent->next = pDel->next;
    //释放删除节点的内存
    free(pDel);
    list->size--;
}

int Size_LinkList(LinkList * list)
{
    return list->size;
}

int Find_LinkList(LinkList * list, void * data)
{
    if (list == NULL)
    {
        return -1;
    }
    if (data == NULL)
    {
        return -1;
    }

    LinkNode *pCurrent = list->head->next;
    int i = 0;
    for (; i < list->size; i++)
    {
        if (pCurrent->data == data)
        {
            break;
        }
        pCurrent = pCurrent->next;
    }

    return i;
}

void * Front_LinkList(LinkList * list)
{
    return list->head->next->data;
}

void Print_LinkList(LinkList * list, PRINTLINKNODE print)
{
    if (list == NULL)
    {
        return;
    }
    LinkNode  *pCurrent = list->head->next;
    while (pCurrent != NULL)
    {
        print(pCurrent->data);
        pCurrent = pCurrent->next;
    }
}

void Free_LinkList(LinkList * list)
{
    if (list == NULL)
    {
        return ;
    }
    LinkNode *pCurrent = list->head;
    while (pCurrent != NULL)
    {
        LinkNode  *pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }
    free(list);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值