显示所有信息
2023年10月1日的描述:今天放假
2023年10月2日的描述:今天有体育
2023年10月3日的描述:今天有数学
2023年10月4日的描述:今天有语文
2023年10月5日的描述:今天有政治
2023年10月6日的描述:今天交学费
2023年10月7日的描述:今天周末
2023年10月8日的描述:今天给家里打电话
2023年10月9日的描述:今天给同学辅导数学
2023年10月10日的描述:今天上体育
查找 2023,10,4号的信息
2023年10月4日的描述:今天有语文
更改2023年10月4的信息
更改\]请输入2023年10月4日的描述:中华人民共和国 修改后的节点信息是: 2023年10月4日的描述:中华人民共和国 删除2023年10月5号的记录 2023年10月5日的描述:今天有政治 以上节点信息从链上被剔除\~! 显示所有信息 2023年10月1日的描述:今天放假 2023年10月2日的描述:今天有体育 2023年10月3日的描述:今天有数学 2023年10月4日的描述:中华人民共和国 2023年10月6日的描述:今天交学费 2023年10月7日的描述:今天周末 2023年10月8日的描述:今天给家里打电话 2023年10月9日的描述:今天给同学辅导数学 2023年10月10日的描述:今天上体育 所有节点释放完毕\~!
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct Date {
int year, month, day;
}Date_t;
typedef struct Node {
Date_t date;//日期
char describe[200];//描述
struct Node* next;
}Node_t,*ListLink;
void init(ListLink* L) {
*L = malloc(sizeof(Node_t));
if (!L) //如果分配失败
exit(1);
(*L)->next = NULL;
}
void push_back(ListLink* L,Node_t node) {
static ListLink tail;
if ((*L)->next == NULL) {
tail = *L;
}
Node_t* newNode = malloc(sizeof(Node_t));
if (!newNode) //如果分配失败
exit(1);
newNode->date = node.date;
strcpy(newNode->describe, node.describe);
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
Node_t creatNode(int year,int month,int day,char * describe) {
Node_t node;
node.date.year = year;
node.date.month = month;
node.date.day = day;
node.next = NULL;
strcpy(node.describe, describe);
return node;
}
int cmp(Date_t a, Date_t b) { //分析两个日期是否一直,一直返回1
if (a.year != b.year)
return 0;
if (a.month != b.month)
return 0;
if (a.day != b.day)
return 0;
return 1;
}
Node_t* findByDate(ListLink L,Date_t date) {//根据年月日查找节点是否存在
ListLink p = L->next;
while (p) {
if (cmp(p->date, date))//如果找到了对应日期,返回
return p;
p = p->next;
}
return p;//没找到返回的必是空
}
void showNode(Node_t* node) {//显示一个节点的信息
printf("%d年%d月%d日的描述:", node->date.year, node->date.month, node->date.day);
puts(node->describe);
}
void edit(Node_t*node) {
printf("[更改]请输入%d年%d月%d日的描述:",node->date.year, node->date.month, node->date.day);
gets(node->describe);
puts("修改后的节点信息是:");
showNode(node);
}
void delete(ListLink *L,Date_t date) {//找到指定节点的前一个节点
ListLink previous = (*L);
ListLink current = (*L)->next;
while (current) {
if (cmp(current->date, date))//如果找到了对应日期,返回
break;
previous = current;
current = current->next;
}
if (current) {
previous->next = current->next;
showNode((Node_t*)current);
puts("以上节点信息从链上被剔除~!");
free(current);
}
else {
puts("删除失败,没有此日期的节点");
}
}
void printAll(ListLink L) {
ListLink current = L->next;
while (current) {
showNode(current);
current = current->next;
}
}
void destruction(ListLink* L) {//销毁整个链
Node_t* current;
if (*L == NULL)
return;
current = (*L)->next;
while (current) {
(*L)->next = current->next;
free(current);
current = (*L)->next;
}
free(*L);
puts("所有节点释放完毕~!");
}
int main()
{
ListLink L;
Node_t* node;
Date_t date;
init(&L);
push_back(&L, creatNode(2023, 10, 1, "今天放假"));
push_back(&L, creatNode(2023, 10, 2, "今天有体育"));
push_back(&L, creatNode(2023, 10, 3, "今天有数学"));
push_back(&L, creatNode(2023, 10, 4, "今天有语文"));
push_back(&L, creatNode(2023, 10, 5, "今天有政治"));
push_back(&L, creatNode(2023, 10, 6, "今天交学费"));
push_back(&L, creatNode(2023, 10, 7, "今天周末"));
push_back(&L, creatNode(2023, 10, 8, "今天给家里打电话"));
push_back(&L, creatNode(2023, 10, 9, "今天给同学辅导数学"));
push_back(&L, creatNode(2023, 10, 10, "今天上体育"));
//显示所有信息
puts("\n\n显示所有信息");
printAll(L);
//查找 2023,10,4号的信息
puts("\n\n查找 2023,10,4号的信息");
date.year = 2023;
date.month = 10;
date.day = 4;
node = findByDate(L,date);
showNode(node);
//更改10月4的信息
puts("\n\n更改2023年10月4的信息");
edit(node);
//删除2023年10月5号的记录
puts("\n\n删除2023年10月5号的记录");
date.year = 2023;
date.month = 10;
date.day = 5;
delete(&L,date);
//显示所有信息
puts("\n\n显示所有信息");
printAll(L);
destruction(&L);
return 0;
}