用C语言链表实现十二生肖的存储及相关操作
时间: 2023-05-10 15:55:49 浏览: 64
好的,我可以回答这个问题。以下是用C语言链表实现十二生肖的存储及相关操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义一个结构体表示生肖
typedef struct Zodiac {
char name[10]; // 生肖名称
int year; // 生肖年份
struct Zodiac *next; // 指向下一个生肖的指针
} Zodiac;
// 创建一个新的生肖节点
Zodiac *new_zodiac(char *name, int year) {
Zodiac *z = (Zodiac *)malloc(sizeof(Zodiac));
strcpy(z->name, name);
z->year = year;
z->next = NULL;
return z;
}
// 在链表末尾添加一个生肖节点
void add_zodiac(Zodiac **head, char *name, int year) {
Zodiac *z = new_zodiac(name, year);
if (*head == NULL) {
*head = z;
} else {
Zodiac *p = *head;
while (p->next != NULL) {
p = p->next;
}
p->next = z;
}
}
// 根据生肖名称查找生肖节点
Zodiac *find_zodiac(Zodiac *head, char *name) {
Zodiac *p = head;
while (p != NULL) {
if (strcmp(p->name, name) == 0) {
return p;
}
p = p->next;
}
return NULL;
}
// 根据生肖年份查找生肖节点
Zodiac *find_zodiac_by_year(Zodiac *head, int year) {
Zodiac *p = head;
while (p != NULL) {
if (p->year == year) {
return p;
}
p = p->next;
}
return NULL;
}
// 删除指定生肖节点
void delete_zodiac(Zodiac **head, Zodiac *z) {
if (*head == z) {
*head = z->next;
} else {
Zodiac *p = *head;
while (p->next != z) {
p = p->next;
}
p->next = z->next;
}
free(z);
}
// 打印所有生肖节点
void print_zodiacs(Zodiac *head) {
Zodiac *p = head;
while (p != NULL) {
printf("%s (%d)\n", p->name, p->year);
p = p->next;
}
}
int main() {
Zodiac *zodiacs = NULL;
add_zodiac(&zodiacs, "鼠", 2020);
add_zodiac(&zodiacs, "牛", 2021);
add_zodiac(&zodiacs, "虎", 2022);
add_zodiac(&zodiacs, "兔", 2023);
add_zodiac(&zodiacs, "龙", 2024);
add_zodiac(&zodiacs, "蛇", 2025);
add_zodiac(&zodiacs, "马", 2026);
add_zodiac(&zodiacs, "羊", 2027);
add_zodiac(&zodiacs, "猴", 2028);
add_zodiac(&zodiacs, "鸡", 2029);
add_zodiac(&zodiacs, "狗", 2030);
add_zodiac(&zodiacs, "猪", 2031);
printf("所有生肖:\n");
print_zodiacs(zodiacs);
Zodiac *z = find_zodiac(zodiacs, "龙");
if (z != NULL) {
printf("龙的年份是%d\n", z->year);
}
z = find_zodiac_by_year(zodiacs, 2022);
if (z != NULL) {
printf("2022年的生肖是%s\n", z->name);
}
delete_zodiac(&zodiacs, find_zodiac(zodiacs, "狗"));
printf("删除狗后的生肖:\n");
print_zodiacs(zodiacs);
return 0;
}
```
这段代码使用链表存储了十二生肖的名称和年份,并提供了一些操作,如添加、查找、删除和打印生肖节点等。