C++实现单向链表

LinkList.h

 

#include <windows.h>
#include <stdio.h>

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

// 链表结构体
typedef struct LINKLIST
{
    int size;
    LinkNode* head;
}LinkList;

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

// 初始化链表
LinkList* Init_LinkList();

// 指定位置插入
void Insert_LinkList(LinkList* list, int pos, void* data);

// 指定位置删除
void RemoveByPos_LinkList(LinkList* list, int pos);

// 获得链表的长度
int GetLinkListSize(LinkList* list);

// 查找(根据数据返回索引)
int Find_LinkList(LinkList* list, void* data);

// 返回第一个结点
void* Front_LinkList(LinkList* list);

// 释放链表内存
void FreeMem_LinkList(LinkList* list);

// 打印链表
void Print_LinkList(LinkList* list, PRINTLINKNODE);

 

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 || data == NULL)
    {
        return;
    }
    if (pos < 0 || pos > list->size)
    {
        pos = list->size;
    }
    // 创建新的结点
    LinkNode* InsertNode = (LinkNode*)malloc(sizeof(LinkNode));
    InsertNode->data = data;
    InsertNode->next = NULL;
    // 找结点
    LinkNode* pCurrent = list->head;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }
    // 将新结点插入链表
    InsertNode->next = pCurrent->next;
    pCurrent->next = InsertNode;
    // 链表大小加1
    list->size++;
}

// 指定位置删除
void RemoveByPos_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 = pCurrent->next->next;
    free(pDel);
    // 链表长度减一
    list->size--;
}

// 获得链表的长度
int GetLinkListSize(LinkList* list)
{
    if (list == NULL)
    {
        return - 1;
    }
    return list->size;
}

// 查找(根据数据返回索引)
int Find_LinkList(LinkList* list, void* data)
{
    if (list == NULL || data == NULL)
    {
        return -1;
    }
    int pos = -1;
    LinkNode* pCurrent = list->head->next;
    for (int i = 0; i < list->size; i++)
    {
        if (pCurrent->data == data)
        {
            pos = i;
            break;
        }
        pCurrent = pCurrent->next;
    }
    return pos;
}

// 返回第一个结点
void* Front_LinkList(LinkList* list)
{
    return list->head->next->data;
}

// 释放链表内存
void FreeMem_LinkList(LinkList* list)
{
    if (list == NULL)
    {
        return;
    }
    LinkNode* pCurrent = list->head;
    while (pCurrent != NULL)
    {
        LinkNode* pDel = pCurrent;
        pCurrent = pCurrent->next;
        free(pDel);
    }
    list->size = 0;
    free(list);
}

// 打印链表
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;
    }
}

 

main.cpp

 

#include "LinkList.h"

//自定义数据类型
typedef struct PERSON
{
    char name[64];
    int age;
    int score;
}Person;

//打印函数
void MyPrint(void* data)
{
    Person* p = (Person*)data;
    printf("Name:%s Age:%d Score:%d\n", p->name, p->age, p->score);
}

int main()
{
    //创建链表
    LinkList* list = Init_LinkList();

    //创建数据
    Person p1 = { "aaa", 18, 100 };
    Person p2 = { "bbb", 19, 99 };
    Person p3 = { "ccc", 20, 101 };
    Person p4 = { "ddd", 17, 97 };
    Person p5 = { "eee", 16, 59 };

    //数据插入链表
    Insert_LinkList(list, 0, &p1);
    Insert_LinkList(list, 0, &p2);
    Insert_LinkList(list, 0, &p3);
    Insert_LinkList(list, 0, &p4);
    Insert_LinkList(list, 0, &p5);

    //打印
    Print_LinkList(list, MyPrint);

    //删除3
    RemoveByPos_LinkList(list, 3);

    //打印
    printf("---------------\n");
    Print_LinkList(list, MyPrint);
    //返回第一个结点
    printf("-----查找结果------------\n");
    Person* ret = (Person*)Front_LinkList(list);
    printf("Name:%s Age:%d Score:%d\n", ret->name, ret->age, ret->score);

    //销毁链表
    Front_LinkList(list);
    getchar();
    return 0;
}

 

原文链接: https://www.cnblogs.com/duxie/p/11306056.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++实现单向链表

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/300322

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午9:21
下一篇 2023年2月15日 下午9:21

相关推荐