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;
}
 
相关推荐
全栈小精灵几秒前
Winform入门
开发语言·机器学习·c#
心静财富之门几秒前
退出 for 循环,break和continue 语句
开发语言·python
txinyu的博客3 分钟前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表
搞笑症患者17 分钟前
压缩感知(Compressed Sensing, CS)
算法·最小二乘法·压缩感知·正交匹配追踪omp·迭代阈值it算法
Mr -老鬼18 分钟前
Rust适合干什么?为什么需要Rust?
开发语言·后端·rust
im_AMBER21 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
予枫的编程笔记21 分钟前
【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
java·开发语言·数据结构·人工智能·链表·哈希算法
ohoy27 分钟前
RedisTemplate 使用之Set
java·开发语言·redis
mjhcsp27 分钟前
C++ 后缀数组(SA):原理、实现与应用全解析
java·开发语言·c++·后缀数组sa
hui函数28 分钟前
如何解决 pip install 编译报错 ‘cl.exe’ not found(缺少 VS C++ 工具集)问题
开发语言·c++·pip