C语言 实现 链 显示 效果 查找 修改 删除

显示所有信息

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;
}
 
相关推荐
王老师青少年编程5 分钟前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
z小猫不吃鱼17 分钟前
模型剪枝经典论文精读:Pruning Filters for Efficient ConvNets
算法·机器学习·剪枝
盐焗鹌鹑蛋1 小时前
【C++】继承
开发语言·c++
栈溢出了1 小时前
Java Lambda 表达式笔记
java·开发语言·intellij-idea
zhixingheyi_tian2 小时前
一份GC日志的解读
java·开发语言
czhaii2 小时前
串口1中断收发-C语言-MODBUS协议
c语言·开发语言
Fox爱分享2 小时前
字节二面:1000瓶酒,有一瓶是毒药,多少只老鼠可以查出来?
算法·面试·程序员
+wacyltd大模型备案算法备案2 小时前
大模型评估测试题库怎么建?风险分类、测试样本的完整方法
人工智能·算法·安全·分类·大模型·大模型备案·大模型上线登记
apihz2 小时前
随机驾考题目(C 照科一 / 科四 2000+ 题)免费API调用教程
android·java·c语言·开发语言·网络协议·tcp/ip
Fox爱分享2 小时前
字节二面智力题:100只老虎和1只羊关在一起,这只羊会不会被吃?
算法·面试·程序员