加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++实现企业链表(单向链表的另外一种实现方式)

发布时间:2020-12-16 10:47:14 所属栏目:百科 来源:网络整理
导读: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)(

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,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,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:%dn",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,(LinkNode*)&p3);
    Insert_LinkList(list,(LinkNode*)&p4);
    Insert_LinkList(list,(LinkNode*)&p5);

    //打印
    Print_LinkList(list,MyPrint);
    //删除结点
    RemoveByPos_LinkList(list,2);

    //打印
    printf("---------------n");
    Print_LinkList(list,MyPrint);
    printf("---------------n");

    //查找
    Person findP;
    strcpy_s(findP.name,"bbb");
    findP.age = 20;
    int pos = Find_LinkList(list,(LinkNode*)&findP,MyCompare);
    printf("位置:%dn",pos);

    //释放链表内存
    FreeMem_LinkList(list);
    getchar();
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读