zoukankan      html  css  js  c++  java
  • C++实现企业链表(单向链表的另外一种实现方式)

    LinkList.h

    #include <windows.h>
    #include <stdio.h>
    
    // 链表小结点
    typedef struct LINKNODE
    {
        LINKNODE* next;
    }LinkNode;
    
    // 链表结点
    typedef struct LINKLIST
    {
        LinkNode head;
        int size;
    }LinkList;
    
    // 遍历结点的函数指针
    typedef void(*PRINTLINKNODE)(LinkNode*);
    
    // 比较函数指针
    typedef int(*COMPARENODE)(LinkNode*, LinkNode*);
    
    // 初始化链表
    LinkList* Init_LinkList();
    
    // 根据位置插入语一个结点
    void Insert_LinkList(LinkList* list, int pos, LinkNode* data);
    
    // 根据位置删除一个结点
    void RemoveByPos_LinkList(LinkList* list, int pos);
    
    // 查找结点
    int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare);
    
    // 返回链表的大小
    int Size_LinkList(LinkList* list);
    
    // 打印链表
    void Print_LinkList(LinkList* list, PRINTLINKNODE print);
    
    // 释放内存
    void FreeMem_LinkList(LinkList* list);

    LinkList.cpp

    #include "LinkList.h"
    
    // 初始化链表
    LinkList* Init_LinkList()
    {
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
        list->head.next = NULL;
        return list;
    }
    
    // 根据位置插入语一个结点
    void Insert_LinkList(LinkList* list, int pos, LinkNode* data)
    {
        if (list == NULL || data == NULL)
        {
            return;
        }
        if (pos < 0 || pos >= list->size)
        {
            pos = list->size;
        }
        LinkNode* pCurrent = &(list->head);
        for (int i = 0; i < pos; i++)
        {
            pCurrent = pCurrent->next;
        }
        data->next = pCurrent->next;
        pCurrent->next = data;
        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;
        }
        pCurrent->next = pCurrent->next->next;
        list->size--;
    }
    
    // 查找结点
    int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare)
    {
        if (list == NULL || data == NULL)
        {
            return -1;
        }
        int flag = -1;
        int index = 0;
        LinkNode* pCurrent = list->head.next;
        while (pCurrent != NULL)
        {
            if (compare(data, pCurrent) == 0)
            {
                flag = index; 
                break;
            }
            pCurrent = pCurrent->next;
            index++;
        }
        return flag;
    }
    
    // 返回链表的大小
    int Size_LinkList(LinkList* list)
    {
        if (list == NULL)
        {
            return -1;
        }
        return list->size;
    }
    
    // 打印链表
    void Print_LinkList(LinkList* list, PRINTLINKNODE print)
    {
        if (list == NULL)
        {
            return;
        }
        LinkNode* pCurrent = list->head.next;
        while (pCurrent != NULL)
        {
            print(pCurrent);
            pCurrent = pCurrent->next;
        }
    }
    
    // 释放内存
    void FreeMem_LinkList(LinkList* list)
    {
        if (list == NULL)
        {
            return;
        }
        free(list);
    }

    main.cpp

    #include "LinkList.h"
    
    typedef struct PERSON{
        LinkNode node;
        char name[64];
        int age;
    }Person;
    
    void MyPrint(LinkNode* data)
    {
        Person* p = (Person*)data;
        printf("Name:%s, Age:%d
    ", p->name, p->age);
    }
    
    int MyCompare(LinkNode* node1, LinkNode* node2)
    {
        Person* p1 = (Person*)node1;
        Person* p2 = (Person*)node2;
        if ((p1->age == p2->age) && (strcmp(p1->name, p2->name) == 0))
        {
            return 0;
        }
        return -1;
    }
    
    int main()
    {
        //创建链表
        LinkList* list = Init_LinkList();
    
        //创建数据
        Person p1, p2, p3, p4, p5;
        strcpy_s(p1.name, sizeof("aaa"), "aaa");
        strcpy_s(p2.name, sizeof("bbb"), "bbb");
        strcpy_s(p3.name, sizeof("ccc"), "ccc");
        strcpy_s(p4.name, sizeof("ddd"), "ddd");
        strcpy_s(p5.name, sizeof("eee"), "eee");
    
        p1.age = 10;
        p2.age = 20;
        p3.age = 30;
        p4.age = 40;
        p5.age = 50;
    
        //将结点插入链表
        Insert_LinkList(list, 0, (LinkNode*)&p1);
        Insert_LinkList(list, 0, (LinkNode*)&p2);
        Insert_LinkList(list, 0, (LinkNode*)&p3);
        Insert_LinkList(list, 0, (LinkNode*)&p4);
        Insert_LinkList(list, 0, (LinkNode*)&p5);
    
        //打印
        Print_LinkList(list, MyPrint);
        //删除结点
        RemoveByPos_LinkList(list, 2);
    
        //打印
        printf("---------------
    ");
        Print_LinkList(list, MyPrint);
        printf("---------------
    ");
    
        //查找
        Person findP;
        strcpy_s(findP.name, sizeof("bbb"), "bbb");
        findP.age = 20;
        int pos = Find_LinkList(list, (LinkNode*)&findP, MyCompare);
        printf("位置:%d
    ", pos);
    
        //释放链表内存
        FreeMem_LinkList(list);
        getchar();
        return 0;
    }
  • 相关阅读:
    PowerDesigner如何导出建表sql脚本(转)
    excel插入行时提示不能将对象移到工作表外,怎么解决!!
    Axure知识点
    移动互联网学习的点
    什么是大数据?
    [Android开源项目] GitHub开源项目总结 (转)
    程序员自我提高的几点建议 很实诚(转)
    程序员必须进行的10项投资(转)
    安卓版本的问题
    Android APK反编译详解(转)
  • 原文地址:https://www.cnblogs.com/duxie/p/11306083.html
Copyright © 2011-2022 走看看