C语言基础(二十)

链表是一种常见的数据结构,通常用来存储一系列元素,每个元素由一个节点来表示。在链表中,每个节点包含两部分:数据元素本身和指向下一个节点的指针。这种结构使得链表中的元素在内存中不是连续存储的,而是通过指针连接起来。链表可以分为单向链表和双向链表两种类型。在单向链表中,每个节点只有一个指向下一个节点的指针;而在双向链表中,每个节点有一个指向前一个节点的指针和一个指向后一个节点的指针。

测试代码1:

cpp 复制代码
#include "date.h"
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
typedef struct ListNode {
    int val;
    struct ListNode* next;
} ListNode;

// 创建新节点
ListNode* createNode(int val) {
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
    if (newNode == NULL) {
        printf("Memory allocation failed!n");
        exit(1);
    }
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 在链表末尾添加节点
void appendNode(ListNode** head, int val) {
    ListNode* newNode = createNode(val);
    if (*head == NULL) {
        *head = newNode;
    } else {
        ListNode* temp = *head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
    }
}
// 打印链表节点地址的函数  
void printListAddress(ListNode* head) {  
    ListNode* current = head;  
  
    while (current != NULL) {  
        printf("Node value: %d, Address: %p\n", current->val, (void*)current);  
        current = current->next;  
    }  
}  
  
// 遍历链表并打印每个节点的值
void printList(ListNode* head) {
    ListNode* temp = head;
    while (temp != NULL) {
        printf("%d -> ", temp->val);
        temp = temp->next;
    }
    printf("NULL\n");
}

// 主函数
int main() {
	
	int time = getTime();
    ListNode* head = NULL; // 初始化链表为空

    // 向链表添加节点
    appendNode(&head, 1);
    appendNode(&head, 5);
    appendNode(&head, 0);
    appendNode(&head, 9);
    appendNode(&head, 3);
    appendNode(&head, 8);
    // 遍历并打印链表
    printList(head);
    // 打印链表节点地址
    printListAddress(head);
   
    // 释放链表内存
    ListNode* current = head;
    ListNode* next;
    while (current != NULL) {
        next = current->next;
        free(current);
        current = next;
    }
    head = NULL;  // 将头指针置为空,防止野指针访问
    
    return 0;
}

运行结果如下:

测试代码2:

cpp 复制代码
#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
  
// 定义链表节点结构体  
typedef struct ListNode {  
    int val;            // 链表节点值 
    struct ListNode* next; // 指针域,指向下一个节点  
} ListNode;  
  
// 创建新节点  
ListNode* createNode(int val) {  
    ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));  
    if (newNode == NULL) {  
        printf("Memory allocation failed!\n");  
        exit(1); // 终止程序  
    }  
    newNode->val = val;  
    newNode->next = NULL;  
    return newNode;  
}  
  
// 遍历链表并打印信息  
void printList(ListNode* head) {  
    ListNode* current = head;  
    while (current != NULL) {  
        printf("Node Address: %p, Value: %d, Next Node Address: %p\n",  
               (void*)current, current->val, (void*)(current->next));  
        current = current->next;  
    }  
}  
  
// 主函数  
int main() { 
    int time = getTime(); 
    // 创建链表节点  
    // 创建链表节点  
    ListNode* head = createNode(1); // 头结点  
    ListNode* current = head; // 用于遍历链表的指针  
  
    // 将剩余节点添加到链表中  
    current->next = createNode(2);  
    current = current->next;  
    current->next = createNode(3);  
    current = current->next;  
    current->next = createNode(4);  
    current = current->next;  
    current->next = createNode(5);  
  
  
    // 打印链表信息  
    printf("Linked List:\n");  
    printList(head);  
  
    // 释放链表内存
    ListNode* temp;  
    while (head != NULL) {  
        temp = head;  
        head = head->next;  
        free(temp);  
    }  
    head = NULL;  // 将头指针置为空,防止野指针访问
    return 0;  
}

运行结果如下:

相关推荐
yanlaifan几秒前
C语言标准版本简单介绍
c语言
PHP实战开发录3 分钟前
PHP脚本手动能跑定时任务却失败
开发语言·php·开发
郝学胜-神的一滴1 小时前
Effective Python 条款 10 :海象运算符_=
开发语言·python·程序人生·开源
wuyk5551 小时前
Python零基础入门第十四章:异常处理(try-except)
开发语言·python
wuyk5551 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
wzdark5 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
彧azz7 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
老王熬夜敲代码7 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR7 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
嵌入式学习菌7 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug