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(¤t_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;
}
运行结果如下: