C语言基础(二十三)

在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;  
}

运行结果如下:

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值