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

运行结果如下:

相关推荐
小林熬夜学编程1 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
m0_748236114 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10612 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
鸽鸽程序猿12 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd13 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61716 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v22 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法