feat(*): 代码仓库初始化

This commit is contained in:
2025-11-07 18:39:29 +08:00
commit b1aeb6b39b
36 changed files with 1700 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.venv

17
DataStructure/README.md Normal file
View File

@@ -0,0 +1,17 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## 数据结构
### 文件介绍
```sh
.
├── test1 # 实验1
├── test2 # 实验2
└── test3 # 实验3
```

View File

@@ -0,0 +1,229 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct LNode
{
int data; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct LNode *next; // ָ<><D6B8><EFBFBD><EFBFBD>
} LNode, *LinkList; // LinkListΪָ<CEAA><D6B8>LNode<64><65><EFBFBD>͵<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void chushihua(LinkList &L, LinkList &M, LinkList &N, LinkList &H) // <20><>ʼ<EFBFBD><CABC><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C>M<EFBFBD><4D>N<EFBFBD><4E>H
{
// todo list
L = (LinkList)malloc(sizeof(LNode));
M = (LinkList)malloc(sizeof(LNode));
N = (LinkList)malloc(sizeof(LNode));
H = (LinkList)malloc(sizeof(LNode));
L->next = NULL; // ֱ<><D6B1><EFBFBD>ÿգ<C3BF><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
M->next = NULL;
N->next = NULL;
H->next = NULL;
}
void Emp(LinkList &L) // <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD>ձ<EFBFBD>
{
// if (//todo list)
if (L->next == NULL)
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>\n");
else
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ǿձ<EFBFBD><EFBFBD><EFBFBD>\n");
}
void Length(LinkList L)
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
LNode *p; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>p
p = L->next; // pָ<70><D6B8><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>(<28><>Ԫ<EFBFBD><D4AA><EFBFBD>)
int length = 0;
// todo list //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
while (p != NULL)
{
length++;
p = p->next;
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%d\n", length);
}
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
void xianshi(LinkList &L)
{
LNode *p; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>p //LinkList p;
p = L;
while (p->next != NULL)
{
printf("%4d", p->next->data);
p = p->next;
}
printf("\n"); // <20><><EFBFBD>ӻ<EFBFBD><D3BB>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ڲ鿴
}
// 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>в<EFBFBD><D0B2><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD>С<EFBFBD><D0A1><EFBFBD>󣩡<EFBFBD>
void charu_1(LinkList &L, int n)
{
LNode *q, *p;
for (int i = 1; i <= n; i++)
{
p = L; // <20><>ÿ<EFBFBD><C3BF>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><70><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ڵ<EFBFBD>L
q = (LinkList)malloc(sizeof(LNode)); // Ϊ<>µĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD><EFBFBD><71><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ", i);
scanf("%d", &q->data); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><E6B4A2><71><D6B8>Ľڵ<C4BD><DAB5>data<74>ֶ<EFBFBD><D6B6><EFBFBD>
q->next = NULL; // <20><><EFBFBD>½ڵ<C2BD><DAB5>nextָ<74><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪNULL<4C><4C><EFBFBD><EFBFBD>ʾ<EFBFBD>½ڵ㵱ǰ<E3B5B1><C7B0>ָ<EFBFBD><D6B8><EFBFBD>κνڵ㡣
// <20><><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>λ<EFBFBD><CEBB>
while (p->next != NULL && p->next->data < q->data)
{
p = p->next; // <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
}
// <20><><EFBFBD><EFBFBD><EFBFBD>½ڵ<C2BD>
q->next = p->next;
p->next = q;
}
}
// 2<><32><EFBFBD>ֽ⣺<D6BD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>е<EFBFBD>Ԫ<EFBFBD>ط<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M<EFBFBD><4D>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ǡ<EFBFBD>
void fenbiao(LinkList &L, LinkList &M, LinkList &N)
{
LNode *j, *o, *p, *temp;
p = L;
while (p->next != NULL)
{
temp = p->next; // <20><><EFBFBD>浱ǰ<E6B5B1>ڵ<EFBFBD>
p->next = temp->next; // <20><>ǰ<EFBFBD>ƶ<EFBFBD>p<EFBFBD><70>next<78><74><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
if (temp->data % 2 == 0) // ż<><C5BC>Ԫ<EFBFBD>أ<EFBFBD>ǰ<EFBFBD><EFBFBD><E5B7A8>M
{
o = (LinkList)malloc(sizeof(LNode));
o->data = temp->data;
o->next = M->next;
M->next = o;
}
else // <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD>ǰ<EFBFBD><EFBFBD><E5B7A8>N
{
j = (LinkList)malloc(sizeof(LNode));
j->data = temp->data;
j->next = N->next;
N->next = j;
}
free(temp); // <20>ͷ<EFBFBD>ԭ<EFBFBD>ڵ<EFBFBD><DAB5>ڴ<EFBFBD>
}
printf("<EFBFBD><EFBFBD><EFBFBD>Ϊ:");
xianshi(N); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>N<EFBFBD><4E>
printf("ż<EFBFBD><EFBFBD>Ϊ:");
xianshi(M); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>Ӧ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>M<EFBFBD><4D>
}
// 3<><33><EFBFBD>ϲ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ϲ<EFBFBD>Ϊһ<CEAA><D2BB><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD><48><EFBFBD>ϲ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>
void hebiao(LinkList &J, LinkList &O, LinkList &H)
{
LNode *p, *q, *t, *m;
p = J->next; // ָ<><D6B8><EFBFBD><EFBFBD>Ԫ<EFBFBD>ڵ<EFBFBD>
q = O->next;
m = H; // m<><EFBFBD><E0B5B1>βָ<CEB2><EFBFBD><EBA3AC>ʼָ<CABC><D6B8>ͷ<EFBFBD>ڵ<EFBFBD>
// <20><><EFBFBD><48><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
H->next = NULL;
while (p != NULL && q != NULL) // <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>
{
if (p->data > q->data) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
{
t = (LinkList)malloc(sizeof(LNode));
t->data = p->data;
t->next = NULL;
m->next = t; // β<><CEB2>
m = t; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8>
p = p->next; // <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
}
else // ȡż<C8A1><C5BC>
{
t = (LinkList)malloc(sizeof(LNode));
t->data = q->data;
t->next = NULL;
m->next = t; // β<><CEB2>
m = t; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8>
q = q->next; // <20>ƶ<EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>p<EFBFBD><70>
}
}
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
while (p != NULL)
{
t = (LinkList)malloc(sizeof(LNode));
t->data = p->data;
t->next = NULL;
m->next = t;
m = t;
p = p->next;
}
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ż<EFBFBD><C5BC><EFBFBD>ڵ<EFBFBD>
while (q != NULL)
{
t = (LinkList)malloc(sizeof(LNode));
t->data = q->data;
t->next = NULL;
m->next = t;
m = t;
q = q->next; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>p
}
printf("<EFBFBD>Ӵ<EFBFBD>С<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>");
xianshi(H); // <20><>ʾ<EFBFBD>ϱ<EFBFBD>H
}
int main()
{
// <20><><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD>Ϊͷ<CEAA><CDB7><EFBFBD><E3A3AC>ͷָ<CDB7><D6B8>ֱ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
LinkList head = (LinkList)malloc(sizeof(LNode));
LinkList ji = (LinkList)malloc(sizeof(LNode));
LinkList ou = (LinkList)malloc(sizeof(LNode));
LinkList he = (LinkList)malloc(sizeof(LNode));
int choose = -1, n;
printf("*********************************************\n");
printf("********** ʵ<><CAB5>һ *******\n");
printf("*********************************************\n");
printf("********** 1.<2E><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 3.<2E>ֳ<EFBFBD><D6B3><EFBFBD><><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 4.<2E>ϲ<EFBFBD><CFB2>ɵݼ<C9B5><DDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 5.<2E><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 6.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> *******\n");
printf("********** 7.<2E>жϵ<D0B6><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA> *******\n");
printf("********** 0.<2E>˳<EFBFBD> *******\n");
printf("*********************************************\n");
while (choose)
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
chushihua(head, ji, ou, he);
break;
case 2:
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
scanf("%d", &n);
charu_1(head, n);
break;
case 3:
fenbiao(head, ou, ji);
break;
case 4:
hebiao(ji, ou, he);
break;
case 5:
xianshi(head);
break;
case 6:
Length(head);
break;
case 7:
Emp(head);
break;
case 0:
exit(0);
break;
}
}
}

View File

@@ -0,0 +1,233 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct PNode
{
int index; // 指数
int coe; // 系数
struct PNode *next; // 指针域
} PNode, *Polynomial;
void chushihua(Polynomial &L, Polynomial &M, Polynomial &N)
{
// todo list
L = (Polynomial)malloc(sizeof(PNode));
M = (Polynomial)malloc(sizeof(PNode));
N = (Polynomial)malloc(sizeof(PNode));
L->next = NULL;
M->next = NULL;
N->next = NULL;
}
void Emp(Polynomial &L)
{
if (L->next == NULL)
printf("链表为空表。\n");
else
printf("链表为非空表。\n");
}
void Length(Polynomial &L)
{
PNode *p;
int length = 0;
// todo list //while循环不断往后移动p指针并让length++
p = L;
while (p->next != NULL)
{
p = p->next;
length++;
}
printf("链表长度为:%d\n", length);
}
// 1、构造两个按指数递增的有序链表插入节点创建一元多项式
void charu_1(Polynomial &L)
{
PNode *q, *p;
int n;
printf("请输入你要创建的一元多项式的项数:\n");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
p = L;
q = (Polynomial)malloc(sizeof(PNode));
printf("请输入第%d项的系数和指数", i);
scanf("%d%d", &q->coe, &q->index);
q->next = NULL;
while (p->next != NULL && p->next->index < q->index)
{
// todo list p指针移动到最后一个结点位置
p = p->next;
}
// todo list 将*q结点插入到*p结点后
q->next = p->next;
p->next = q;
}
}
void xianshi(Polynomial &L)
{
PNode *p;
p = L;
while (p->next != NULL)
{
printf("%4d", p->next->coe); // 系数
printf("H");
printf("%d", p->next->index); // 指数
p = p->next;
}
}
// 2、两个一元多项式相加
void hebiao(Polynomial &J, Polynomial &O, Polynomial &H)
{
PNode *p = J->next, *q = O->next, *r = H, *s; // r是尾指针
while (p != NULL && q != NULL)
{
if (p->index < q->index)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存p指向结点的系数和指数到s所指向结点中的系数和指数中
s->coe = p->coe;
s->index = p->index;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
p = p->next; // 更新p指针
}
else if (p->index > q->index)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存q指向结点的系数和指数到s所指向结点中的系数和指数中
s->coe = q->coe;
s->index = q->index;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
q = q->next; // 更新q指针
}
else
{ // 指数相等的情况
int sum = p->coe + q->coe;
if (sum != 0)
{
s = (Polynomial)malloc(sizeof(PNode));
// todo list //保存p指向结点的指数到s所指向结点中的指数中
s->index = p->index;
// todo list //保存sum到s所指向结点中的系数中
s->coe = sum;
// todo list //插入s所指向结点到r所指向结点的后面
s->next = NULL;
r->next = s;
r = s; // 更新尾指针
}
p = p->next; // 更新p指针
q = q->next; // 更新q指针
}
}
while (p != NULL)
{ // J链表非空还剩余有元素把其剩余的元素插入到合表H链表后面
s = (Polynomial)malloc(sizeof(PNode));
// todo list 尾插
s->coe = p->coe;
s->index = p->index;
s->next = NULL;
r->next = s;
r = s;
p = p->next; // 更新p指针
}
while (q != NULL)
{ // O链表非空还剩余有元素把其剩余的元素插入到合表H链表后面
s = (Polynomial)malloc(sizeof(PNode));
// todo list 尾插
s->coe = q->coe;
s->index = q->index;
s->next = NULL;
r->next = s;
r = s;
q = q->next; // 更新q指针
}
xianshi(H); // 新增
}
int main()
{
Polynomial head[3];
int i;
for (i = 0; i < 3; i++)
{
head[i] = (Polynomial)malloc(sizeof(PNode)); // head[0]表示第一个一元多项式链表head[1]为第二个一元多项式链表
}
int choose = -1, n;
printf("*********************************************************\n");
printf("********** 实验二 *******\n");
printf("*********************************************\n");
printf("********** 1.初始化单链表 *******\n");
printf("********** 2.建立递增链表(按指数递增) *******\n");
printf("********** 3.显示单链表整体 *******\n");
printf("********** 4.求单链表长度 *******\n");
printf("********** 5.判断单链表是否为空 *******\n");
printf("********** 6.求一元多项式的和 *******\n");
printf("********** 0.退出 *******\n");
printf("*********************************************************\n");
while (choose)
{
printf("请输入你的选择项:\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
chushihua(head[0], head[1], head[2]);
printf("链表已经初始化。\n");
break;
case 2:
for (i = 0; i < 2; i++)
{
printf("创建的第%d个一元多项式\n", i + 1);
charu_1(head[i]); // 插入节点到指定链表
}
break;
case 3:
printf("显示第1个链表");
xianshi(head[0]); // 显示第1个链表
printf("\n");
printf("显示第2个链表");
xianshi(head[1]); // 显示第2个链表
printf("\n");
// xianshi(head[2]); // 显示第3个链表
// printf("\n");
break;
case 4:
printf("计算第1个链表的长度");
Length(head[0]); // 计算 第1个链表的长度
printf("计算第2个链表的长度");
Length(head[1]); // 计算 第2个链表的长度
// Length(head[2]); //计算 第3个链表的长度
break;
case 5:
printf("判断第1个链表是否为空");
Emp(head[0]); // 判断第1个链表是否为空
printf("判断第2个链表是否为空");
Emp(head[1]); // 判断第2个链表是否为空
// Emp(head[2]); // 判断第3个链表是否为空
break;
case 6:
hebiao(head[0], head[1], head[2]);
break;
case 0:
exit(0);
break;
}
}
return 0; // 程序正常退出时返回0
}

View File

@@ -0,0 +1,129 @@
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct Queue
{
int *data; // 存储空间的基地址
int front, rear; // 头指针、尾指针
int count; // 新增一个 count变量用于记录队中元素个数
} Queue;
// 初始化队列
void Init(Queue &Q)
{
Q.data = new int[MAXSIZE];
// todo list 处理front, rear指针以及count变量
Q.front = 0;
Q.rear = 0;
Q.count = 0;
}
// 入队
void EnQueue(Queue &Q, int e)
{
if (Q.count >= MAXSIZE) // todo list //利用count判断队是否满
printf("队满\n"); // 【有坑,思考】
else
{
// todo list //入队元素,尾指针+1
Q.data[Q.rear] = e;
Q.rear++;
// todo list //更新count值
Q.count++;
}
}
// 出队
void DelQueue(Queue &Q, int &e)
{
if (Q.count == 0) // todo list //利用count判断队是否空
printf("队空\n");
else
{
// todo list //出队元素,头指针+1
e = Q.data[Q.front];
Q.front++;
// todo list //更新count值
Q.count--;
printf("出队元素为:%d\n", e);
}
}
// 判断队空
void IsNull(Queue Q)
{
if (Q.count == 0) // todo list //利用count判断队是否空
printf("队空\n");
else
printf("队不空\n");
}
// 显示整个队列
void Display(Queue Q)
{
while (Q.count > 0)
{
printf("%3d,", Q.data[Q.front]);
// todo list //头指针依次往后移动
Q.front++;
// todo list //更新count值
Q.count--;
}
printf("\n");
}
int main()
{
Queue Q;
printf("------------------------------------\n");
printf("1.初始化队列\n");
printf("2.判断队列是否为空\n");
printf("3.入队\n");
printf("4.出队\n");
printf("5.显示整个队列\n");
printf("6.退出\n");
printf("------------------------------------\n");
int sel;
while (1)
{
printf("请输入选项:");
scanf("%d", &sel);
// getchar();
switch (sel)
{
case 1:
Init(Q);
printf("链表已经初始化。\n");
break;
case 2:
IsNull(Q);
break;
case 3:
{
int n, e;
printf("请输入入队元素个数:");
scanf("%d", &n);
printf("请输入需要入队的%d个元素:", n);
for (int i = 0; i < n; i++)
{
scanf("%d", &e);
EnQueue(Q, e);
}
}
break;
case 4:
{
int e;
DelQueue(Q, e);
}
break;
case 5:
printf("队列为:");
Display(Q);
break;
case 6:
exit(0);
}
}
}

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 zhilv
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

27
README.md Normal file
View File

@@ -0,0 +1,27 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## 在 `cqucc` 的一些代码
1. 目录结构
```sh
.
├── DataStructure # 数据结构
├── Server # Node.js 从基础到项目实践
├── Spider # Python 网络爬虫基础教程
└── Web # Web 前端开发技术
```
2. 目录
- [数据结构](Web/README.md)
- [`Node.js` 从基础到项目实践](Web/README.md)
- [`Python` 网络爬虫基础教程](Spider/README.md)
- [`Web` 前端开发技术](Web/README.md)
## 📜 License
This project is licensed under the [MIT License](LICENSE).

14
Server/1/aa.js Normal file
View File

@@ -0,0 +1,14 @@
const fs = require("fs");
fs.readFile(__dirname + "/aa.txt", "utf8", (err, data) => {
if (err) return;
const content = data
.replace(/(\d+)[、.](?=\s*)/g, "$1、 ")
.replace(/([A-D])[.、](?=\s*)/g, "$1. ")
.replace(/\r?\n([B-D]\.)/g, "\t$1");
fs.writeFile(__dirname + "/new.txt", content, "utf8", (err) => {
if (err) return;
});
});

10
Server/1/aa.txt Normal file
View File

@@ -0,0 +1,10 @@
1、四大名著有哪些?
A.西游记
B.水浒传
C.三国演义
D.红楼梦
2.我们的口号
A、键盘敲烂、月薪过万
B、键盘生灰、垃圾一堆
C、键盘打烂
D、键盘放烂

4
Server/1/new.txt Normal file
View File

@@ -0,0 +1,4 @@
1、 四大名著有哪些?
A. 西游记 B. 水浒传 C. 三国演义 D. 红楼梦
2、 我们的口号
A. 键盘敲烂、月薪过万 B. 键盘生灰、垃圾一堆 C. 键盘打烂 D. 键盘放烂

1
Server/2/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
text.txt

20
Server/2/README.md Normal file
View File

@@ -0,0 +1,20 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## `Python` 网络爬虫基础教程
### 文件介绍
```sh
.
├── 1 # 课堂作业1
├── 2 # 课堂作业2
└── tests # 实验文件夹
├── test1 # 实验一
├── test2 # 实验二
└── test3 # 实验三
```

6
Server/2/main.js Normal file
View File

@@ -0,0 +1,6 @@
const utils = require("./utils");
const fs = require("fs");
const text = fs.readFileSync(__dirname + "/text.txt", "utf8");
console.log(utils.word_count(text));

12
Server/2/utils.js Normal file
View File

@@ -0,0 +1,12 @@
const word_count = function (text) {
const text_list = text.replace(/[、\r?\n,\s]+/g, " ").split(" ");
let word_obj = {};
for (const word of text_list) {
word_obj[word] = (word_obj[word] || 0) + 1;
}
return word_obj;
};
module.exports = {
word_count,
};

18
Server/README.md Normal file
View File

@@ -0,0 +1,18 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## `Node.js` 从基础到项目实践
### 文件介绍
```sh
.
├── images # 图片资源
├── test1 # 实验一
├── test2 # 实验二
└── test3 # 实验三
```

View File

@@ -0,0 +1,133 @@
const os = require("os");
const path = require("path");
// 格式化字节数为人类可读的单位
function formatBytes(bytes) {
const size = {
GB: 1024 * 1024 * 1024,
MB: 1024 * 1024,
KB: 1024,
B: 1,
};
for (const key in size) {
if (bytes >= size[key]) return `${bytes / size[key]} ${key}`;
}
}
// 工具函数:统一处理路径分隔符为正斜杠
const formatPath = (pathStr) => {
return pathStr.replace(/\\/g, "/"); // 单个反斜杠替换为正斜杠
};
// 1. 操作系统基本信息
const getSystemInfo = () => {
return {
osType: os.type(),
osPlatform: os.platform(),
osVersion: os.release(),
osName: os.version(),
arch: os.arch(),
hostname: os.hostname(),
systemStartTime: new Date(os.uptime() * 1000).toLocaleDateString(),
systemRunningTime: `${Math.floor(os.uptime() / 3600)}小时 ${
Math.floor(os.uptime() % 3600) / 60
}分钟`,
};
};
// 2. CPU信息
const getCPUInfo = () => {
const cpus = os.cpus();
return {
number: cpus.length,
model: cpus[0].model,
speed: cpus[0].speed + "MHz",
};
};
// 3. 内存信息
const getMemoryInfo = () => {
return {
total: formatBytes(os.totalmem()),
freeMemory: formatBytes(os.freemem()),
useMemory: formatBytes(os.totalmem() - os.freemem()),
useRate: `${Math.round((1 - os.freemem() / os.totalmem()) * 100)}%`,
};
};
// 4. 用户信息
const getUserInfo = () => {
const userInfo = os.userInfo();
return {
userName: userInfo.username,
uid: userInfo.uid,
gid: userInfo.gid,
homeDir: formatPath(userInfo.homedir),
shell: userInfo.shell || "unknown",
};
};
// 5. 目录信息
const getDirInfo = () => {
return {
homeDir: formatPath(os.homedir()),
tmpDir: formatPath(os.tmpdir()),
};
};
// 6. 负载信息 (仅 Unix 系统有效)
const getDutyInfo = () => {
const loadavg = os.loadavg();
return {
min1: loadavg[0].toFixed(2),
min5: loadavg[1].toFixed(2),
min15: loadavg[2].toFixed(2),
};
};
// 7. 网络接口信息
const getNetworkInterfaceInfo = () => {
const networkInterfaces = os.networkInterfaces();
const data = [];
for (const [interfaceName, interfaceInfo] of Object.entries(
networkInterfaces
)) {
let item;
interfaceInfo.forEach((info) => {
item = {
name: interfaceName,
family: info.family,
ip: info.address,
mac: info.mac,
localAddress: info.internal ? true : false,
netmask: info.netmask,
gateway: info.gateway,
};
});
data.push(item);
}
return data;
};
const getAll = () => {
return {
SystemInfo: getSystemInfo(),
CPUInfo: getCPUInfo(),
MemoryInfo: getMemoryInfo(),
UserInfo: getUserInfo(),
DirInfo: getDirInfo(),
DutyInfo: getDutyInfo(),
NetworkInterfaceInfo: getNetworkInterfaceInfo(),
};
};
module.exports = {
getSystemInfo,
getCPUInfo,
getMemoryInfo,
getUserInfo,
getDirInfo,
getDutyInfo,
getNetworkInterfaceInfo,
getAll,
};

View File

@@ -0,0 +1,268 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>系统指标详情</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
h1 {
text-align: center;
color: #2c3e50;
margin-bottom: 30px;
}
.section {
margin-bottom: 40px;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
h2 {
color: #34495e;
border-left: 4px solid #3498db;
padding-left: 10px;
margin-top: 0;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 15px;
}
th,
td {
padding: 12px 15px;
text-align: left;
border-bottom: 1px solid #ecf0f1;
}
th {
background-color: #f8f9fa;
color: #2c3e50;
font-weight: 600;
}
tr:hover {
background-color: #f8f9fa;
}
.network-item {
margin-bottom: 15px;
padding: 15px;
border-radius: 6px;
background-color: #f8f9fa;
}
.update-time {
text-align: right;
color: #7f8c8d;
font-size: 0.9em;
margin-bottom: 10px;
}
@media (max-width: 768px) {
table,
th,
td {
display: block;
}
th {
position: absolute;
top: -9999px;
left: -9999px;
}
tr {
margin-bottom: 15px;
border: 1px solid #ecf0f1;
border-radius: 6px;
}
td {
position: relative;
padding-left: 50%;
border-bottom: none;
}
td:before {
position: absolute;
left: 15px;
content: attr(data-label);
font-weight: 600;
color: #2c3e50;
}
}
</style>
</head>
<body>
<div class="container">
<h1>系统指标详情</h1>
<div class="update-time" id="updateTime"></div>
<div id="content"></div>
</div>
</body>
<script>
let data = `@@@`;
// 解析数据并渲染页面
function renderData() {
const systemData = JSON.parse(data);
const content = document.getElementById('content');
let html = '';
// 更新时间
document.getElementById('updateTime').textContent = `最后更新: ${new Date().toLocaleString()}`;
// 1. 系统信息
html += `
<div class="section">
<h2>1. 系统基础信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">操作系统类型</td><td data-label="数值">${systemData.SystemInfo.osType}</td></tr>
<tr><td data-label="指标名称">系统平台</td><td data-label="数值">${systemData.SystemInfo.osPlatform}</td></tr>
<tr><td data-label="指标名称">系统版本</td><td data-label="数值">${systemData.SystemInfo.osVersion}</td></tr>
<tr><td data-label="指标名称">系统名称</td><td data-label="数值">${systemData.SystemInfo.osName}</td></tr>
<tr><td data-label="指标名称">系统架构</td><td data-label="数值">${systemData.SystemInfo.arch}</td></tr>
<tr><td data-label="指标名称">主机名</td><td data-label="数值">${systemData.SystemInfo.hostname}</td></tr>
<tr><td data-label="指标名称">系统启动时间</td><td data-label="数值">${systemData.SystemInfo.systemStartTime} ${systemData.SystemInfo.systemStartTime === '1970/1/1' ? '(可能为数据异常)' : ''}</td></tr>
<tr><td data-label="指标名称">系统运行时长</td><td data-label="数值">${systemData.SystemInfo.systemRunningTime}</td></tr>
</table>
</div>`;
// 2. CPU信息
html += `
<div class="section">
<h2>2. CPU信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">CPU核心数</td><td data-label="数值">${systemData.CPUInfo.number}</td></tr>
<tr><td data-label="指标名称">CPU型号</td><td data-label="数值">${systemData.CPUInfo.model}</td></tr>
<tr><td data-label="指标名称">CPU基础频率</td><td data-label="数值">${systemData.CPUInfo.speed}</td></tr>
</table>
</div>`;
// 3. 内存信息
html += `
<div class="section">
<h2>3. 内存信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">总内存</td><td data-label="数值">${systemData.MemoryInfo.total}</td></tr>
<tr><td data-label="指标名称">空闲内存</td><td data-label="数值">${systemData.MemoryInfo.freeMemory}</td></tr>
<tr><td data-label="指标名称">已使用内存</td><td data-label="数值">${systemData.MemoryInfo.useMemory}</td></tr>
<tr><td data-label="指标名称">内存使用率</td><td data-label="数值">${systemData.MemoryInfo.useRate}</td></tr>
</table>
</div>`;
// 4. 用户信息
html += `
<div class="section">
<h2>4. 用户信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">用户名</td><td data-label="数值">${systemData.UserInfo.userName}</td></tr>
<tr><td data-label="指标名称">用户IDuid</td><td data-label="数值">${systemData.UserInfo.uid} (Windows系统默认值)</td></tr>
<tr><td data-label="指标名称">用户组IDgid</td><td data-label="数值">${systemData.UserInfo.gid} (Windows系统默认值)</td></tr>
<tr><td data-label="指标名称">用户主目录</td><td data-label="数值">${systemData.UserInfo.homeDir}</td></tr>
<tr><td data-label="指标名称">默认shell</td><td data-label="数值">${systemData.UserInfo.shell}</td></tr>
</table>
</div>`;
// 5. 目录信息
html += `
<div class="section">
<h2>5. 目录信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">用户主目录</td><td data-label="数值">${systemData.DirInfo.homeDir}</td></tr>
<tr><td data-label="指标名称">临时目录</td><td data-label="数值">${systemData.DirInfo.tmpDir}</td></tr>
</table>
</div>`;
// 6. 负载信息
html += `
<div class="section">
<h2>6. 系统负载信息</h2>
<table>
<tr><th>指标名称</th><th>数值</th></tr>
<tr><td data-label="指标名称">1分钟负载</td><td data-label="数值">${systemData.DutyInfo.min1}</td></tr>
<tr><td data-label="指标名称">5分钟负载</td><td data-label="数值">${systemData.DutyInfo.min5}</td></tr>
<tr><td data-label="指标名称">15分钟负载</td><td data-label="数值">${systemData.DutyInfo.min15}</td></tr>
</table>
</div>`;
// 7. 网络接口信息
html += `<div class="section"><h2>7. 网络接口信息</h2><div id="networkList">`;
systemData.NetworkInterfaceInfo.forEach(iface => {
html += `
<div class="network-item">
<h3>网络接口:${iface.name} ${iface.localAddress ? '(本地回环)' : ''}</h3>
<table>
<tr><td data-label="指标名称">网络协议</td><td data-label="数值">${iface.family}</td></tr>
<tr><td data-label="指标名称">IP地址</td><td data-label="数值">${iface.ip}</td></tr>
<tr><td data-label="指标名称">MAC地址</td><td data-label="数值">${iface.mac}</td></tr>
<tr><td data-label="指标名称">是否本地地址</td><td data-label="数值">${iface.localAddress ? '是' : '否'}</td></tr>
<tr><td data-label="指标名称">子网掩码</td><td data-label="数值">${iface.netmask}</td></tr>
</table>
</div>`;
});
html += `</div></div>`;
console.log(html);
content.innerHTML = html;
}
// 初始渲染
renderData();
// 模拟数据更新每5秒更新一次运行时间
setInterval(() => {
const systemData = JSON.parse(data);
// 解析当前运行时间并增加1分钟
const timeMatch = systemData.SystemInfo.systemRunningTime.match(/(\d+)小时 (\d+\.\d+)分钟/);
if (timeMatch) {
const hours = parseInt(timeMatch[1]);
let minutes = parseFloat(timeMatch[2]) + 1;
// 处理分钟进位
if (minutes >= 60) {
minutes -= 60;
systemData.SystemInfo.systemRunningTime = `${hours + 1}小时 ${minutes.toFixed(15)}分钟`;
} else {
systemData.SystemInfo.systemRunningTime = `${hours}小时 ${minutes.toFixed(15)}分钟`;
}
// 更新内存使用率随机波动1-2%
const currentRate = parseInt(systemData.MemoryInfo.useRate);
const newRate = Math.max(10, Math.min(90, currentRate + (Math.random() > 0.5 ? 1 : -1)));
systemData.MemoryInfo.useRate = `${newRate}%`;
// 重新序列化数据
data = JSON.stringify(systemData);
// 重新渲染页面
renderData();
}
}, 5000); // 5秒更新一次
</script>
</html>

View File

@@ -0,0 +1,23 @@
const http = require("http");
const fs = require("fs");
const common = require(__dirname + "/common");
const server = http.createServer();
server.on("request", (req, res) => {
fs.readFile("./index.html", { encoding: "utf8" }, (err, data) => {
if (err) {
res.writeHead(500);
res.end("Error Loading File");
} else {
res.writeHead(200, {
"content-type": "text/html",
});
res.end(data.replace("@@@", JSON.stringify(common.getAll())));
}
});
});
server.listen(3000, () => {
console.log("server is running at http://127.0.0.1:3000");
});

View File

@@ -0,0 +1,14 @@
const myModule = require("./myModule");
console.log("Auther: ", myModule.auther);
console.log(myModule.greet("Alice"));
console.log("Sum: ", myModule.add(3, 5));
const lodash = require("lodash");
const array = [1, 2, 3, 4, 5];
const result = lodash.reverse(array);
console.log("Reverse array: ", result);
const gt3 = array.filter((n) => lodash.gt(n, 3));
console.log("Greater than 3: ", gt3);

View File

@@ -0,0 +1,15 @@
const auther = "harry";
const greet = (name) => {
return `Hello, ${name}!`;
};
const add = (a, b) => {
return a + b;
};
module.exports = {
auther,
greet,
add
}

2
Server/tests/test3/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
node_modules
pnpm-lock.yaml

View File

@@ -0,0 +1,16 @@
const express = require("express")
const { router } = require("./routes/useRoute")
const app = express()
app.use(express.json())
app.use(router)
app.listen("3000", (err) => {
if (err) {
console.log(err);
return
}
console.log("server listen :3000");
})

View File

@@ -0,0 +1,18 @@
{
"name": "test3",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"packageManager": "pnpm@10.14.0",
"dependencies": {
"express": "^5.1.0",
"joi": "^18.0.1",
"lodash": "^4.17.21"
}
}

View File

@@ -0,0 +1,100 @@
const express = require("express")
const { number } = require("joi")
const joi = require("joi")
const lodash = require("lodash")
const router = express.Router()
router.get("/userId/:userId", (req, res) => {
const userId = req.params.userId;
const { err } = joi.number().validate(userId);
if (err) {
return res.status(400).send("Invaild UserID");
}
res.send(`user ID is ${userId}`);
})
router.get("/userName", (req, res) => {
const { name } = req.query;
const schema = joi.object({
name: joi.string().min(2).max(20).required()
})
const { error } = schema.validate({ name })
if (error) {
return res.status(400).send("Invaild UserName");
}
res.send(`User name is ${name}`)
})
router.get("/profile", (req, res) => {
res.send("This is the user profile page.")
})
router.get("/profile/setting", (req, res) => {
res.send("This is the user profile setting page.")
})
const data = [
{ name: 'zs', course: 'app', score: 90 },
{ name: 'zs', course: 'java', score: 80 },
{ name: 'ls', course: 'app', score: 89 },
{ name: 'ls', course: 'java', score: 99 },
{ name: 'ww', course: 'app', score: 78 },
{ name: 'ww', course: 'java', score: 88 },
]
router.get("/myScoure", (req, res) => {
const { name } = req.query;
const schema = joi.object({
name: joi.string().min(2).max(20).required()
})
const { error } = schema.validate({ name });
if (error) {
return res.status(400).send("Invaild Name.");
}
const dataGroup = lodash(data).groupBy("name").get(name)
res.send(dataGroup)
})
router.get("/showScoure", (req, res) => {
const dataOrder = lodash.orderBy(data, ["score"], orders = "desc");
// console.log(dataOrder);
const dataGroup = lodash(data).groupBy("name").map((a) => {
return {
name: a[0].name,
avg: lodash.mean(a.map(e => e.score)),
}
})
res.send(dataGroup);
})
router.get("/mny", (_req, res) => {
const mnyData = [
{ name: '张三', mny: '9k' },
{ name: '随便', mny: 6666 },
{ name: '王五', mny: '1w' },
{ name: '李四', mny: 15000 },
]
const fixData = mnyData.map((d) =>
typeof d.mny === "string"
? {
name: d.name,
mny: parseInt(d.mny = d.mny.replace("w", "0000").replace("k", "000"))
}
: {
name: d.name,
mny: parseInt(d.mny)
}
)
const finalData = fixData.filter(d => lodash.gte(d.mny, 9000));
res.send(finalData)
})
module.exports = {
router
}

1
Spider/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
data.csv

15
Spider/README.md Normal file
View File

@@ -0,0 +1,15 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## `Python` 网络爬虫基础教程
### 文件介绍
```sh
.
└── test1.py # 获取研招网数据
```

74
Spider/test1.py Normal file
View File

@@ -0,0 +1,74 @@
import csv
import requests
from lxml import etree
class YXZS:
def __init__(self) -> None:
self.url = "https://yz.chsi.com.cn/sch/?start={}"
self.file = open("./data.csv", "+a", encoding="utf-8", newline="")
self.file.write("学校名称,学校性质,招生简章的链接,调剂办法的链接\n")
def get_html(self, page=1):
resp = requests.get(
self.url.format((page - 1) * 20),
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
},
)
if resp.status_code == 200:
return resp.text
return ""
def parse_html(self, html_text: str):
html = etree.HTML(html_text)
schs = html.xpath('//div[@class="sch-item"]')
for sch in schs:
item = {
"name": (
sch.xpath(
'.//a[@class="name js-yxk-yxmc text-decoration-none"]/text()'
)[0].strip()
if sch.xpath(
'.//a[@class="name js-yxk-yxmc text-decoration-none"]/text()'
)
else "unkonwn"
),
"tag": (
sch.xpath('.//span[@class="sch-tag"]/text()')[0].strip()
if sch.xpath('.//span[@class="sch-tag"]/text()')
else "unkonwn"
),
"href1": (
"https://yz.chsi.com.cn"
+ sch.xpath('.//div[@class="sch-link"]/a[2]/@href')[0]
if sch.xpath('.//div[@class="sch-link"]/a[2]/@href')
else "unkonwn"
),
"href2": (
"https://yz.chsi.com.cn"
+ sch.xpath('.//div[@class="sch-link"]/a[4]/@href')[0]
if sch.xpath('.//div[@class="sch-link"]/a[4]/@href')
else "unkonwn"
),
}
self.save_data(item)
def save_data(self, item):
writer = csv.DictWriter(self.file, fieldnames=item.keys())
writer.writerow(item)
def run(self):
for i in range(0, 47):
print("正在获取第{}".format(i + 1))
html_text = self.get_html(page=i)
if html_text == "":
print("{}页获取的内容为空")
continue
self.parse_html(html_text)
if __name__ == "__main__":
YXZS().run()

18
Web/README.md Normal file
View File

@@ -0,0 +1,18 @@
<!--
Copyright (c) 2025 zhilv
This software is released under the MIT License.
https://opensource.org/licenses/MIT
-->
## `Web` 前端开发技术
### 文件介绍
```sh
.
├── images # 图片资源
├── test1 # 实验一
├── test2 # 实验二
└── test3 # 实验三
```

BIN
Web/images/relax.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

26
Web/test1/plan.html Normal file
View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>我的待办事项与学习资源</h1>
<ol>
<li>周一: 完成工作报告</li>
<li>周二: 参加项目会议</li>
<li>周三: 准备新方案的资料收集</li>
</ol>
<ul>
<li><a href="https://www.runoob.com/" target="_blank">菜鸟教程</a></li>
<li><a href="https://www.w3school.com.cn/" target="_blank">w3school</a></li>
<li><a href="https://www.bilibili.com/" target="_blank">B站</a></li>
</ul>
<p>版权所有 &copy; zhilv</p>
<img src="../images/relax.png" alt="图片">
</body>
</html>

36
Web/test1/poem.html Normal file
View File

@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
h1,
h2,
p {
text-align: center;
}
</style>
</head>
<body>
<h1>李白《静夜思》赏析</h1>
<p><em>《静夜思》</em>是唐代诗人李白的经典诗作,它短小精悍,却蕴含着深深的思乡之情。</p>
<h2>原诗内容</h2>
<p><strong>床前</strong>明月光,<br>
疑是地上霜。<br>
举头<sup></sup>望明月,<br>
低头思故乡。</p>
<p> 在诗中,“床前”这个词被加粗(床前),起到了一定的强调作用,让读者首先注意到诗人所处的位置。<br>
而“疑是地上霜”这句诗,通过“霜”这个字形象地描绘出月光的皎洁清冷,仿佛地上结了一层霜,这种感觉通过简单的文字就传达给了读者。<br>
当诗人“举头①望明月”时,这里的上标数字①可以用来做注释标记,表示对“举头”这个动作可能存在的特殊解读或者引用来源等,明月成为了引发思乡之情的重要媒介。<br>
最后“低头思故乡”诗人深沉地用em标签表示情感上的强调陷入对故乡的思念之中。</p>
<hr>
<p>这首诗虽然没有华丽的辞藻,但每一个字都像是经过精心雕琢,<strong>强烈地用strong标签表示语义上的强调</strong>触动着读者内心深处的思乡情感,成为了千古流传的佳作。</p>
</body>
</html>

View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
p {
color: #cc0000;
font-size: 32px;
}
#tit {
background-color: gray;
}
.tit {
text-align: center;
font-style: italic;
font-family: "宋体";
}
a:link {
text-decoration: none;
}
a:hover {
color: red;
font-size: 24px;
}
a:active {
color: rgb(0, 204, 0);
}
a:after {
color: #9900ff;
}
[title] {
font-weight: bold;
}
</style>
</head>
<body>
<p id="tit" class="tit" title="tit">一个段落</p>
<a href="https://www.runoob.com/" target="_blank">点击跳转到菜鸟教程</a>
</body>
</html>

23
Web/test2/news.html Normal file
View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>新闻</title>
<style>
p {
letter-spacing: 6px;
line-height: 2em;
text-indent: 10px;
}
</style>
</head>
<body>
<p>&nbsp;&nbsp;昨天上午,南京国际博览中心金陵会议中心内欢声笑语,春意盎然,省委、省政府在这里举行春节团拜会。
Yesterday morning, the Jinling Conference Center of Nanjing International Expo Center was filled with laughter
and joy, and the provincial party committee and government held a Spring Festival gathering here.</p>
</body>
</html>

39
Web/test2/product.html Normal file
View File

@@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
p {
text-decoration: underline;
text-transform: capitalize;
}
#sc {
text-decoration: line-through;
text-transform: lowercase;
}
.gz {
text-decoration: overline;
text-transform: uppercase;
}
</style>
</head>
<body>
<h3>设置文字装饰及大小写转换</h3>
<p>Chongqing, abbreviated as "Yu", is a municipality directly under the central and western regions of China, famous
for its mountainous city characteristics, hotpot culture, and the beautiful scenery of the confluence of the
Yangtze River and Jialing River.</p>
<p id="sc">Sichuan, abbreviated as "Chuan" or "Shu", is located in southwestern China and is a province known for
its
magnificent natural scenery, rich cultural heritage, and spicy cuisine.</p>
<p class="gz">Guizhou, abbreviated as "Qian" or "Gui", is located in southwestern China and is a province renowned
for its
diverse ethnic cultures, spectacular karst landforms, and beautiful natural landscapes.</p>
</body>
</html>

77
Web/test3/table.html Normal file
View File

@@ -0,0 +1,77 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="./tableTitle.css">
<style>
table {
width: 600px;
height: 400px;
border-collapse: collapse;
}
td {
border-spacing: 0px;
border: 1px solid;
}
tr {
text-align: center;
}
tbody tr:nth-child(odd) {
background-color: #CDF8F9;
}
tbody tr:nth-child(even) {
background-color: #FDEFBB;
}
.xn {
background-color: rgb(255, 255, 134);
}
</style>
</head>
<body>
<table align="center" cellpadding="5">
<caption>简易学生表</caption>
<thead>
<tr>
<td></td>
<td>姓名</td>
<td>单位</td>
<td>学号</td>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="4" class="xn">2024-2025学年</td>
<td>王小品</td>
<td>商学院</td>
<td>110204</td>
</tr>
<tr>
<td>李中</td>
<td>财经学院</td>
<td>120204</td>
</tr>
<tr>
<td>胡三</td>
<td>大数据学院</td>
<td>130504</td>
</tr>
<tr>
<td>李白</td>
<td>人工智能学院</td>
<td>100244</td>
</tr>
<tr>
<td colspan="4" style="background-color: white;">重庆城市科技学院</td>
</tr>
</tbody>
</table>
</body>
</html>

7
Web/test3/tableTitle.css Normal file
View File

@@ -0,0 +1,7 @@
caption {
font-weight: bold;
font-size: 20px;
color: #0daeba;
background-color: bisque;
height: 36px;
}