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;
}
 
相关推荐
mvufi2 分钟前
day31 第八章 贪心算法 part05
算法·贪心算法
19岁开始学习8 分钟前
关于php-fpm的调优和配置
开发语言·php
珊瑚里的鱼30 分钟前
第一讲 | 算法复杂度
c语言·开发语言·数据结构·笔记·算法·visualstudio·visual studio
啊阿狸不会拉杆1 小时前
人工智能数学基础(四):线性代数
人工智能·python·数学·算法·机器学习
玖剹1 小时前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节
zwz宝宝1 小时前
第三次作业(密码学)
java·数据结构·算法
sxtyjty2 小时前
tarjan缩点+强联通分量
算法
freyazzr2 小时前
Leetcode刷题 | Day50_图论02_岛屿问题01_dfs两种方法+bfs一种方法
数据结构·c++·算法·leetcode·深度优先·图论·广度优先
悦悦子a啊2 小时前
C++之string
开发语言·数据结构·c++
我想进大厂2 小时前
图论---LCA(倍增法)
数据结构·c++·算法·图论