用C语言写单链表的删除
时间: 2023-08-20 10:05:04 浏览: 45
单链表的删除分为两种情况:删除头节点和删除非头节点。
删除头节点的代码如下:
```c
// 定义单链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 删除头节点
ListNode* deleteHeadNode(ListNode* head) {
if (head == NULL) {
return NULL;
}
ListNode* p = head->next;
free(head);
return p;
}
```
删除非头节点的代码如下:
```c
// 删除非头节点
void deleteNode(ListNode* node) {
if (node == NULL || node->next == NULL) {
return;
}
ListNode* next = node->next;
node->val = next->val;
node->next = next->next;
free(next);
}
```
需要注意的是,在删除非头节点时,需要将当前节点的下一个节点的值赋给当前节点,并将当前节点的 next 指针指向下一个节点的 next 指针,然后才能删除下一个节点。
相关问题
用c语言写单链表的基本操作
单链表是一种常用的数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储节点的数据,指针域用于指向下一个节点。以下是用C语言实现单链表的基本操作代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表节点
ListNode* createNode(int val) {
ListNode *node = (ListNode*) malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
// 插入节点到链表尾部
void insertTail(ListNode **head, int val) {
ListNode *node = createNode(val);
if (*head == NULL) {
*head = node;
} else {
ListNode *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
}
// 删除链表中指定节点
void deleteNode(ListNode **head, int val) {
ListNode *p = *head, *prev = NULL;
while (p != NULL && p->val != val) {
prev = p;
p = p->next;
}
if (p == NULL) {
return;
}
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
free(p);
}
// 打印链表
void printList(ListNode *head) {
ListNode *p = head;
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
ListNode *head = NULL;
// 插入节点
insertTail(&head, 1);
insertTail(&head, 2);
insertTail(&head, 3);
// 删除节点
deleteNode(&head, 2);
// 打印链表
printList(head);
return 0;
}
```
上述代码实现了单链表的创建、插入、删除和打印操作。在插入和删除操作中,需要使用指向指针的指针(即二级指针)来修改链表头节点的值。
用c语言写单链表的各种操作
以下是用 C 语言实现单链表的各种操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data; // 数据
struct Node *next; // 指向下一个节点的指针
} Node;
// 初始化链表
void initList(Node **head) {
*head = NULL;
}
// 插入节点
void insertNode(Node **head, int data, int pos) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
return;
}
if (pos == 0) {
newNode->next = *head;
*head = newNode;
return;
}
Node *current = *head;
int i = 0;
while (i < pos - 1 && current->next != NULL) {
current = current->next;
i++;
}
newNode->next = current->next;
current->next = newNode;
}
// 删除节点
void deleteNode(Node **head, int pos) {
if (*head == NULL) {
return;
}
Node *current = *head;
if (pos == 0) {
*head = current->next;
free(current);
return;
}
int i = 0;
while (i < pos - 1 && current->next != NULL) {
current = current->next;
i++;
}
if (current->next == NULL) {
return;
}
Node *toBeDeleted = current->next;
current->next = toBeDeleted->next;
free(toBeDeleted);
}
// 查找节点
Node *searchNode(Node *head, int data) {
Node *current = head;
while (current != NULL) {
if (current->data == data) {
return current;
}
current = current->next;
}
return NULL;
}
// 修改节点
void modifyNode(Node *node, int data) {
if (node == NULL) {
return;
}
node->data = data;
}
// 遍历链表
void traverseList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
Node *head;
initList(&head);
// 插入节点
insertNode(&head, 1, 0);
insertNode(&head, 2, 1);
insertNode(&head, 3, 2);
insertNode(&head, 4, 3);
// 遍历链表
traverseList(head);
// 删除节点
deleteNode(&head, 2);
// 遍历链表
traverseList(head);
// 查找节点
Node *node = searchNode(head, 2);
if (node != NULL) {
printf("Found node %d\n", node->data);
} else {
printf("Node not found\n");
}
// 修改节点
modifyNode(head->next, 5);
// 遍历链表
traverseList(head);
return 0;
}
```
这段代码中包含了单链表的初始化、插入节点、删除节点、查找节点、修改节点和遍历链表等操作。可以通过调用相应的函数来进行链表操作。