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

运行结果如下:

相关推荐
流星白龙2 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生9 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo10 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse16 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24924 分钟前
JDBC编程---Java
java·开发语言·sql
肥猪猪爸34 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
色空大师37 分钟前
23种设计模式
java·开发语言·设计模式
readmancynn1 小时前
二分基本实现
数据结构·算法
萝卜兽编程1 小时前
优先级队列
c++·算法
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt