背景
- 链表可以看作是可变数组的另外一种实现,通过指向新空间的方式,减少内存浪费,以及不用拷贝旧数据。
- 通过自定函数封装相关功能,方便使用。
- 单结构体,即只自定了节点结构体(Node)
- 本文中的具体实现参考了浙大翁恺老师的 C 语言课程,链接已在本文末尾给出,如果有地方看不懂可以自己去看视频了解或者私信我。
结构定义及相关函数声明(linked_list.h)
#ifndef __LINKED_LIST_H
#define __LINKED_LIST_H
typedef struct Node {
int value_;
struct Node *next_;
} Node;
void node_Add(Node **head, int value);
void node_Delete(Node *head, int target);
void node_Set(Node *node, int value);
Node* node_Search(Node *head, int target);
void node_Linked_List_Print(Node *head);
void node_Linked_List_Clear(Node *head);
#endif
函数定义(linked_list.c)
#include <stdio.h>
#include <stdlib.h>
#include "linked_list.h"
void node_Add(Node **head, int value){
Node *new_node = (Node*)malloc(sizeof(Node)), *tp = *head;
new_node -> value_ = value;
new_node -> next_ = NULL;
if (*head == NULL) {
*head = new_node;
} else {
while (tp -> next_ != NULL) {
tp = tp -> next_;
}
tp -> next_ = new_node;
}
}
void node_Delete(Node **head, int target) {
Node *tp = *head, *fp = (*head) -> next_;
if ((*head) -> value_ == target) {
*head = (*head) -> next_;
free(tp);
} else {
for ( ; fp; tp = tp -> next_, fp = fp -> next_) {
if (fp -> value_ == target) {
tp -> next_ = fp -> next_;
free(fp);
break;
}
}
}
}
void node_Set(Node *node, int value) {
node -> value_ = value;
}
Node* node_Search(Node *head, int target) {
for (Node *tp = head; tp; tp = tp -> next_) {
if (tp -> value_ == target) {
return tp;
}
}
printf("当前节点不存在,请重试!(返回头节点地址)\n");
return head;
}
void node_Linked_List_Print(Node *head) {
int i = 1;
for (Node *tp = head; tp; tp = tp -> next_, i++) {
printf("%d ", tp -> value_);
if (i % 5 == 0) {
printf("\n");
}
}
printf("\n");
}
void node_Linked_List_Clear(Node *head) {
Node *tp = head, *fp = tp -> next_;
for ( ; fp; tp = fp, fp = fp -> next_) {
free(tp);
}
free(fp);
}
测试(main.c)
#include <stdio.h>
#include "linked_list.h"
int main() {
Node *head = NULL;
int number = 0, value = 0;
while (1) {
scanf("%d", &number);
if (number == -1) {
break;
} else {
node_Add(&head, number);
}
}
printf("当前链表中的所有数据节点:\n");
node_Linked_List_Print(head);
printf("请输入要删除的数据节点:");
scanf("%d", &number);
node_Delete(&head, number);
printf("请输入要设置的数据节点及数值:");
scanf("%d %d", &number, &value);
node_Set(node_Search(head, number), value);
printf("当前链表中的所有数据节点:\n");
node_Linked_List_Print(head);
node_Linked_List_Clear(head);
system("pause");
return 0;
}
参考资料
C 语言程序设计进阶-翁恺