#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct Node {
int data; // 结点数据
struct Node *next; // 下一个结点的地址
} Node;
Node *initList() {
// 初始化链表,返回头节点的地址,即头指针
Node *H = (Node *) malloc(sizeof(Node));
// 为头结点开辟空间,返回一个地址,赋值给指针H,
// 指针的类型强转,解引用会解引用Node个字节得到头指针H
H->data = 0;
// ok,得到头指针,给头结点结构体中的data赋值0;
// 头指针中的data代表单向链表的长度,初始长度当然为0
H->next = NULL;
// 头结点结构体中的next为空
return H;
}
void headInsert(Node *H, int data) {
// 从头位置插入的方法
// 先开辟一个Node空间,返回地址交给指针
Node *node = (Node *) malloc(sizeof(Node));
// 堆中开辟空间,函数调用完依旧存在
node->data = data;
node->next = H->next;
H->next = node;
H->data++; // 头指针中的data代表长度
// 在这里仅仅给头指针指向的next指针和data重新赋值,
// 故传入头指针即可,对头指针没有需记录的操作
}
void tailInsert(Node *H, int data) {
// 与头位置插入不一样,这是从末尾插入的方法
Node *temp = H;
// 去找到最末尾的结点
int length = H->data;
for (int i = 0; i < length; ++i) {
temp = temp->next;
}
// temp 是末尾的结点的地址
Node *node = (Node *) malloc(sizeof(Node));
// 开辟空间,返回一个地址赋值给指针node,并强转类型,让node的解引用会解引用Node个字节
node->data = data;
// 这个新结点的数据赋值
node->next = NULL;
// 这个新结点 指向空,即作为最后一个节点,指向null
temp->next = node;
// 原来末尾的那个结点,现成为倒数第二个结点,指向这个新加入的新最后一个结点
// 因为自始至终,赋值改变都是对指针指向的结构体中的数据data或是next,
// 从未对指针有过改变需求,故这里的传参只传头结点的地址即头指针即可
// 整个过程改变了原来最后结点结构体中的指针,由指向null改变为指向新结
【C语言数据结构之单向链表】定义结点,初始化链表,头位置插入,尾位置插入,遍历输出,通过data查询并删除某节点
于 2023-06-04 16:19:23 首次发布