C语言链表基本操作
概述
链表是一种常见的数据结构,它由若干个节点组成,并且每个节点都包含一个指向下一个节点的指针。链表可以动态地进行创建、删除、插入等操作。本文将介绍C语言链表的基本操作,包括创建链表、删除节点、打印链表以及插入节点。
创建链表
链表的创建通过在堆上动态分配空间来实现。下面是一个简单的节点结构体定义:
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域,指向下一个节点
} Node;
创建一个空链表
要创建一个空链表,可以将其头指针置为NULL。可以使用以下代码来创建一个空链表:
Node *head = NULL;
创建一个带有数据的链表
如果需要在创建链表时加入数据,可以使用以下代码:
Node *head = (Node *)malloc(sizeof(Node)); // 分配头节点的空间
head->data = 1; // 为头节点赋值
head->next = NULL; // 头节点的next指针置为NULL,表示链表结束
Node *last = head; // 指向链表尾
for (int i = 2; i <= 5; i++) {
Node *node = (Node *)malloc(sizeof(Node)); // 分配新的节点
node->data = i; // 为节点赋值
node->next = NULL; // 新节点的next指针置为NULL
last->next = node; // 让当前节点变为上一个节点的下一个节点
last = node; // 更新链表尾指针
}
例子
以下是一个完整的程序,演示了如何创建一个带有数据的链表:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node *last = head;
for (int i = 2; i <= 5; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
last->next = node;
last = node;
}
Node *ptr = head;
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n");
return 0;
}
该程序将输出:1 2 3 4 5
删除节点
删除链表节点的基本思路是:首先找到要删除节点的前一个节点,然后将前一个节点的next指针指向要删除节点的下一个节点。最后,释放被删除的节点的内存。
void delete_node(Node *head, int target) {
Node *ptr = head;
while (ptr->next != NULL) {
if (ptr->next->data == target) { // 找到了要删除的节点
Node *tmp = ptr->next;
ptr->next = tmp->next; // 将前一个节点的next指针指向下一个节点
free(tmp); // 释放被删除节点的内存
return;
}
ptr = ptr->next;
}
}
例子
以下是一个完整的程序,演示了如何删除链表节点:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void delete_node(Node *head, int target) {
Node *ptr = head;
while (ptr->next != NULL) {
if (ptr->next->data == target) {
Node *tmp = ptr->next;
ptr->next = tmp->next;
free(tmp);
return;
}
ptr = ptr->next;
}
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node *last = head;
for (int i = 2; i <= 5; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
last->next = node;
last = node;
}
delete_node(head, 3); // 删除值为3的节点
Node *ptr = head;
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n");
return 0;
}
该程序将输出:1 2 4 5
打印链表
要打印链表,只需要从头节点开始,遍历整个链表,并输出每个节点的值。
void print_list(Node *head) {
Node *ptr = head;
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n");
}
例子
以下是一个完整的程序,演示了如何打印链表:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void print_list(Node *head) {
Node *ptr = head;
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n");
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node *last = head;
for (int i = 2; i <= 5; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
last->next = node;
last = node;
}
print_list(head);
return 0;
}
该程序将输出:1 2 3 4 5
插入节点
要在链表中插入一个节点,需要先找到要插入节点的前一个节点,然后将前一个节点的next指针指向要插入节点,再将要插入节点的next指针指向下一个节点。
void insert_node(Node *head, int target, int value) {
Node *ptr = head;
while (ptr != NULL) {
if (ptr->data == target) { // 找到要插入的位置
Node *node = (Node *)malloc(sizeof(Node)); // 创建新节点
node->data = value;
node->next = ptr->next; // 插入节点
ptr->next = node;
return;
}
ptr = ptr->next;
}
}
例子
以下是一个完整的程序,演示了如何插入一个节点:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void insert_node(Node *head, int target, int value) {
Node *ptr = head;
while (ptr != NULL) {
if (ptr->data == target) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = value;
node->next = ptr->next;
ptr->next = node;
return;
}
ptr = ptr->next;
}
}
int main() {
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node *last = head;
for (int i = 2; i <= 5; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i;
node->next = NULL;
last->next = node;
last = node;
}
insert_node(head, 3, 10); // 在值为3的节点后插入值为10的节点
Node *ptr = head;
while (ptr != NULL) {
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n");
return 0;
}
该程序将输出:1 2 3 10 4 5
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言链表基本操作(带有创建链表 删除 打印 插入) - Python技术站