单链表操作(single list)

1,单链表接口

cpp 复制代码
#include "single_list.h"
/*
* 单链表是一种基础的数据结构,它由一系列节点组成,每个节点包含两个部分:一个数据域和一个指向下一个节点的指针域。
* 在单链表中,数据元素可以非连续地存储在内存中,而节点之间通过指针相互连接
*/

Node * create_node(int data) {
    // 创建节点
    Node *node = (Node *)malloc(sizeof(Node));
    if(!node) {
        return NULL; // 内存分配失败
    }
    node->data = data;
    node->next = NULL; // 初始化指针域为NULL
    return node;
} 

int insert_Head(Node *head, Node *new_node) {
    if (!new_node || !head) {
        return -1; // 检查参数是否有效
    }

    new_node->next = head->next; // 将新节点的指针域指向头节点的下一个节点
    head->next = new_node; // 将头节点的指针域指向新节点

    return 0; // 插入成功   
}

int insert_Tail(Node *head, Node *new_node) {
    Node *p = head; // 从头节点开始遍历

    if (!new_node ||!head) {
        return -1; // 检查参数是否有效
    }

    while (p->next != NULL) { // 找到最后一个节点
        p = p->next;
    }

    p->next = new_node; // 将最后一个节点的指针域指向新节点
    new_node->next = NULL; // 将新节点的指针域指向NULL

    return 0; // 插入成功   
}

int delete_node_by_index(Node *head, int index) {
    Node *p = head;
    Node *q = NULL;
    int i = 0;

    if (!head) {
        return -1; // 检查参数是否有效
    }

    while (p->next!= NULL && i < index) { // 找到要删除的节点
        q = p; // 记录前一个节点
        p = p->next; // 移动到下一个节点
        i++;
    }

    if (i != index) { // 检查是否找到要删除的节点
        return -1; // 未找到
    }

    q->next = p->next; // 将前一个节点的指针域指向要删除节点的下一个节点
    free(p); // 释放要删除的节点的内存

    return 0; // 删除成功
}

int delete_node_by_value(Node *head, int value) {
    Node *p = head;
    Node *q = NULL;

    if (!head) {
        return -1; // 检查参数是否有效
    }

    while (p->next!= NULL && p->data != value) { // 找到要删除的节点
        q = p; // 记录前一个节点
        p = p->next; // 移动到下一个节点
    }       
    if (p->data!= value) { // 检查是否找到要删除的节点
        return -1; // 未找到
    }

    q->next = p->next; // 将前一个节点的指针域指向要删除节点的下一个节点
    free(p); // 释放要删除的节点的内存

    return 0; // 删除成功
}

int get_node_by_index(Node *head, int index, int *value) {
    Node *p = head;
    int i = 0;

    if (!head || !value) {
        return -1; // 检查参数是否有效
    }
    while(p->next!=NULL && i < index) {
        p = p->next; // 移动到下一个节点
        i++;
    }

    if(p) {
        *value = p->data; // 获取节点的值
        return 0; // 获取成功
    }

    return -1; // 获取失败
}

void print_list(Node *head) {
    Node *p = head->next; // 从第一个节点开始遍历
    int index = 0;

    while (p!= NULL) { // 遍历链表
        printf("index[%d] : %d\n", index++, p->data); // 打印节点的值
        p = p->next; // 移动到下一个节点
    }
}
void free_list(Node *head) {
    Node *p = head->next; // 从第一个节点开始遍历
    Node *q = NULL;

    while (p!= NULL) { // 遍历链表
        q = p->next; // 保存下一个节点
        free(p); // 释放当前节点的内存
        p = q; // 移动到下一个节点
    }
}

头文件:

cpp 复制代码
#ifndef SINGLE_LIST_H 
#define SINGLE_LIST_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int data;
    Node *next;
} Node;

Node * create_node(int data);

int insert_Head(Node *head, Node *new_node);

int insert_Tail(Node *head, Node *new_node);

int delete_node_by_index(Node *head, int index);

int delete_node_by_value(Node *head, int value);

int get_node_by_index(Node *head, int index, int *value);

void print_list(Node *head);

void free_list(Node *head);

#endif

Makefile:

cpp 复制代码
TARGET := signal
CC := gcc
SRC := single_list.c main.c 
LDFLAGS := single_list.h

all: $(TARGET)

$(TARGET): $(SRC) $(LDFLAGS)
	$(CC) $(SRC) -o $(TARGET)

clean:
	rm -f $(TARGET)

2,实例程

cpp 复制代码
#include "single_list.h"

int main() {
    Node *head = NULL; // 初始化头指针
    int i = 0;

    head = create_node(0);

    for(i =10 ; i <20; i++) {
        insert_Head(head, create_node(i));
    }
    print_list(head);
    free_list(head);
}

总结:

以上实现了一个简单的单链表的接口,仅仅学习使用。

相关推荐
祁同伟.10 分钟前
【C++】二叉搜索树(图码详解)
开发语言·数据结构·c++·容器·stl
Joy T40 分钟前
Solidity智能合约存储与数据结构精要
数据结构·区块链·密码学·智能合约·solidity·合约function
海绵宝宝的好伙伴1 小时前
【数据结构】哈希表的理论与实现
数据结构·哈希算法·散列表
Aqua Cheng.1 小时前
代码随想录第七天|哈希表part02--454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
java·数据结构·算法·散列表
zym大哥大1 小时前
哈希表封装myunordered_map以及set
数据结构·散列表
怀揣小梦想1 小时前
跟着Carl学算法--哈希表
数据结构·c++·笔记·算法·哈希算法·散列表
Kent_J_Truman1 小时前
【模拟散列表】
数据结构·算法·蓝桥杯·散列表·常识类
努力努力再努力wz1 小时前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
加油=^_^=1 小时前
【C++】哈希表
数据结构·c++·散列表
普通网友1 小时前
哈希表:高效存储与查找的核心原理
数据结构·哈希算法·散列表·csdn