【数据结构】企业链表

  •  链表推演

  • 企业链表思路图

  •  企业链表框架
// 链表小结点
typedef struct LINKNODE {
    struct LINKNODE* next;
}LinkNode;

// 链表大结点
typedef struct LINKLIST {
    LinkNode head;
    int size;
}LinkList;
  • 企业链表声明
// 遍历函数指针
typedef void(*PRINTNODE)(LinkNode*);

// 比较函数指针
typedef int(*COMPARENODE)(LinkNode*, LinkNode*);

// 初始化链表
LinkList* Init_LinkList();

// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data);

// 删除
void Remove_LinkList(LinkList* list, int pos);

// 查找
int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE print);

// 返回链表大小
int Size_LinkList(LinkList* list);

// 打印
void Print_LinkList(LinkList* list, PRINTNODE print);

// 释放链表内存
void FreeSpace_LinkList(LinkList* list);
  • 企业链表实现
// 初始化链表
LinkList* Init_LinkList() {

    LinkList* list = (LinkList*)malloc(sizeof(LinkList));
    list->head.next = NULL;
    list->size = 0;
    return list;
}

// 插入
void Insert_LinkList(LinkList* list, int pos, LinkNode* data) {

    if (list == NULL) return;
    if (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 Remove_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) {

    int pos = -1;
    if (list == NULL) return pos;
    if (data == NULL) return pos;

    // 辅助指针变量
    LinkNode* pCurrent = &(list->head);
    int index = -1;
    while (pCurrent != NULL) {

        if (compare(pCurrent, data) == 0) {
            pos = index;
            break;
        }
        pCurrent = pCurrent->next;
        index++;
    }
    return pos;
}

// 返回链表大小
int Size_LinkList(LinkList* list) {
    return 0;
}

// 打印
void Print_LinkList(LinkList* list, PRINTNODE print) {

    if (list == NULL) return;
    // 放的是 LinkNode* 结点
    // 辅助指针
    LinkNode* pCurrent = list->head.next; // 头节点下一个
    while (pCurrent != NULL) {
        print(pCurrent);
        pCurrent = pCurrent->next;
    }
}

// 释放链表内存
void FreeSpace_LinkList(LinkList* list) {

    if (list == NULL) return;

    free(list);
}
  • 测试代码
typedef struct PERSON {
    LinkNode node; // 相当于 next
    char name[64];
    int age;
}Person;

void MyPrint(LinkNode* data) {
    Person* p = (Person*)data; // 转化回去
    printf("name: %s age: %d\n", p->name, p->age);
}

int MyCompare(LinkNode* data1, LinkNode* data2) {
    Person* val1 = (Person*)data1; // 转化
    Person* val2 = (Person*)data2;

    if (strcmp(val1->name, val2->name)== 0 && val1->age == val2->age) {
        return 0;
    }
    else return -1;
}

void test01() {
    // 创建链表
    LinkList* list = Init_LinkList();

    // 创建数据
    Person  p1, p2, p3, p4, p5;
    strcpy(p1.name, "aaa");
    strcpy(p2.name, "bbb");
    strcpy(p3.name, "ccc");
    strcpy(p4.name, "ddd");
    strcpy(p5.name, "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); // pos = 0 相当头插

    // 删除
    Remove_LinkList(list, 1); // p4 被删除

    // 打印
    Print_LinkList(list, MyPrint);

    // 查找
    Person find_p;
    strcpy(find_p.name, "aaa");
    find_p.age = 10;
    Person find_p2;
    strcpy(find_p2.name, "eee");
    find_p2.age = 50;
    int pos = Find_LinkList(list, (LinkNode*)&find_p2, MyCompare);
    printf("find_p pos = %d", pos); // 0

    // 销毁
    FreeSpace_LinkList(list);
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值