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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM