• 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
    ", 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("---------------
    ");
        Print_LinkList(list, MyPrint);
        //返回第一个结点
        printf("-----查找结果------------
    ");
        Person* ret = (Person*)Front_LinkList(list);
        printf("Name:%s Age:%d Score:%d
    ", ret->name, ret->age, ret->score);
    
        //销毁链表
        Front_LinkList(list);
        getchar();
        return 0;
    }
  • 相关阅读:
    JSP中<base href="<%=basePath%>">作用
    转 jdk1.5新特性 ConcurrentHashMap
    单例设计模式与类加载顺序详解
    归并排序-java
    插入排序-java
    冒泡排序-java
    选择排序-java
    JS的object数据类型
    JS的事件
    JS的捕捉回车键
  • 原文地址:https://www.cnblogs.com/duxie/p/11306056.html
Copyright © 2020-2023  润新知