commit 190a8eb65325879e31ddd160ea0bc13b5b6eedc8 Author: Jdhggg <24016020834@stu.nsu.edu.cn> Date: Tue Mar 25 18:09:23 2025 +0800 init diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d97cfcc --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf +/.vs/Project2 +/.vs diff --git a/Project2.sln b/Project2.sln new file mode 100644 index 0000000..562c622 --- /dev/null +++ b/Project2.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35828.75 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Project2", "Project2.vcxproj", "{137CCEB6-E223-4830-A736-5BED572F5DC8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Debug|x64.ActiveCfg = Debug|x64 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Debug|x64.Build.0 = Debug|x64 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Debug|x86.ActiveCfg = Debug|Win32 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Debug|x86.Build.0 = Debug|Win32 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Release|x64.ActiveCfg = Release|x64 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Release|x64.Build.0 = Release|x64 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Release|x86.ActiveCfg = Release|Win32 + {137CCEB6-E223-4830-A736-5BED572F5DC8}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AB6C27C7-C88E-477B-B238-D2A28049AF3C} + EndGlobalSection +EndGlobal diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f1f8b8 --- /dev/null +++ b/README.md @@ -0,0 +1,212 @@ +# 数据结构与算法练习代码 + +## 项目目标 + +本项目旨在通过C语言实现本学期所学的所有数据结构和算法,以提升编码能力、加深对数据结构和算法的理解,并培养良好的编程习惯。通过实际编写代码,我们将逐步构建一个完整的数据结构与算法库,为后续的软件开发和学习打下坚实的基础。 + +## 项目结构说明 + +项目采用模块化设计,每个数据结构或算法模块都独立封装,便于管理和复用。具体结构如下: + +- **`main.c`**:主程序文件,用于测试和调用其他模块的功能。它是整个项目的入口,通过它来运行和验证各个数据结构和算法模块的实现。 +- **算法源文件**:每个数据结构或算法模块都有一个独立的源文件,文件名以其实现的功能的英文名命名,例如`linked_list.c`用于实现链表,`stack.c`用于实现栈等。这种命名方式直观且易于理解,方便开发者快速定位和使用相关模块。 +- **头文件**:每个模块的头文件(如`linked_list.h`、`stack.h`等)用于声明该模块中定义的结构体和函数。头文件是模块对外的接口,它定义了模块可以被外部调用的函数和数据结构,隐藏了具体的实现细节,符合模块化设计的原则,同时也便于其他模块的引用和调用。 + +在编写被调用模块的代码时,首先需要在对应的头文件中声明结构体和函数,明确模块的接口;然后在对应的源文件中实现这些函数的功能。这种分离接口和实现的方式,不仅有助于代码的组织和管理,还便于后续的维护和扩展。例如,如果需要修改某个模块的内部实现,只需修改其源文件,而无需修改头文件和主程序文件,只要保持接口不变,不会影响其他模块的正常调用。 + +## 示例代码 + +以下是一个简单的示例,展示如何组织代码和实现功能。 + +### 简化示例代码 + +以下是一个简单的“Hello, World!”示例,展示如何在项目中添加一个新的模块。 + +#### `hello_world.h` + +```c +#ifndef HELLO_WORLD_H +#define HELLO_WORLD_H + +void print_hello_world(); + +#endif // HELLO_WORLD_H +``` + +#### `hello_world.c` + +```c +#include "hello_world.h" +#include + +void print_hello_world() { + printf("Hello, World!\n"); +} +``` + +#### 在`main.c`中调用 + +```c +#include "hello_world.h" + +int main() { + print_hello_world(); + return 0; +} +``` + +## 知识补充 + +### 头文件保护符 + +在C语言中,头文件(`.h`文件)通常使用预处理指令`#ifndef`、`#define`和`#endif`来防止头文件被重复包含,避免编译错误。这种技术被称为**头文件保护符**或**包含卫士**。 + +**工作原理:** + +1. **`#ifndef LINKED_LIST_H`**:检查宏`LINKED_LIST_H`是否未被定义。 +2. **`#define LINKED_LIST_H`**:如果未定义,则定义宏`LINKED_LIST_H`。 +3. **头文件内容**:包含实际的类型定义和函数声明。 +4. **`#endif`**:结束条件编译。 + +当头文件第一次被包含时,`LINKED_LIST_H`未被定义,编译器会处理头文件内容并定义`LINKED_LIST_H`。如果头文件再次被包含,由于`LINKED_LIST_H`已被定义,`#ifndef`条件不成立,编译器会跳过头文件内容,从而避免重复定义。 + +**注意事项:** + +- **宏名的唯一性**:确保每个头文件的宏名唯一,通常使用头文件名的大写形式,并用下划线替代非字母数字字符。 +- **`#pragma once`指令**:一些编译器支持`#pragma once`,它可以防止头文件被多次包含,使用起来更简洁,但并非所有编译器都支持,使用`#ifndef`等预处理指令具有更好的可移植性。 + +通过使用头文件保护符,可以有效防止头文件的重复包含,确保代码的正确编译。 + +### 命名规范 + +为了保持代码的一致性和可读性,本项目统一使用**小写下划线命名法**。例如,变量名和函数名使用`variable_name`和`function_name`的形式,宏定义使用`MACRO_NAME`的形式。 + +## 如何参与项目 + +### 1. 克隆项目 + +#### 方式1:直接克隆 + +```bash +git clone https://github.com/jdhnsu/C_DS_Algo.git +cd C_DS_Algo +``` + +#### 方式2(推荐): + +使用`GitHub Desktop`客户端克隆项目,并在本地创建分支。 + +- [GitHub Desktop 下载](https://desktop.github.com/download/) +- [GitHub Desktop 汉化工具](https://github.com/robotze/GithubDesktopZhTool) (记得给项目点个赞!) + +### 2. 添加新的数据结构或算法模块 + +- 工具说明:默认使用 *Visual Studio 2022 IDE*,克隆项目后,点击项目文件`Project2.sln`就可以开始编辑了。如果使用其它方式推荐使用`CMake`工具编译项目。 +- 创建一个新的头文件(如`new_module.h`)和源文件(如`new_module.c`)。 +- 在头文件中声明结构体和函数接口。 +- 在源文件中实现这些函数的功能。 +- 在`main.c`中调用新模块的功能,验证其正确性。 + +### 3. 提交代码 + +- 提交你的代码到你的分支。 +- 创建一个Pull Request,详细描述你的更改和新增功能。 + +### 4. 提出建议或问题 + +如果你有任何建议或遇到问题,欢迎在[Issues](https://github.com/jdhnsu/C_DS_Algo/issues)中提出,[wiki](https://github.com/jdhnsu/C_DS_Algo/wiki) 中也有许多代码讲解可以查看. + +## 示例:添加一个新的模块 + +假设我们要添加一个栈模块,以下是步骤: + +1. **创建头文件`stack.h`** + + ```c + #ifndef STACK_H + #define STACK_H + + typedef struct Stack { + int* elements; + int capacity; + int top; + } Stack; + + Stack* create_stack(int capacity); + void push(Stack* stack, int element); + int pop(Stack* stack); + bool is_empty(Stack* stack); + void free_stack(Stack* stack); + + #endif // STACK_H + ``` +2. **创建源文件`stack.c`** + + ```c + #include "stack.h" + #include + #include + + Stack* create_stack(int capacity) { + Stack* stack = (Stack*)malloc(sizeof(Stack)); + stack->elements = (int*)malloc(capacity * sizeof(int)); + stack->capacity = capacity; + stack->top = -1; + return stack; + } + + void push(Stack* stack, int element) { + if (stack->top == stack->capacity - 1) { + fprintf(stderr, "栈满,无法压入元素\n"); + return; + } + stack->elements[++stack->top] = element; + } + + int pop(Stack* stack) { + if (stack->top == -1) { + fprintf(stderr, "栈空,无法弹出元素\n"); + return -1; + } + return stack->elements[stack->top--]; + } + + bool is_empty(Stack* stack) { + return stack->top == -1; + } + + void free_stack(Stack* stack) { + free(stack->elements); + free(stack); + } + ``` +3. **在`main.c`中调用栈模块** + + ```c + #include "stack.h" + + int main() { + Stack* stack = create_stack(10); + push(stack, 10); + push(stack, 20); + printf("栈顶元素:%d\n", pop(stack)); + free_stack(stack); + return 0; + } + ``` +4. **提交代码** + + - 提交你的`stack.h`和`stack.c`文件。 + - 在`main.c`中验证栈模块的功能。(无需提交`main.c`文件) + - 提交时记得详细说明你的更改。 + +## 文件结构 + +``` +C_DS_Algo/ +├── (一些日志文件和git配置(忽略)) +├── README.md +├── linked_list.h +├── linked_list.c +└── main.c +``` diff --git a/array_queue.c b/array_queue.c new file mode 100644 index 0000000..4b5b5e4 --- /dev/null +++ b/array_queue.c @@ -0,0 +1,87 @@ +#include +#include +#include "array_queue.h" + +/*@------------- + # 设计思路更新(原版漏洞太多): + 设计圆环式队列,当rear == size时,循环到数组的[0]位,当然这样的队列仍然遵循`先进先出原则` + ## 实现思路: + 通过取模运算,使得rear和front都在数组的[0,size-1]范围内,这样就能实现循环队列的功能. + # 有点解析: + 在传统的队列中,当队尾到达队列的末尾时,即使队列前面还有空闲空间,也无法继续入队,导致空间浪费。而环形队列通过取模运算,\n + 使得队尾指针可以在到达队列末尾后,从头开始继续使用队列的空闲空间,从而提高了空间的利用率。 +@-------------*/ + + +// 初始化队列 +array_queue *init_array_queue() +{ + array_queue *q = (array_queue *)malloc(sizeof(array_queue)); + if (q == NULL) + {printf("error: malloc failed[From init_queue]"); return NULL;} + memset(q,0,sizeof(array_queue)); + q->front = 0; + q->rear = 0; + q->size = 0; + return q; +} + +// 判空 +int empty_array_queue(array_queue *q) +{ + if (q->size == 0) + return 1; + else + return 0; +} + +// 判断满 +int full_array_queue(array_queue *q) +{ + if (q->size == MAX_QUEUE) + return 1; + else + return 0; +} + +// 入队 +void push_array_queue(array_queue *q, elem_type value) +{ + if (full_array_queue(q)) + {printf("error: queue is full[From push_queue]"); return;} + q->data[q->rear] = value; + q->rear = (q->front + q->size +1) % MAX_QUEUE; + q->size++; +} + +// 出队 +elem_type pop_array_queue(array_queue *q) +{ + if (empty_array_queue(q)) + {printf("error: queue is empty[From pop_queue]"); return -1;} + elem_type value = q->data[q->front]; + q->front = (q->front + 1) % MAX_QUEUE; + q->size--; + return value; +} + +// 打印队列 +void print_array_queue(array_queue *q) +{ + if (empty_array_queue(q)) + { + printf("error :\n"); + return ; + } + for (int i=0;isize;i++) + { + printf("["); + printf("%d ",q->data[i%MAX_QUEUE]); + printf("]\n"); + } +} + + +// void return def => fuck shit +// if for while malloc def sleep pause NULL +// #include $time_noon \ No newline at end of file diff --git a/array_queue.h b/array_queue.h new file mode 100644 index 0000000..4f05aa0 --- /dev/null +++ b/array_queue.h @@ -0,0 +1,34 @@ +#ifndef ARRAY_QUEUE_H +#define ARRAY_QUEUE_H +#define MAX_QUEUE 3 +#define elem_type int +// queue 构建 +typedef struct array_queue +{ + elem_type data[MAX_QUEUE]; + int front; // 队列头指针 + int rear; // 队列尾指针 + int size; +}array_queue; + +// queue 初始化 +array_queue *inti_array_queue(); + +// 判空 +int empty_array_queue(array_queue *q); + +//判满 +int full_array_queue(array_queue *q); + +// 入队 +void push_array_queue(array_queue *q, elem_type value); + +// 出队 +elem_type pop_array_queue(array_queue *q); + +// 打印队列 +void print_array_queue(array_queue *q); + + + +#endif \ No newline at end of file diff --git a/array_stack.c b/array_stack.c new file mode 100644 index 0000000..058a9a9 --- /dev/null +++ b/array_stack.c @@ -0,0 +1,57 @@ +#include +#include +#include "array_stack.h" + +// 初始化数组栈 +array_stack* init_array_stack(void) +{ + array_stack* new_stack = (array_stack*)malloc(sizeof(array_stack)); + if (new_stack == NULL) { printf("error: malloc() failed [From: init_array_stack()]\n"); + return NULL; + } + memset(new_stack, 0, sizeof(array_stack)); + new_stack->top = -1; + return new_stack; +} + +// 入栈 +void push_array_stack(array_stack* stack, elem_type value) +{ + if (stack->top + 1 > MAX_S) + { + printf("Stack overflow [From: push_array_stack()]\n"); + return; + } + stack->top++; + stack->data[stack->top] = value; +} + +// 出栈 +int pop_array_stack(array_stack* stack) +{ + if (stack->top == -1) + { + printf("Stack underflow [From: pop_array_stack()]\n"); + return -1; + } + int value = stack->data[stack->top]; + stack->top--; + return value; +} + +// 打印 +void print_array_stack(array_stack* stack) +{ + if (stack->top == -1) + { + printf("viod stack [From: print_array_stack()]\n"); + return; + } + printf("top: %d\n", stack->data[stack->top]); + printf("-----\n"); + for (int i = stack->top; i >= 0; i--) + { + printf("| %d |\n", stack->data[i]); + } + printf("-----\n"); +} \ No newline at end of file diff --git a/array_stack.h b/array_stack.h new file mode 100644 index 0000000..a7eee27 --- /dev/null +++ b/array_stack.h @@ -0,0 +1,22 @@ +#ifndef ARRAY_SATCK +#define ARRAY_SATCK +#define MAX_S 100 +#define elem_type int +typedef struct array_stack +{ + elem_type data[MAX_S]; + int top; +}array_stack; +// ʼջ +array_stack* init_array_stack(void); + +// ջ +void push_array_stack(array_stack* s, elem_type value); + +// ջ +int pop_array_stack(array_stack* s); + +// ӡջ +void print_array_stack(array_stack* s); + +#endif diff --git a/linked_list.c b/linked_list.c new file mode 100644 index 0000000..11ea29e --- /dev/null +++ b/linked_list.c @@ -0,0 +1,79 @@ +#include +#include +#include "linked_list.h" + +// ʼֵ +node* init_node(elem_type value) +{ + node* new_node = (node*)malloc(sizeof(node)); + if (new_node == NULL) + { + printf("error: malloc failed\n"); + return NULL; + } + new_node->value = value; + new_node->next = NULL; + return new_node; +} + +// ɾһڵ +void delete_node(node* n) +{ + if (n->next != NULL) { + node* temp = n->next; + n->next = n->next->next; + free(temp); + } +} + +// 滻ڵֵ +void replace_node(node* n, elem_type value) +{ + n->value = value; +} + +// ڵ +void insert_node(node* head, elem_type value) +{ + node* new_node = init_node(value); + new_node->next = head->next->next; + head->next = new_node; +} + +// ʽڵ +int get_node(node* n) +{ + return n->value; +} + +// +address_node *find_node(node* head, elem_type value) +{ + address_node* n = (address_node*)malloc(sizeof(address_node)); + if (n == NULL) { + printf("ڴʧ\n"); + return NULL; + } + n->n = 0; + n->p = head; + while (head != NULL) + { + if (head->value == value) + return n; + n->n += 1; + head = head->next; + } + printf("޷ҵڵ\n"); + free(n); + return NULL; +} + +// ӡ +void print_node_list(node* head) +{ + while (head->next != NULL) + { + head = head->next; + printf("%d ", head->value); + } +} \ No newline at end of file diff --git a/linked_list.h b/linked_list.h new file mode 100644 index 0000000..d095e8a --- /dev/null +++ b/linked_list.h @@ -0,0 +1,40 @@ +#ifndef LINKED_LIST_H +#define LINKED_LIST_H +#define elem_type int + +typedef struct node +{ + elem_type value; + struct node* next; +} node; + +typedef struct address_node +{ + int n; + node* p; +}address_node; + + +// ʼڵ +node* init_node(elem_type value); + +// ɾһڵ +void delete_node(node* n); + +// 滻ڵ +void replace_node (node* n, elem_type value); + +// ڵ +void insert_node(node* head, elem_type value); + +//ʽڵ +int get_node(node* n); + +// +address_node *find_node(node* head, elem_type value); + +// ӡ +void print_node_list(node* head); + +#endif + diff --git a/linked_list_stack.c b/linked_list_stack.c new file mode 100644 index 0000000..283a999 --- /dev/null +++ b/linked_list_stack.c @@ -0,0 +1,44 @@ +#include +#include +#include "linked_list_stack.h" + +// ʼջ +stack_linked* init_stack_linked(void) +{ + stack_linked* s = (stack_linked*)malloc(sizeof(stack_linked)); + if (s == NULL) + { + printf("ڴʧܣ\n"); + return NULL; + } + s->top = NULL; + s->size = 0; + return s; +} + +// ջ +void push_stack_linked(stack_linked* s, elem_type value) +{ + stack_node* node = (stack_node*)malloc(sizeof(stack_node)); + if (node == NULL) + { + printf("ڴʧܣ\n"); + return NULL; + } + node->value = value; + node->next = s->top; + s->top = node; + s->size++; +} + +// ջ +int pop_stack_linked(stack_linked* s) +{ + int flog = 0; + flog = s->top->value; + stack_node* tmp = s->top; + s->top = s->top->next; + free(tmp); + tmp = NULL; + return flog; +} \ No newline at end of file diff --git a/linked_list_stack.h b/linked_list_stack.h new file mode 100644 index 0000000..46f4765 --- /dev/null +++ b/linked_list_stack.h @@ -0,0 +1,44 @@ +#ifndef LINKED_LIST_STACK_H +#define LINKED_LIST_STACK_H +#define elem_type int + +typedef struct stack_node +{ + elem_type value; + struct stack_node *next; + +}stack_node; + +typedef struct stack_linked +{ + stack_node *top; + int size; +}stack_linked; + +// ʼջ +stack_linked* init_stack_linked(void); + +// ջ +void push_stack_linked(stack_linked* s, elem_type value); + +// ջ +int pop_stack_linked(stack_linked* s); + + + + + + + + + + + + + + + + + + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..f59126d --- /dev/null +++ b/main.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include "array_stack.h" +#include "sq_list.h" +#include "array_queue.h" + +int main(void) +{ + + + + /*sq_list* L = init_sq_list(); + sq_list* N = init_sq_list(); + for (int i = 1; i <= 3; i++) + { + N->data[i - 1] = i+10; + } + for (int i = 1; i <= 10; i++) + { + L->data[i - 1] = i; + } + N->length = 3; + L->length = 10; + print_sq_list(N); + print_sq_list(L); + mer_ge_sq_list(L,N); + print_sq_list(L); + printf("L->length:[%d]\n", L->length);*/ + + + /* array_stack* stack = init_array_stack(); + push_array_stack(stack, 1); + push_array_stack(stack, 2); + push_array_stack(stack, 3);*/ + + + + array_queue *q = init_array_queue(); + push_array_queue(q,0); + push_array_queue(q,1); + push_array_queue(q,2); + print_array_queue(q); + printf("---------------------\n"); + pop_array_queue(q); + print_array_queue(q); + printf("----------\n"); + push_array_queue(q, 666); + print_array_queue(q); + printf("Hello World!\n"); + system("pause"); + return 0; +} diff --git a/sq_list.c b/sq_list.c new file mode 100644 index 0000000..f698f29 --- /dev/null +++ b/sq_list.c @@ -0,0 +1,176 @@ +#include +#include +#include +#include "sq_list.h" + +sq_list* init_sq_list(void) +{ + sq_list* name = (sq_list*)malloc(sizeof(sq_list)); + memset(name, 0, sizeof(sq_list)); + return name; +} + +// ɾ +void delete_sq_list(sq_list* list,int pos) +{ + if (pos < 0 || pos > list->length || list->length == MAX) + { + printf("λô\n"); + return; + } + if (pos == list->length - 1) + list->data[pos] = 0; + else + { + for (int i = pos; i < list->length - 1; i++) + list->data[i] = list->data[i + 1]; + list->data[list->length - 1] = 0; + } + list->length--; + +} + +// 滻 +void replace_sq_list(sq_list* list, int pos, elem_type value) +{ + if (pos < 0 || pos > list->length || list->length >= MAX) + { + printf("λô\n"); + return; + } + if (pos > list->length && pos <= MAX) + printf("ڴ˴"); + list->data[pos] = value; +} + + +// +void insert_sq_list(sq_list* list, int pos, elem_type value) +{ + if (pos < 0 || pos > list->length || list->length >= MAX) + { + printf("λô\n"); + return; + } + if (pos == MAX) + printf("\n"); + if (pos > list->length && pos <= MAX) + printf("ڴ˴"); + int i = list->length -1; + int flog = i; + for (i; i >= pos-1; i--) + { + list->data[i + 1] = list->data[i]; + } + list->data[pos] = value; + /* if (flog + 1 > list->length)*/ + list->length++; +} + + + + +// ӡ +void print_sq_list(sq_list* list) +{ + printf("["); + for (int i = 0; i < list->length; i++) + printf("%d ", list->data[i]); + printf("]"); + printf("\n"); +} + +//Ԫ +void get_sq_list(sq_list* list1, int pos, elem_type*e) +{ + if (list1->length == 0 || pos<0 || pos>list1->length) + { + printf("ȡԪʧ"); + return; + } + *e = list1->data[pos]; + return; +} + +// +int locate_list(sq_list* list, elem_type e) +{ + int i = 0; + if (list->length == 0) + { + printf("Ϊ"); + return; + } + for (i = 0;i < list->length;i++) + { + if (list->data[i] == e) + return 1; + } + if (i > list->length) + { + printf("Խ"); + return; + } + return 0; + +} + + + +// 2 1 ϲ +void merge_sq_list(sq_list* list_1, sq_list* list_2) +{ + if (list_1->length == 0 || list_2->length == 0) + { + printf("һձ\n"); + return; + } + if ((list_1->length + list_2->length) > MAX) + printf("ܺͳΧ\nǻϲֻΪϲ\n"); + int flog = 0; + for (int i = 0; i < list_2->length; i++) + { + + for (int j = 0; j < list_1->length; j++) + { + if (list_1->data[j] != list_2->data[i]) + { + if (j == list_1->length -1) + { + list_1->data[list_1->length] = list_2->data[i]; + list_1->length++; + flog++; + } + else + continue; + } + } + + } + printf("----------------------------------\n"); + printf("%dͬ %dͬ\n", flog, list_2->length - flog); + printf("----------------------------------\n"); +} + + + +//ϲ2.0 +void mer_ge_sq_list(sq_list* list_1, sq_list* list_2) +{ + int e; + int k = 0; + int flog = 0; + for (int k=0;k < list_2->length;k++) + { + get_sq_list(list_2, k, &e); + if (!locate_list(list_1, list_2)) + { + insert_sq_list(list_1, list_1->length, e); + flog++; + } + } + printf("----------------------------------\n"); + printf("%dͬ %dͬ\n", flog, list_2->length - flog); + printf("----------------------------------\n"); +} + diff --git a/sq_list.h b/sq_list.h new file mode 100644 index 0000000..4a600b1 --- /dev/null +++ b/sq_list.h @@ -0,0 +1,40 @@ +#ifndef SQ_LIST_H +#define SQ_LIST_H +#define MAX 100 +#define elem_type int + + +typedef struct sq_list +{ + elem_type data[MAX]; + int length; +} sq_list; + +// ʼ +sq_list *init_sq_list(void); + +// ɾ +void delete_sq_list(sq_list* list, int pos); + +// 滻 +void replace_sq_list(sq_list* list, int pos, elem_type value); + +// +void insert_sq_list(sq_list* list, int pos, elem_type value); + +// ӡ +void print_sq_list(sq_list* list); + +//Ԫ +void get_sq_list(sq_list* list1,int pos, elem_type *e); + +// +int locate_list(sq_list* list, elem_type e); + +// ϲ˳1.0 +void merge_sq_list(sq_list* list_1, sq_list* list_2); + +//ϲ˳2.0 +void mer_ge_sq_list(sq_list* list_1, sq_list* list_2); +#endif +