[C语言]STL-链表(LinkList)结构简单实现

链表(LinkList)结构简单实现

[C++]STL-list容器

头文件:LinkList.h

#ifndef  LINK_LIST_H  //防止头文件被重复调用
#define LINK_LIST_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表节点
typedef struct LISTNODE {
    void* data;   //无类型指针可以指向任何类型数据
    struct LISTNODE* next;
} ListNode;

//链表结构体
typedef struct LINKLIST {
    ListNode* head;  //存放链表首地址
    int size;  //当前元素个数
    //链表不需要当前容量。因为不需要提前分配内存
}LinkList;


//打印函数指针
typedef void(*PRINTLINKNODE)(void*);




//初始化链表
LinkList* LINK_LIST_INIT();
//在指定位置插入
void Insert_LinkList(LinkList*,int,void* );
//删除指定位置的值
void RemoveByPos_LinkList(LinkList*, int);
//获得链表长度
int Size_LinkList(LinkList*);
//返回第一个节点
void* Front_LinkList(LinkList*);
//查找值的位置
int Find_LinkList(LinkList*,void*);
//打印链表节点
void Print_LinkList(LinkList*,PRINTLINKNODE);
//释放链表内存
void FreeSpace_LinkList(LinkList*);

#endif LINK_LIST_H

实现文件:LinkList.c

#include"LinkList.h"



//初始化链表
LinkList* LINK_LIST_INIT() {
    LinkList* mylist = (LinkList*)malloc(sizeof(LinkList));
    mylist->size = 0;
    //头节点, 不保存数据信息,为了使结构更加清晰
    mylist->head = (ListNode*)malloc(sizeof(ListNode));
    //初始化头节点
    mylist->head->data = NULL;
    mylist->head->next = NULL;

    return mylist;
}
//在指定位置插入
void Insert_LinkList(LinkList*list, int pos, void* data) {
    //先判断传入数据指针是否有空值
    if (list == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    //判断插入位置是否在范围内
    //进行友好处理,如果pos越界,就将数据插入到尾部
    if (pos<0 || pos>list->size) {
        pos = list->size;
    }
    //创建新的节点
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    newNode->data = data;
    newNode->next = NULL;
    //找到指定节点
    //辅助指针
    ListNode* pCurrent = list->head;  
    for (int i = 0; i < pos; i++) {
        pCurrent = pCurrent->next;
    }
    //将新节点插入链表
    newNode->next = pCurrent->next;
    pCurrent->next = newNode;

    list->size++;
}
//删除指定位置的值
void RemoveByPos_LinkList(LinkList* list, int pos) {
    //先判断传入数据指针是否有空值
    if (list == NULL) {
        return;
    }
    //判断插入位置是否在范围内
    if (pos<0 || pos>list->size) {
        return;
    }
    ListNode* pCurrent = list->head;
    //查找删除节点前一个节点
    for (int i = 0; i < pos - 1; i++) {
        pCurrent = pCurrent->next;
    }
    //缓存删除节点
    ListNode* pDel = pCurrent->next;
    pCurrent->next = pDel->next;
    //释放删除节点内存
    free(pDel);
}
//获得链表长度
int Size_LinkList(LinkList* list) {
    return list->size;
}
//返回第一个节点
void* Front_LinkList(LinkList* list) {
    return list->head->next->data;
}
//查找值的位置
int Find_LinkList(LinkList* list, void* data) {
    if (list == NULL) {
        return-1;
    }
    if (data == NULL) {
        return-1;
    }
    //遍历查找
    ListNode* pCurrent = list->head->next;
    int i = 0;  //记录位置
    while (pCurrent!=NULL) {
        if(pCurrent==data){
            break;
        }
        i++;
        pCurrent = pCurrent->next;
    }
    return i;
}
//打印链表节点
void Print_LinkList(LinkList* list, PRINTLINKNODE print) {
    if (list == NULL) {
        return;
    }
    //辅助指针变量
    ListNode* pCurrent = list->head->next;
    while (pCurrent != NULL) {
        print(pCurrent->data);
        pCurrent = pCurrent->next;
    }
}
//释放链表内存
void FreeSpace_LinkList(LinkList* list) {
    if (list == NULL) {
        return;
    }
    //辅助指针变量
    ListNode* pCurrent = list->head;
    while (pCurrent != NULL) {
        //先缓存下一个节点
        ListNode* pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }

    //最后释放链表内存
    list->size = 0;
    free(list);
}

主文件:Main.c

//自定义数据类型
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);
}


void LinkListTest() {
    //创建链表
    LinkList* list = LINK_LIST_INIT();
    //创建数据
    Person p1 = { "Tom",18,99 };
    Person p2 = { "Bob",14,95 };
    Person p3 = { "Leslie",15,94 };
    Person p4 = { "Hugo",18,91 };
    Person p5 = { "Lala",20,100 };
    //将数据插入链表
    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);
    printf("----------------------\n");
    //调用删除方法
    RemoveByPos_LinkList(list, 3);
    Print_LinkList(list, MyPrint);
    //返回第一个节点
    Person* ret=(Person*)Front_LinkList(list);
    printf("----------------------\n");
    printf("Name:%s,Age:%d,Score:%d\n", ret->name, ret->age, ret->score);
    //销毁链表
    FreeSpace_LinkList(list);
}

int main(){
    LinkListTest();
    system("pause");
    return 0;
}

原文链接: https://www.cnblogs.com/renboyu/p/13150249.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [C语言]STL-链表(LinkList)结构简单实现

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/371233

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月3日 上午10:40
下一篇 2023年3月3日 上午10:40

相关推荐