admin 管理员组

文章数量: 1087135


2024年1月23日发(作者:c语言中sscanf是什么意思)

单链表的基本操作(C语言)

什么是单链表

单链表(Singly Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。每个节点只能访问其后继节点,而无法直接访问前驱节点。

单链表的特点是可以动态地插入和删除节点,相比于数组,具有更好的灵活性和扩展性。在C语言中,我们可以使用指针来实现单链表。

单链表的基本操作

1. 定义单链表结构体

在C语言中,我们首先需要定义一个表示单链表的结构体。结构体包含两个成员:数据元素和指向下一个节点的指针。

typedef struct Node {

int data;

// 数据元素

struct Node *next;

// 指向下一个节点的指针

} Node;

2. 创建单链表

创建一个空的单链表需要进行以下步骤:

定义头节点,并初始化为NULL。

向链表中插入新的节点。

Node* createLinkedList() {

Node *head = NULL;

// 头节点初始化为NULL

int n;

// 节点数量

printf("请输入要创建的节点数量:");

scanf("%d", &n);

for (int i = 0; i < n; i++) {

int data;

printf("请输入第%d个节点的值:", i + 1);

scanf("%d", &data);

Node *newNode = (Node*)malloc(sizeof(Node));

// 创建新节点

newNode->data = data;

newNode->next = NULL;

if (head == NULL) {

head = newNode;

// 如果是第一个节点,将其设置为头节点

} else {

Node *temp = head;

while (temp->next != NULL) {

temp = temp->next;

// 移动到链表末尾

}

temp->next = newNode;

// 将新节点插入到链表末尾

}

}

return head;

}

3. 插入节点

在单链表中插入一个新的节点需要进行以下步骤:

创建一个新的节点。

将新节点的指针指向原本位置的下一个节点。

将原本位置的指针指向新节点。

void insertNode(Node **head, int position, int data) {

Node *newNode = (Node*)malloc(sizeof(Node));

// 创建新节点

newNode->data = data;

if (position == 0) {

newNode->next = *head;

*head = newNode;

// 如果插入位置为0,将其设置为头节点

} else {

Node *temp = *head;

for (int i = 0; i < position - 1 && temp != NULL; i++) {

temp = temp->next;

// 移动到插入位置的前一个节点

}

if (temp != NULL) {

newNode->next = temp->next;

temp->next = newNode;

// 插入新节点

} else {

printf("插入位置无效!n");

}

}

}

4. 删除节点

在单链表中删除一个节点需要进行以下步骤:

找到要删除的节点的前一个节点。

将前一个节点的指针指向要删除节点的下一个节点。

释放要删除节点的内存空间。

void deleteNode(Node **head, int position) {

if (*head == NULL) {

printf("链表为空!n");

} else {

Node *temp = *head;

if (position == 0) {

*head = temp->next;

free(temp);

// 如果删除位置为0,释放头节点

} else {

for (int i = 0; i < position - 1 && temp != NULL; i++) {

temp = temp->next;

// 移动到删除位置的前一个节点

}

if (temp != NULL && temp->next != NULL) {

Node *deleteNode = temp->next;

temp->next = deleteNode->next;

free(deleteNode);

// 删除节点并释放内存

} else {

printf("删除位置无效!n");

}

}

}

}

5. 遍历单链表

遍历单链表即将链表中的每个元素依次输出。

void traverseLinkedList(Node *head) {

if (head == NULL) {

printf("链表为空!n");

} else {

Node *temp = head;

while (temp != NULL) {

printf("%d ", temp->data);

temp = temp->next;

}

printf("n");

}

}

6. 销毁单链表

销毁单链表需要释放链表中每个节点的内存空间。

void destroyLinkedList(Node **head) {

Node *current = *head;

Node *next;

while (current != NULL) {

next = current->next;

free(current);

current = next;

}

*head = NULL;

// 头节点设置为NULL

}

示例

下面是一个使用单链表的示例程序:

#include

#include

typedef struct Node {

int data;

struct Node *next;

} Node;

Node* createLinkedList() {

Node *head = NULL;

int n;

printf("请输入要创建的节点数量:");

scanf("%d", &n);

for (int i = 0; i < n; i++) {

int data;

printf("请输入第%d个节点的值:", i + 1);

scanf("%d", &data);

Node *newNode = (Node*)malloc(sizeof(Node));

newNode->data = data;

newNode->next = NULL;

if (head == NULL) {

head = newNode;

} else {

Node *temp = head;

while (temp->next != NULL) {

temp = temp->next;

}

temp->next = newNode;

}

}

return head;

}

void insertNode(Node **head, int position, int data) {

Node *newNode = (Node*)malloc(sizeof(Node));

newNode->data = data;

if (position == 0) {

newNode->next = *head;

*head = newNode;

} else {

Node *temp = *head;

for (int i = 0; i < position - 1 && temp != NULL; i++) {

temp = temp->next;

}

if (temp != NULL) {

newNode->next = temp->next;

temp->next = newNode;

} else {

printf("插入位置无效!n");

}

}

}

void deleteNode(Node **head, int position) {

if (*head == NULL) {

printf("链表为空!n");

} else {

Node *temp = *head;

if (position == 0) {

*head = temp->next;

free(temp);

} else {

for (int i = 0; i < position - 1 && temp != NULL; i++) {

temp = temp->next;

}

if (temp != NULL && temp->next != NULL) {

Node *deleteNode = temp->next;

temp->next = deleteNode->next;

free(deleteNode);

} else {

printf("删除位置无效!n");

}

}

}

}

void traverseLinkedList(Node *head) {

if (head == NULL) {

printf("链表为空!n");

} else {

Node *temp = head;

while (temp != NULL) {

printf("%d ", temp->data);

temp = temp->next;

}

printf("n");

}

}

void destroyLinkedList(Node **head) {

Node *current = *head;

Node *next;

while (current != NULL) {

next = current->next;

free(current);

current = next;

}

*head = NULL;

}

int main() {

Node *head = createLinkedList();

traverseLinkedList(head);

insertNode(&head, 2, 100);

traverseLinkedList(head);

deleteNode(&head, 1);

traverseLinkedList(head);

destroyLinkedList(&head);

return 0;

}

总结

单链表是一种常见的数据结构,在C语言中可以使用指针来实现。本文介绍了单链表的基本操作,包括创建链表、插入节点、删除节点、遍历链表和销毁链表。通过理解和掌握这些基本操作,我们可以更好地应用单链表解决实际问题。


本文标签: 节点 单链 删除 链表 指针