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

C++实现单向链表

发布时间:2020-12-16 10:47:17 所属栏目:百科 来源:网络整理
导读:LinkList.h ? #include windows.h #include stdio.h // 链表结点 typedef struct LINKNODE{ void * data; // 可以指向任何类型的数据 LINKNODE* next;}LinkNode; // 链表结构体 typedef struct LINKLIST{ int size; LinkNode * head;}LinkList; // 打印函数

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,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:%dn",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,&p3);
    Insert_LinkList(list,&p4);
    Insert_LinkList(list,&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:%dn",ret->name,ret->age,ret->score);

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

(编辑:李大同)

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

    推荐文章
      热点阅读