c语言如何创建线性链表

c语言如何创建线性链表

C语言创建线性链表的方法包括以下步骤:定义节点结构、初始化链表、插入节点、删除节点、遍历链表。 其中,定义节点结构是最基础的步骤,它决定了链表中每个节点存储的数据类型和指向下一个节点的指针。下面将详细描述如何创建和操作线性链表。

一、定义节点结构

在C语言中,链表节点通常通过结构体(struct)来定义。每个节点包含两部分:数据域和指针域。数据域存储实际数据,指针域存储下一个节点的地址。

typedef struct Node {

int data; // 数据域

struct Node* next; // 指针域

} Node;

二、初始化链表

初始化链表通常意味着创建一个空链表,即头指针指向NULL。头指针是一个特殊的指针,它指向链表的第一个节点。

Node* initLinkedList() {

return NULL; // 空链表

}

三、插入节点

插入节点分为三种情况:在链表头部插入、在链表中间插入和在链表尾部插入。以下是实现插入节点的函数。

// 在链表头部插入节点

void insertAtHead(Node head, int data) {

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

newNode->data = data;

newNode->next = *head;

*head = newNode;

}

// 在链表尾部插入节点

void insertAtTail(Node head, int 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;

}

}

// 在链表中间插入节点(在指定节点后插入)

void insertAfter(Node* prevNode, int data) {

if (prevNode == NULL) {

printf("前一个节点不能为空n");

return;

}

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

newNode->data = data;

newNode->next = prevNode->next;

prevNode->next = newNode;

}

四、删除节点

删除节点也有三种情况:删除头节点、删除中间节点和删除尾节点。以下是实现删除节点的函数。

// 删除头节点

void deleteHead(Node head) {

if (*head == NULL) {

return;

}

Node* temp = *head;

*head = (*head)->next;

free(temp);

}

// 删除指定节点

void deleteNode(Node head, int key) {

Node* temp = *head;

Node* prev = NULL;

// 如果头节点就是要删除的节点

if (temp != NULL && temp->data == key) {

*head = temp->next; // 改变头指针

free(temp); // 释放旧的头节点

return;

}

// 查找要删除的节点

while (temp != NULL && temp->data != key) {

prev = temp;

temp = temp->next;

}

// 如果没有找到要删除的节点

if (temp == NULL) {

return;

}

// 改变前一个节点的指针

prev->next = temp->next;

free(temp); // 释放要删除的节点

}

// 删除尾节点

void deleteTail(Node head) {

if (*head == NULL) {

return;

}

if ((*head)->next == NULL) {

free(*head);

*head = NULL;

return;

}

Node* temp = *head;

while (temp->next->next != NULL) {

temp = temp->next;

}

free(temp->next);

temp->next = NULL;

}

五、遍历链表

遍历链表是将链表中的所有节点逐个访问并处理的过程。以下是实现遍历链表的函数。

void traverseLinkedList(Node* head) {

Node* temp = head;

while (temp != NULL) {

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

temp = temp->next;

}

printf("NULLn");

}

六、销毁链表

销毁链表是将链表中的所有节点释放,从而回收内存。以下是实现销毁链表的函数。

void destroyLinkedList(Node head) {

Node* current = *head;

Node* nextNode = NULL;

while (current != NULL) {

nextNode = current->next;

free(current);

current = nextNode;

}

*head = NULL;

}

七、完整示例

以下是一个完整的示例程序,演示如何使用上述函数创建和操作线性链表。

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

int data;

struct Node* next;

} Node;

Node* initLinkedList() {

return NULL;

}

void insertAtHead(Node head, int data) {

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

newNode->data = data;

newNode->next = *head;

*head = newNode;

}

void insertAtTail(Node head, int 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;

}

}

void insertAfter(Node* prevNode, int data) {

if (prevNode == NULL) {

printf("前一个节点不能为空n");

return;

}

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

newNode->data = data;

newNode->next = prevNode->next;

prevNode->next = newNode;

}

void deleteHead(Node head) {

if (*head == NULL) {

return;

}

Node* temp = *head;

*head = (*head)->next;

free(temp);

}

void deleteNode(Node head, int key) {

Node* temp = *head;

Node* prev = NULL;

if (temp != NULL && temp->data == key) {

*head = temp->next;

free(temp);

return;

}

while (temp != NULL && temp->data != key) {

prev = temp;

temp = temp->next;

}

if (temp == NULL) {

return;

}

prev->next = temp->next;

free(temp);

}

void deleteTail(Node head) {

if (*head == NULL) {

return;

}

if ((*head)->next == NULL) {

free(*head);

*head = NULL;

return;

}

Node* temp = *head;

while (temp->next->next != NULL) {

temp = temp->next;

}

free(temp->next);

temp->next = NULL;

}

void traverseLinkedList(Node* head) {

Node* temp = head;

while (temp != NULL) {

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

temp = temp->next;

}

printf("NULLn");

}

void destroyLinkedList(Node head) {

Node* current = *head;

Node* nextNode = NULL;

while (current != NULL) {

nextNode = current->next;

free(current);

current = nextNode;

}

*head = NULL;

}

int main() {

Node* head = initLinkedList();

insertAtHead(&head, 1);

insertAtTail(&head, 2);

insertAtTail(&head, 3);

insertAfter(head, 4);

printf("链表内容: ");

traverseLinkedList(head);

deleteNode(&head, 2);

printf("删除节点2后链表内容: ");

traverseLinkedList(head);

deleteHead(&head);

printf("删除头节点后链表内容: ");

traverseLinkedList(head);

deleteTail(&head);

printf("删除尾节点后链表内容: ");

traverseLinkedList(head);

destroyLinkedList(&head);

printf("销毁链表后链表内容: ");

traverseLinkedList(head);

return 0;

}

八、总结

C语言创建线性链表的核心步骤包括定义节点结构、初始化链表、插入节点、删除节点、遍历链表和销毁链表。这些步骤中的每一个都可以根据具体需求进行调整和优化。链表是一种灵活的数据结构,适用于需要频繁插入和删除操作的场景。通过上述方法,您可以实现一个功能完善的链表,并根据需要进行扩展和优化。

相关问答FAQs:

1. 什么是线性链表?如何在C语言中创建一个线性链表?
线性链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以通过定义一个结构体来表示链表的节点,并使用指针来连接各个节点,从而创建一个线性链表。

2. 如何向已创建的线性链表中插入新的节点?
要向已创建的线性链表中插入新的节点,可以先创建一个新的节点,并将数据赋值给该节点。然后,将新节点的指针指向原链表中需要插入位置的节点,同时将前一个节点的指针指向新节点,完成插入操作。

3. 如何在C语言中删除线性链表中的节点?
在C语言中,删除线性链表中的节点需要先找到要删除的节点,并修改前一个节点的指针指向下一个节点,同时释放被删除节点的内存空间。可以使用循环遍历链表,找到要删除的节点,然后修改指针和释放内存空间来完成删除操作。

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/1525247

(0)
Edit1Edit1
上一篇 2024年9月4日 下午2:51
下一篇 2024年9月4日 下午2:51
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部