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;
}
 
相关推荐
吃什么芹菜卷2 分钟前
深度学习:词嵌入embedding和Word2Vec
人工智能·算法·机器学习
m0_687399845 分钟前
QT combox 前缀匹配
开发语言·数据库·qt
wclass-zhengge6 分钟前
数据结构与算法篇(树 - 常见术语)
数据结构·算法
labuladuo52011 分钟前
AtCoder Beginner Contest 372 F题(dp)
c++·算法·动态规划
夜雨翦春韭13 分钟前
【代码随想录Day31】贪心算法Part05
java·数据结构·算法·leetcode·贪心算法
汤兰月13 分钟前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
DieSnowK14 分钟前
[C++][第三方库][httplib]详细讲解
服务器·开发语言·c++·http·第三方库·新手向·httplib
火红的小辣椒19 分钟前
PHP反序列化8(phar反序列化)
开发语言·web安全·php
中杯可乐多加冰24 分钟前
【AI驱动TDSQL-C Serverless数据库技术实战】 AI电商数据分析系统——探索Text2SQL下AI驱动代码进行实际业务
c语言·人工智能·serverless·tdsql·腾讯云数据库