C语言链表相关操作

/*
 * 链表实现
 * 未使用虚拟头节点
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
    int e;
    struct Node *next;
} *Node; // struct Node* -> Node

typedef struct LinkedList{
    int size;
    Node head;
} *LinkedList; // struct LinkedList* -> LinkedList
// 初始化
LinkedList initiation() {
    LinkedList list = (LinkedList) malloc(sizeof (struct LinkedList));
    list->size = 0;
    list->head = NULL;
    if (list == NULL) {
        perror("Initiation failed");
        exit(-1);
    }
    return list;
}
// 获取元素个数
int getSize(LinkedList l) {
    return l->size;
}
// 判断链表是否空
int isEmpty(LinkedList l) {
    return l->size == 0;
}
// 链头添加
void addFirst(int e, LinkedList l) {
    Node new = (Node) malloc(sizeof (struct Node));
    new->next = l->head;
    new->e = e;
    l->head = new;
    l->size++;
}
// 在index位置插入
void add(int index, int e, LinkedList l) {
    if (index < 0 || index > l->size) {
        perror("Add failed, illegal index");
        exit(-1);
    }
    if (index == 0) {
        addFirst(e, l);
    } else {
        Node prev = l->head;
        // 找到待添加的前一个位置
        for (int i = 0; i < index - 1; i ++) {
                prev = prev->next;
        }
        Node new = (Node) malloc(sizeof (struct Node));
        new->e = e;
        new->next = prev->next;
        prev->next = new;
        l->size++;
    }
}
void addLast(int e, LinkedList l) {
    add(l->size, e, l);
}
// 更改index位置元素
void set(int index, int e, LinkedList l) {
    if (index < 0 || index >= l->size) {
        perror("Set failed, Illegal index");
        exit(-1);
    }
    Node cur = l->head;
    for (int i = 0; i < index; i ++) {
        cur = cur->next;
    }
    cur->e = e;
}
// 获得index位置元素
int get(int index, LinkedList l) {
    if (index < 0 || index >= l->size) {
        perror("Get failed, illegal index");
        return -1;
    }
    Node cur = l->head;
    for (int i = 0; i < index; i ++) {
        cur = cur->next;
    }
    return cur->e;
}
int getFirst(LinkedList l) {
    return get(0, l);
}
int getLast(LinkedList l) {
    return get(l->size - 1, l);
}
// 查看是否含有元素e
int contains(int e, LinkedList l) {
    Node cur = l->head;
    while(cur != NULL) {
        if (cur->e == e) {
            return 1;
        }
        cur = cur->next;
    }
    return 0;
}
// 删除头节点元素
int removeFirst(LinkedList l) {
    int ret = l->head->e;
    Node cur = l->head;
    l->head = l->head->next;
    cur->next = NULL;
    free(cur);
    cur = NULL;
    l->size--;
    return ret;
}
// 删除index位置元素
int removeE(int index, LinkedList l) {
    if (index < 0 || index > l->size - 1) {
        perror("Remove failed, illegal index");
        return -1;
    }
    if (index == 0) {
        removeFirst(l);
    }
    Node prev = l->head;
    for (int i = 0; i < index - 1; i ++) {
        prev = prev->next;
    }
    int ret = prev->next->e;
    Node del = prev->next;
    prev->next = del->next;
    del->next = NULL;
    free(del);
    del = NULL;
    l->size--;
    return ret;
}
int removeLast(LinkedList l) {
    return removeE(l->size - 1, l);
}
// 打印链表
void toString(LinkedList l) {
    printf("LinkedList: size = %d\n", l->size);
    Node cur = l->head;
    while (cur != NULL) {
        printf("%d->", cur->e);
        cur = cur->next;
    }
    printf("NULL\n");
}
// 销毁链表
void destroy(LinkedList l) {
    Node cur = l->head;
    while (cur != NULL) {
        cur = cur->next;
        free(l->head);
        l->head = cur;
    }
    if (l->head == NULL) {
        free(l);
        l = NULL;
        if (l == NULL) {
            printf("The linkedList has successfully been destroyed.\n");
        } else {
            perror("LinkedList destroy failed");
            exit(-1);
        }
    } else {
        perror("LinkedList destroy failed");
        exit(-1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Llizzzc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值