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;
}
 
相关推荐
有梦想的骇客4 小时前
书籍将正方形矩阵顺时针转动90°(8)0605
线性代数·算法·矩阵
有梦想的骇客4 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
Chenyu_3105 小时前
12.找到字符串中所有字母异位词
c语言·数据结构·算法·哈希算法
苏三福5 小时前
yolo11-seg ultralytics 部署版本
算法·yolo11
门前云梦6 小时前
《C语言·源初法典》---C语言基础(上)
c语言·开发语言·学习
sjtu_cjs7 小时前
Tensorrt python api 10.11.0笔记
开发语言·笔记·python
哆啦A梦的口袋呀7 小时前
深入理解系统:UML类图
开发语言·python·uml
虎冯河7 小时前
怎么让Comfyui导出的图像不包含工作流信息,
开发语言·python
coding随想7 小时前
JavaScript中的原始值包装类型:让基本类型也能“变身”对象
开发语言·javascript·ecmascript