C++链表实现

链表 数据结构=结构定义+结构操作
1.链表体
2.链表头
3.链表插入
4.链表删除元素
5.链表释放
代码实现

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 /// 链表体
typedef struct ListNode {
    int data;
    struct ListNode* next;
} ListNode;
//链表头
typedef struct LinkList {
    ListNode head;
    int length;
} LinkList;
//初始化链表体
ListNode* init_listnode(int val) {
    ListNode* p = (ListNode*)malloc(sizeof(ListNode));
    p->data = val;
    p->next = NULL;
    return p;
}
//初始化链表头
LinkList* init_linklist() {
    LinkList* l = (LinkList*)malloc(sizeof(LinkList));
    l->head.next = NULL;
    l->length = 0;
    return l;
}
//清除链表 释放内存
void clear_listnode(ListNode* node) {
    if (node == NULL) return;
    free(node);
    return;
}
//清除
void clear_linklist(LinkList* l) {
    if (l == NULL) return;
    ListNode* p = l->head.next, * q;
    while (p) {
        q = p->next;
        clear_listnode(p);
        p = q;
    }
    free(l);
    return;
}
//插入
int insert(LinkList* l, int ind, int val) {
    if (l == NULL) return 0;
    if (ind < 0 || ind > l->length) return 0;

    ListNode* p = &(l->head), * node = init_listnode(val);
    while (ind--) {
        p = p->next;
    }
    node->next = p->next;
    p->next = node;
    l->length += 1;
    return 1;
}
//删除
int erase(LinkList* l, int ind) {
    if (l == NULL) return 0;
    if (ind < 0 || ind >= l->length) return 0;
    ListNode* p = &(l->head), * q;
    while (ind--) {
        p = p->next;
    }
    q = p->next->next;
    clear_listnode(p->next);
    p->next = q;
    l->length -= 1;
    return 1;
}
//输出
void output(LinkList* l) {
    printf("LinkList(%d) : ", l->length);
    for (ListNode* p = l->head.next; p; p = p->next) {
        printf("%d -> ", p->data);
    }
    printf("NULL\n");
    return;
}

#define MAX_OP 30

int main() {
    srand(time(0));
    LinkList* l = init_linklist();
    for (int i = 0; i < MAX_OP; i++) {
        int op = rand() % 3;
        int ind = rand() % (l->length + 1);
        int val = rand() % 100;
        switch (op) {
        case 0:
        case 1: {
            printf("insert %d at %d to LinkList = %d\n",
                val, ind, insert(l, ind, val));
        } break;
        case 2: {
            printf("erase item at %d from LinkList = %d\n",
                ind, erase(l, ind));
        } break;
        }
        output(l);
        printf("\n");
    }
    clear_linklist(l);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值