C语言基础(二十一)

C语言中的链表是一种常见的数据结构,用于存储一系列的元素,但与数组不同的是,链表中的元素在内存中不是连续存储的。链表中的每个元素称为节点(Node),每个节点包含两个部分:一部分是存储数据的数据域(Data Field),另一部分是存储指向下一个节点地址的指针域(Pointer Field)。通过这种方式,链表中的节点可以动态地增加或删除。

测试代码1:

cpp 复制代码
#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <time.h>
// 定义花的结构体。 
typedef struct {  
    char name[50];  
    float price;  
    char origin[50];  
}Flower;  
  
// 定义链表节点的结构体。  
typedef struct Node{  
    Flower flower;  
    struct Node* next;  
}Node;  
  
// 创建新节点。  
Node* createNode(const char* name, float price, const char* origin) {  
    Node* newNode = (Node*)malloc(sizeof(Node));  
    if (newNode == NULL) {  
        printf("Memory allocation failed!\n");  
        exit(1);  
    }  
    strcpy(newNode->flower.name, name);  
    newNode->flower.price = price;  
    strcpy(newNode->flower.origin, origin);  
    newNode->next = NULL;  
    return newNode;  
}  
  
// 向链表添加节点。 
void appendNode(Node** head, const char* name, float price, const char* origin) {  
    Node* newNode = createNode(name, price, origin);  
    if (*head == NULL) {  
        *head = newNode;  
    } else {  
        Node* current = *head;  
        while (current->next != NULL) {  
            current = current->next;  
        }  
        current->next = newNode;  
    }  
}  
  
// 遍历链表并打印信息 。 
void traverseList(Node* head) {  
    Node* current = head;  
    while (current != NULL) {  
        printf("Node Address: %p\n", (void*)current);  
        printf("Flower Name: %s, Price: %.2f, Origin: %s\n", current->flower.name, current->flower.price, current->flower.origin);  
        printf("Next Node Address: %p\n", (void*)(current->next));  
        printf("\n");  
        current = current->next;  
    }  
}  
  
// 释放链表内存。 
void freeList(Node* head) {  
    Node* temp;  
    while (head != NULL) {  
        temp = head;  
        head = head->next;  
        free(temp);  
    }  
}  

int latencyTime() {
    time_t start_time, current_time;
    time(&start_time);  // 获取当前时间

    do {
        time(&current_time);  // 再次获取当前时间
    } while(difftime(current_time, start_time) < 5);  // 循环直到时间差达到5秒

    return 0;
}
  
int main() {  
    int time = getTime();
    Node* head = NULL;  
  
    // 向链表添加数据。  
    // 向链表添加5种不同的花的信息。 
    appendNode(&head, "Rose", 5.99, "China");  
    appendNode(&head, "Tulip", 3.49, "Netherlands");  
    appendNode(&head, "Daisy", 2.99, "Europe");  
    appendNode(&head, "Lily", 4.99, "France");  // 添加第四种花  
    appendNode(&head, "Orchid", 9.99, "Southeast Asia");  // 添加第五种花  
   
    // 遍历链表并打印信息。  
    traverseList(head);  
  
    // 释放链表内存 。 
    freeList(head);  
    head = NULL; // 将头指针置为空,防止野指针访问 
  
    return 0;  
}

运行结果如下:

测试代码2:

cpp 复制代码
#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
// 定义链表节点结构体  
typedef struct Flower {  
    char name[50];  
    float price;  
    char origin[50];  
    struct Flower* next;  
} Flower;  
  
// 创建新节点  
Flower* createNode(const char* name, float price, const char* origin) {  
    Flower* newNode = (Flower*)malloc(sizeof(Flower));  
    if (!newNode) {  
        fprintf(stderr, "Memory allocation failed!\n");  
        exit(1);  
    }  
    strcpy(newNode->name, name);  
    newNode->price = price;  
    strcpy(newNode->origin, origin);  
    newNode->next = NULL;  
    return newNode;  
}  
  
// 在链表末尾插入新节点  
void insertAtEnd(Flower** head, const char* name, float price, const char* origin) {  
    Flower* newNode = createNode(name, price, origin);  
    if (*head == NULL) {  
        *head = newNode;  
    } else {  
        Flower* temp = *head;  
        while (temp->next != NULL) {  
            temp = temp->next;  
        }  
        temp->next = newNode;  
    }  
}  
  
// 打印链表  
void printList(Flower* head) {  
    Flower* temp = head;  
    while (temp != NULL) {  
        printf("Name: %s, Price: %.2f, Origin: %s\n", temp->name, temp->price, temp->origin);  
        temp = temp->next;  
    }  
}  
  
// 主函数  
int main() { 
    int time = getTime(); 
    Flower* head = NULL; // 初始化链表为空  
  
    // 向链表中添加五种花的信息  
    insertAtEnd(&head, "Rose", 5.99, "China");  
    insertAtEnd(&head, "Lily", 3.50, "Netherlands");  
    insertAtEnd(&head, "Tulip", 4.99, "Turkey");  
    insertAtEnd(&head, "Daisy", 2.99, "USA");  
    insertAtEnd(&head, "Chrysanthemum", 6.99, "Japan");  
  
    // 打印链表  
    printList(head);  
    // 释放链表内存  
    Flower* temp;  
    while (head != NULL) {  
    temp = head;  
    head = head->next;  
    free(temp);  
}
    head = NULL; // 将头指针置为空,防止野指针访问 
    
    return 0;  
}

运行结果如下:

相关推荐
TT-Kun3 分钟前
算法 | 基础排序算法:插入排序、选择排序、交换排序、归并排序
算法·排序算法·c
悟兰因w9 分钟前
决策树实战
算法·决策树·机器学习
积跬步DEV10 分钟前
Claude Prompt 汉语新解
开发语言·前端·javascript
虚无火星车21 分钟前
说说停止线程池的执行流程?
java·开发语言
乔以亦23 分钟前
python 装饰器
linux·开发语言·python
计算机学姐28 分钟前
基于python+django+vue的社区爱心养老管理系统
开发语言·vue.js·后端·python·mysql·django·web3.py
V_fanglue370529 分钟前
qmt量化交易策略小白学习笔记第60期【qmt编程之期权数据--基于BS模型计算欧式期权隐含波动率--内置Python】
开发语言·windows·笔记·python·学习·区块链
鱼跃鹰飞1 小时前
Leetcode面试经典150题-141.环形链表
算法·leetcode·链表·面试
汽车电子助手1 小时前
如何制作Vector Vflash中加载的DLL文件--自动解锁刷写过程中27服务
开发语言·单片机·嵌入式硬件
码农不惑1 小时前
如何在C++中使用mupdf操作pdf文件(一)
开发语言·c++·pdf