在C语言中,修改链表中的数据涉及遍历链表以找到要修改的元素,然后更新该元素的值。链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据部分和指向列表中下一个节点的指针(双向链表,还会有指向前一个节点的指针)。
测试代码1:
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("Memory allocation failed\n");
exit(1); // 或进行其他错误处理
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 向链表末尾添加节点
void appendNode(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 删除链表中的节点(按值删除)
bool deleteNode(Node** head, int key) {
Node* temp = *head, *prev = NULL;
// 如果头节点就是要删除的节点
if (temp != NULL && temp->data == key) {
*head = temp->next; // 改变头指针
free(temp); // 释放旧的头节点内存
return true;
}
// 查找要删除的节点
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果key不存在于链表中
if (temp == NULL) return false;
// 从链表中删除节点
prev->next = temp->next;
free(temp); // 释放内存
return true;
}
// 修改链表节点的数据
bool updateNode(Node* head, int oldKey, int newKey) {
Node* current = head;
while (current != NULL) {
if (current->data == oldKey) {
current->data = newKey;
return true;
}
current = current->next;
}
return false; // 如果没有找到,返回false
}
// 查找链表中的节点(按值查找)
Node* findNode(Node* head, int key) {
Node* current = head;
while (current != NULL) {
if (current->data == key) {
return current;
}
current = current->next;
}
return NULL; // 如果没有找到,返回NULL
}
// 打印链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
// 释放链表内存
void freeList(Node* head) {
Node* temp;
while (head != NULL) {
temp = head;
head = head->next; // 移动到下一个节点
free(temp); // 释放当前节点的内存
}
}
int main() {
int time = getTime();
Node* head = NULL;
// 添加节点
appendNode(&head, 10);
appendNode(&head, 2);
appendNode(&head, 8);
appendNode(&head, 35);
appendNode(&head, 9);
printf("Initial list: ");
printList(head);
// 修改节点
if (updateNode(head, 2, 20)) {
printf("Updated list: ");
printList(head);
}
// 查找节点
Node* foundNode = findNode(head, 20);
if (foundNode != NULL) {
printf("Found node with value: %d\n", foundNode->data);
}
// 删除节点
if (deleteNode(&head, 20)) {
printf("Deleted list: ");
printList(head);
}
// 释放链表内存
freeList(head);
// 释放链表内存
return 0;
}
运行结果如下: