C语言基础(二十一)

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

测试代码1:

#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:

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

运行结果如下:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值