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);
}
总结:
以上实现了一个简单的单链表的接口,仅仅学习使用。