mirror of
https://github.com/TheAlgorithms/C
synced 2024-11-22 05:21:49 +03:00
Merge branch 'master' into infix_to_postfix
This commit is contained in:
commit
99076a25e6
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -24,6 +24,7 @@ assignees: ''
|
||||
## Steps to Reproduce
|
||||
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
|
||||
<!--- reproduce this bug. Include code to reproduce, if relevant -->
|
||||
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
7
.github/pull_request_template.md
vendored
7
.github/pull_request_template.md
vendored
@ -1,9 +1,10 @@
|
||||
#### Description of Change
|
||||
|
||||
<!--
|
||||
Thank you for your Pull Request. Please provide a description above and review
|
||||
the requirements below.
|
||||
|
||||
Contributors guide: https://github.com/TheAlgorithms/C-Plus-Plus/CONTRIBUTING.md
|
||||
Contributors guide: https://github.com/TheAlgorithms/C/blob/master/CONTRIBUTING.md
|
||||
-->
|
||||
|
||||
#### References
|
||||
@ -13,10 +14,10 @@ Contributors guide: https://github.com/TheAlgorithms/C-Plus-Plus/CONTRIBUTING.md
|
||||
<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->
|
||||
|
||||
- [ ] Added description of change
|
||||
- [ ] Added file name matches [File name guidelines](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/CONTRIBUTING.md#New-File-Name-guidelines)
|
||||
- [ ] Added file name matches [File name guidelines](https://github.com/TheAlgorithms/C/blob/master/CONTRIBUTING.md#File-Name-guidelines)
|
||||
- [ ] Added tests and example, test must pass
|
||||
- [ ] Relevant documentation/comments is changed or added
|
||||
- [ ] PR title follows semantic [commit guidelines](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/CONTRIBUTING.md#Commit-Guidelines)
|
||||
- [ ] PR title follows semantic [commit guidelines](https://github.com/TheAlgorithms/C/blob/master/CONTRIBUTING.md#Commit-Guidelines)
|
||||
- [ ] Search previous suggestions before making a new one, as yours may be a duplicate.
|
||||
- [ ] I acknowledge that all my contributions will be made under the project's license.
|
||||
|
||||
|
76
CODE_OF_CONDUCT.md
Normal file
76
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
||||
level of experience, education, socio-economic status, nationality, personal
|
||||
appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at 1anuppanwar@gmail.com, dynamitechetan@gmail.com, nikhilkala8@gmail.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see
|
||||
<https://www.contributor-covenant.org/faq>
|
227
CONTRIBUTING.md
Normal file
227
CONTRIBUTING.md
Normal file
@ -0,0 +1,227 @@
|
||||
# CONTRIBUTION GUIDELINES
|
||||
|
||||
## Before contributing
|
||||
|
||||
Welcome to [TheAlgorithms/C](https://github.com/TheAlgorithms/C)! Before submitting pull requests, please make sure that you have **read the whole guidelines**. If you have any doubts about this contribution guide, please open [an issue](https://github.com/TheAlgorithms/C/issues/new/choose) and clearly state your concerns.
|
||||
|
||||
## Contributing
|
||||
|
||||
### Maintainer/developer
|
||||
|
||||
If you are a maintainer of this repository, please consider the following:
|
||||
|
||||
- It is a protocol to contribute via pull requests.
|
||||
- Reviewers will advise and guide you up to make the code refined and documented.
|
||||
- When reviewing pull requests, be sure to:
|
||||
- Be kind.
|
||||
- Be respectful.
|
||||
- Make useful suggestions/comments.
|
||||
- Be sure not to make invalid suggestions/comments.
|
||||
- Guide and advise up the pull request author.
|
||||
|
||||
### Contributor
|
||||
|
||||
We are very happy that you consider implementing algorithms and data structures for others! This repository is referred to and used by learners from around the globe. Being one of our contributors, you agree and confirm that:
|
||||
|
||||
- You did your own work.
|
||||
- No plagiarism allowed. Any plagiarized work will not be merged.
|
||||
- Your work will be distributed under the [GNU General Public License v3.0](https://github.com/TheAlgorithms/C/blob/master/LICENSE) once your pull request has been merged.
|
||||
- You submitted work fulfils or mostly fulfils our styles and standards.
|
||||
|
||||
**New implementation** New implementation are welcome!
|
||||
|
||||
**Improving comments** and **adding tests** to existing algorithms are much appreciated.
|
||||
|
||||
**Issues** Please avoid opening issues asking to be "assigned” to a particular algorithm. This merely creates unnecessary noise for maintainers. Instead, please submit your implementation in a pull request and it will be evaluated by project maintainers.
|
||||
|
||||
### Making Changes
|
||||
|
||||
#### Code
|
||||
|
||||
- Please use the directory structure of the repository.
|
||||
- File extension for code should be `*.h` `*.c`
|
||||
- Organize your code using **`struct`** keywords
|
||||
- If an implementation of the algorithm already exists, please refer to the [file-name section below](#file-name-guidelines).
|
||||
- You can suggest reasonable changes to existing algorithms.
|
||||
- Strictly use snake_case (underscore_separated) in filenames.
|
||||
- If you have added or modified code, please make sure the code compiles before submitting.
|
||||
- Our automated testing runs [__CMake__](https://cmake.org/) on all pull requests so please be sure that your code passes before submitting.
|
||||
- Please conform to [doxygen](https://www.doxygen.nl/manual/docblocks.html) standard and document the code as much as possible. This not only facilitates the readers but also generates the correct info on website.
|
||||
- **Be consistent in use of these guidelines.**
|
||||
|
||||
#### Documentation
|
||||
|
||||
- Make sure you put useful comments in your code. Do not comment things that are obvious.
|
||||
- Please avoid creating new directories if at all possible. Try to fit your work into the existing directory structure. If you want to create a new directory, then please check if a similar category has been recently suggested or created by other pull requests.
|
||||
- If you have modified/added documentation, please ensure that your language is concise and contains no grammar errors.
|
||||
- Do not update README.md along with other changes, first create an issue and then link to that issue in your pull request to suggest specific changes required to README.md
|
||||
- The repository follows [Doxygen](https://www.doxygen.nl/manual/docblocks.html) standards and auto-generates the [repository website](https://thealgorithms.github.io/C). Please ensure the code is documented in this structure. Sample implementation is given below.
|
||||
|
||||
#### Test
|
||||
|
||||
- Make sure to add examples and test cases in your main() function.
|
||||
- If you find any algorithm or document without tests, please feel free to create a pull request or issue describing suggested changes.
|
||||
- Please try to add one or more `test()` functions that will invoke the algorithm implementation on random test data with expected output. Use `assert()` function to confirm that the tests will pass. Requires adding the `assert.h` library.
|
||||
|
||||
#### Typical structure of a program
|
||||
|
||||
```c
|
||||
/**
|
||||
* @file
|
||||
* @brief Add one line description here
|
||||
* @details
|
||||
* This is a multi line
|
||||
* description containing links, references,
|
||||
* math equations, etc
|
||||
* @author [Name](https://github.com/handle)
|
||||
* @see related_file.c, another_file.c
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include
|
||||
|
||||
/**
|
||||
* @brief Struct documentation
|
||||
*/
|
||||
struct struct_name {
|
||||
int variable; ///< short info of this variable
|
||||
char message; ///< short info
|
||||
};
|
||||
|
||||
/**
|
||||
* Function documentation
|
||||
* @param param1 one-line info about param1
|
||||
* @param param2 one-line info about param2
|
||||
* @returns `true` if ...
|
||||
* @returns `false` if ...
|
||||
*/
|
||||
bool func(int param1, int param2) {
|
||||
// function statements here
|
||||
if (/*something bad*/) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Test function
|
||||
* @returns void
|
||||
*/
|
||||
static void test() {
|
||||
/* desciptions of the following test */
|
||||
assert(func(...) == ...); // this ensures that the algorithm works as expected
|
||||
|
||||
// can have multiple checks
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Main function
|
||||
* @returns 0 on exit
|
||||
*/
|
||||
int main() {
|
||||
test(); // execute the tests
|
||||
// code here
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
#### File name guidelines
|
||||
|
||||
- Use lowercase words with ``"_"`` as separator
|
||||
- For instance
|
||||
|
||||
```markdown
|
||||
MyNewCStruct.C is incorrect
|
||||
my_new_c_struct.c is correct format
|
||||
```
|
||||
|
||||
- It will be used to dynamically create a directory of files and implementation.
|
||||
- File name validation will run on docker to ensure the validity.
|
||||
- If an implementation of the algorithm already exists and your version is different from that implemented, please use incremental numeric digit as a suffix. For example, if `median_search.c` already exists in the `search` folder and you are contributing a new implementation, the filename should be `median_search2.c` and for a third implementation, `median_search3.c`.
|
||||
|
||||
#### Directory guidelines
|
||||
|
||||
- We recommend adding files to existing directories as much as possible.
|
||||
- Use lowercase words with ``"_"`` as separator ( no spaces or ```"-"``` allowed )
|
||||
- For instance
|
||||
|
||||
```markdown
|
||||
SomeNew Fancy-Category is incorrect
|
||||
some_new_fancy_category is correct
|
||||
```
|
||||
|
||||
- Filepaths will be used to dynamically create a directory of our algorithms.
|
||||
- Filepath validation will run on GitHub Actions to ensure compliance.
|
||||
|
||||
#### Commit Guidelines
|
||||
|
||||
- It is recommended to keep your changes grouped logically within individual commits. Maintainers find it easier to understand changes that are logically spilt across multiple commits. Try to modify just one or two files in the same directory. Pull requests that span multiple directories are often rejected.
|
||||
|
||||
```bash
|
||||
git add file_xyz.c
|
||||
git commit -m "your message"
|
||||
```
|
||||
|
||||
Examples of commit messages with semantic prefixes:
|
||||
|
||||
```markdown
|
||||
fix: xyz algorithm bug
|
||||
feat: add xyx algorithm, struct xyz
|
||||
test: add test for xyz algorithm
|
||||
docs: add comments and explanation to xyz algorithm
|
||||
```
|
||||
|
||||
Common prefixes:
|
||||
|
||||
- fix: A bug fix
|
||||
- feat: A new feature
|
||||
- docs: Documentation changes
|
||||
- test: Correct existing tests or add new ones
|
||||
|
||||
### Pull Requests
|
||||
|
||||
- Checkout our [pull request template](https://github.com/TheAlgorithms/C/blob/master/.github/pull_request_template.md)
|
||||
|
||||
#### Building Locally
|
||||
|
||||
Before submitting a pull request, build the code locally or using the convenient [![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/TheAlgorithms/C) service.
|
||||
|
||||
```bash
|
||||
cmake -B build -S .
|
||||
```
|
||||
|
||||
#### Static Code Analyzer
|
||||
|
||||
We use [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) as a static code analyzer with a configuration in [.clang-tidy](.clang-tidy).
|
||||
|
||||
```bash
|
||||
clang-tidy --fix --quiet -p build subfolder/file_to_check.c --
|
||||
```
|
||||
|
||||
#### Code Formatter
|
||||
|
||||
[__clang-format__](https://clang.llvm.org/docs/ClangFormat.html) is used for code forrmating.
|
||||
|
||||
- Installation (only needs to be installed once.)
|
||||
- Mac (using home-brew): `brew install clang-format`
|
||||
- Mac (using macports): `sudo port install clang-10 +analyzer`
|
||||
- Windows (MSYS2 64-bit): `pacman -S mingw-w64-x86_64-clang-tools-extra`
|
||||
- Linux (Debian): `sudo apt-get install clang-format-10 clang-tidy-10`
|
||||
- Running (all platforms): `clang-format -i -style="file" my_file.c`
|
||||
|
||||
#### GitHub Actions
|
||||
|
||||
- Enable GitHub Actions on your fork of the repository.
|
||||
After enabling it will execute `clang-tidy` and `clang-format` after every a push (not a commit).
|
||||
- Click on the tab "Actions", then click on the big green button to enable it.
|
||||
|
||||
![GitHub Actions](https://user-images.githubusercontent.com/51391473/94609466-6e925100-0264-11eb-9d6f-3706190eab2b.png)
|
||||
|
||||
- The result can create another commit if the actions made any changes on your behalf.
|
||||
- Hence, it is better to wait and check the results of GitHub Actions after every push.
|
||||
- Run `git pull` in your local clone if these actions made many changes in order to avoid merge conflicts.
|
||||
|
||||
Most importantly,
|
||||
|
||||
- Happy coding!
|
12
DIRECTORY.md
12
DIRECTORY.md
@ -18,7 +18,9 @@
|
||||
* [Decimal To Octal Recursion](https://github.com/TheAlgorithms/C/blob/master/conversions/decimal_to_octal_recursion.c)
|
||||
* [Hexadecimal To Octal](https://github.com/TheAlgorithms/C/blob/master/conversions/hexadecimal_to_octal.c)
|
||||
* [Infix To Postfix](https://github.com/TheAlgorithms/C/blob/master/conversions/infix_to_postfix.c)
|
||||
* [Hexadecimal To Octal2](https://github.com/TheAlgorithms/C/blob/master/conversions/hexadecimal_to_octal2.c)
|
||||
* [Int To String](https://github.com/TheAlgorithms/C/blob/master/conversions/int_to_string.c)
|
||||
* [Octal To Binary](https://github.com/TheAlgorithms/C/blob/master/conversions/octal_to_binary.c)
|
||||
* [Octal To Decimal](https://github.com/TheAlgorithms/C/blob/master/conversions/octal_to_decimal.c)
|
||||
* [To Decimal](https://github.com/TheAlgorithms/C/blob/master/conversions/to_decimal.c)
|
||||
|
||||
@ -28,11 +30,11 @@
|
||||
* [Carray](https://github.com/TheAlgorithms/C/blob/master/data_structures/array/carray.h)
|
||||
* [Carray Tests](https://github.com/TheAlgorithms/C/blob/master/data_structures/array/carray_tests.c)
|
||||
* Binary Trees
|
||||
* [Avl](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/avl.c)
|
||||
* [Avl Tree](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/avl_tree.c)
|
||||
* [Binary Search Tree](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/binary_search_tree.c)
|
||||
* [Create Node](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/create_node.c)
|
||||
* [Recursive Traversals](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/recursive_traversals.c)
|
||||
* [Redblacktree](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/redblacktree.c)
|
||||
* [Red Black Tree](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/red_black_tree.c)
|
||||
* [Segment Tree](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/segment_tree.c)
|
||||
* [Threaded Binary Trees](https://github.com/TheAlgorithms/C/blob/master/data_structures/binary_trees/threaded_binary_trees.c)
|
||||
* Dictionary
|
||||
@ -69,8 +71,9 @@
|
||||
* [Max Heap](https://github.com/TheAlgorithms/C/blob/master/data_structures/heap/max_heap.c)
|
||||
* [Min Heap](https://github.com/TheAlgorithms/C/blob/master/data_structures/heap/min_heap.c)
|
||||
* Linked List
|
||||
* [Ascendingpriorityqueue](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/ascendingpriorityqueue.c)
|
||||
* [Circularlinkedlist](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/CircularLinkedList.C)
|
||||
* [Ascending Priority Queue](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/ascending_priority_queue.c)
|
||||
* [Circular Linked List](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/circular_linked_list.c)
|
||||
* [Doubly Linked List](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/doubly_linked_list.c)
|
||||
* [Merge Linked Lists](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/merge_linked_lists.c)
|
||||
* [Middle Element In List](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/middle_element_in_list.c)
|
||||
* [Queue Linked List](https://github.com/TheAlgorithms/C/blob/master/data_structures/linked_list/queue_linked_list.c)
|
||||
@ -366,6 +369,7 @@
|
||||
* [Gnome Sort](https://github.com/TheAlgorithms/C/blob/master/sorting/gnome_sort.c)
|
||||
* [Heap Sort](https://github.com/TheAlgorithms/C/blob/master/sorting/heap_sort.c)
|
||||
* [Insertion Sort](https://github.com/TheAlgorithms/C/blob/master/sorting/insertion_sort.c)
|
||||
* [Insertion Sort Recursive](https://github.com/TheAlgorithms/C/blob/master/sorting/insertion_sort_recursive.c)
|
||||
* [Merge Sort](https://github.com/TheAlgorithms/C/blob/master/sorting/merge_sort.c)
|
||||
* [Merge Sort Nr](https://github.com/TheAlgorithms/C/blob/master/sorting/merge_sort_nr.c)
|
||||
* [Multikey Quick Sort](https://github.com/TheAlgorithms/C/blob/master/sorting/multikey_quick_sort.c)
|
||||
|
@ -2,23 +2,23 @@
|
||||
<!-- the suffix in the above line is required for doxygen to consider this as the index page of the generated documentation site -->
|
||||
|
||||
[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/TheAlgorithms/C)
|
||||
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/TheAlgorithms/C.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/TheAlgorithms/C/context:cpp)
|
||||
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/TheAlgorithms/C.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/TheAlgorithms/C/context:cpp)
|
||||
[![Gitter chat](https://img.shields.io/badge/Chat-Gitter-ff69b4.svg?label=Chat&logo=gitter&style=flat-square)](https://gitter.im/TheAlgorithms)
|
||||
[![contributions welcome](https://img.shields.io/static/v1.svg?label=Contributions&message=Welcome&color=0059b3&style=flat-square)](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/CONTRIBUTING.md)
|
||||
[![contributions welcome](https://img.shields.io/static/v1.svg?label=Contributions&message=Welcome&color=0059b3&style=flat-square)](https://github.com/TheAlgorithms/C/blob/master/CONTRIBUTING.md)
|
||||
![GitHub repo size](https://img.shields.io/github/repo-size/TheAlgorithms/C?color=red&style=flat-square)
|
||||
[![Doxygen CI](https://github.com/TheAlgorithms/C/workflows/Doxygen%20CI/badge.svg)](https://TheAlgorithms.github.io/C)
|
||||
[![Awesome CI](https://github.com/TheAlgorithms/C/workflows/Awesome%20CI%20Workflow/badge.svg)](https://github.com/TheAlgorithms/C/actions?query=workflow%3A%22Awesome+CI+Workflow%22)
|
||||
|
||||
## Overview
|
||||
|
||||
The repository is a collection of open-source implementation of a variety of algorithms implemented in C and licensed under [GPLv3 License](https://github.com/TheAlgorithms/C/blob/master/LICENSE). The algorithms span a variety of topics from computer science, mathematics and statistics, data science, machine learning, engineering, etc.. The implementations and the associated documentation are meant to provide a learning resource for educators and students. Hence, one may find more than one implementation for the same objective but using a different algorithm strategies and optimizations.
|
||||
The repository is a collection of open-source implementation of a variety of algorithms implemented in C and licensed under [GPLv3 License](https://github.com/TheAlgorithms/C/blob/master/LICENSE). The algorithms span a variety of topics from computer science, mathematics and statistics, data science, machine learning, engineering, etc.. The implementations and the associated documentation are meant to provide a learning resource for educators and students. Hence, one may find more than one implementation for the same objective but using a different algorithm strategies and optimizations.
|
||||
|
||||
## Features
|
||||
|
||||
* The repository provides implementations of various algorithms in one of the most fundamental general purpose languages - [C](https://en.wikipedia.org/wiki/C_(programming_language)).
|
||||
* Well documented source code with detailed explanations provide a valuable resource for educators and students alike.
|
||||
* Each source code is atomic using standard C library [`libc`](https://en.wikipedia.org/wiki/C_standard_library) and _no external libraries_ are required for their compilation and execution. Thus the fundamentals of the algorithms can be studied in much depth.
|
||||
* Source codes are [compiled and tested](https://github.com/TheAlgorithms/C/actions?query=workflow%3A%22Awesome+CI+Workflow%22) for every commit on the latest versions of three major operating systems viz., Windows, MacOS and Ubuntu (Linux) using MSVC 16 2019, AppleClang 11.0 and GNU 7.5.0 respectively.
|
||||
* Source codes are [compiled and tested](https://github.com/TheAlgorithms/C/actions?query=workflow%3A%22Awesome+CI+Workflow%22) for every commit on the latest versions of three major operating systems viz., Windows, MacOS and Ubuntu (Linux) using MSVC 16 2019, AppleClang 11.0 and GNU 7.5.0 respectively.
|
||||
* Strict adherence to [C11](https://en.wikipedia.org/wiki/C11_(C_standard_revision)) standard ensures portability of code to embedded systems as well like ESP32, ARM Cortex, etc. with little to no changes.
|
||||
* Self-checks within programs ensure correct implementations with confidence.
|
||||
* Modular implementations and OpenSource licensing enable the functions to be utilized conveniently in other applications.
|
||||
|
13
REVIEWER_CODE.md
Normal file
13
REVIEWER_CODE.md
Normal file
@ -0,0 +1,13 @@
|
||||
# Guidelines for reviewers and maintainers
|
||||
|
||||
Following are some guidelines for contributors who are providing reviews to the pull-requests.
|
||||
|
||||
1. On any given pull-request, there only one reviewer should be active at a time. Once the reviewer is done, others may add short comments or any further reviews as needed. Again, one at a time.
|
||||
2. Assigning reviewers should be avoided unless the pull-request is for a particular task the reviewer is more proficient in.
|
||||
3. Any contributor who has had their code merged into the repo can provide with reviews as they have gone through the repo standards at least once before. The reviewer will be on a first-come-first serve basis.
|
||||
4. Most repositories have a check-list in the description for pull-requests. Many times, the contributors are not following them and simply remove the checklist or checkthem without taking the time to review the checklist items. These contributors are almost always copying the code from somewhere. These should be pointed out politely and reviews should be blocked until the contributor updates the basic code structure per the checklist and the repo standards.
|
||||
5. The reviewers should label every pull-request appropriately - including "invalid" as the case may be.
|
||||
6. Some pull-requests have existing duplicate code or duplicate pull-requests or sometimes, a novice might create a new pull-request for every new commit. This is a daunting task but one of the responsibility of a reviewer.
|
||||
7. Discourage creating branches on the repo but rather fork the repo to the respective userspace and contribute from that fork.
|
||||
8. Some repos - C & C++ - have collaboration with GitPod wherein the code and the contribution can be executed and tested online with relative simplicity. It also contains tools necessary to perform debug and CI checks without installing any tools. Encourage contributors to utilize the feature. Reviewers can test the contributed algorithms online without worrying about forks and branches.
|
||||
9. There should not be any hurry to merge pull-requests. Since the repos are educational, better to get the contributions right even if it takes a bit longer to review. Encourage patience and develop debugging skills of contributors.
|
119
conversions/hexadecimal_to_octal2.c
Normal file
119
conversions/hexadecimal_to_octal2.c
Normal file
@ -0,0 +1,119 @@
|
||||
/**
|
||||
* @file
|
||||
* @brief Convert hexadecimal number to octal number (with decimal intermediary)
|
||||
* @details
|
||||
* The input is valid from 0 to 0xFFFF_FFFF_FFFF_FFFF.
|
||||
*
|
||||
* At first, this program converts a hex string to an unsigned long long
|
||||
* decimal, and then to an octal string.
|
||||
*
|
||||
* When there is an invalid character in input string, this program stops
|
||||
* parsing and converts the string until that character.
|
||||
*
|
||||
* @see hexadecimal_to_octal.c
|
||||
*/
|
||||
|
||||
#include <stdio.h> /// for printf() and fgets()
|
||||
#include <string.h> /// for memset()
|
||||
|
||||
/**
|
||||
* @brief Convert a hexadecimal number to octal number.
|
||||
* @param hex Hexadecimal number to convert.
|
||||
* @returns A pointer to the converted octal string.
|
||||
*/
|
||||
const char *hex_to_oct(const char *hex)
|
||||
{
|
||||
#define MAX_OCT_STR_LEN 23 /* 17_7777_7777_7777_7777_7777 */
|
||||
static char octal[MAX_OCT_STR_LEN];
|
||||
memset(octal, '\0', MAX_OCT_STR_LEN); // Initialize as NULL string
|
||||
|
||||
unsigned long long decimal = 0;
|
||||
int i = 0;
|
||||
int len;
|
||||
|
||||
if (hex == NULL)
|
||||
{
|
||||
// Return an empty string
|
||||
return octal;
|
||||
}
|
||||
|
||||
/* Hexadecimal to decimal conversion */
|
||||
while (*hex != '\n' && *hex != '\0')
|
||||
{
|
||||
char ch = *hex;
|
||||
|
||||
if (ch >= '0' && ch <= '9')
|
||||
{
|
||||
ch -= '0';
|
||||
}
|
||||
else if (ch >= 'a' && ch <= 'f')
|
||||
{
|
||||
ch = ch - 'a' + 10;
|
||||
}
|
||||
else if (ch >= 'A' && ch <= 'F')
|
||||
{
|
||||
ch = ch - 'A' + 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Invalid hexadecimal input: %c\n", ch);
|
||||
break;
|
||||
}
|
||||
|
||||
decimal *= 16;
|
||||
decimal += ch;
|
||||
hex++;
|
||||
}
|
||||
|
||||
/* Decimal to octal conversion */
|
||||
if (decimal == 0)
|
||||
{
|
||||
octal[0] = '0';
|
||||
len = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0;
|
||||
while (decimal > 0)
|
||||
{
|
||||
octal[i] = '0' + decimal % 8;
|
||||
i++;
|
||||
decimal /= 8;
|
||||
}
|
||||
|
||||
len = i;
|
||||
}
|
||||
|
||||
octal[len] = '\0';
|
||||
|
||||
/* Reverse the octal string */
|
||||
for (i = 0; i < len / 2; i++)
|
||||
{
|
||||
char tmp = octal[i];
|
||||
octal[i] = octal[len - i - 1];
|
||||
octal[len - i - 1] = tmp;
|
||||
}
|
||||
|
||||
return octal;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Main function
|
||||
* @returns 0 on exit
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
#define MAX_HEX_STR_LEN 17 /* FFFF_FFFF_FFFF_FFFF */
|
||||
char hex[MAX_HEX_STR_LEN];
|
||||
|
||||
/* Input hexadecimal number from user */
|
||||
printf("Enter any hexadecimal number: ");
|
||||
fgets(hex, MAX_HEX_STR_LEN, stdin);
|
||||
|
||||
const char *octal = hex_to_oct(hex);
|
||||
|
||||
printf("Hexadecimal number = %s\n", hex);
|
||||
printf("Octal number = %s\n", octal);
|
||||
|
||||
return 0;
|
||||
}
|
62
conversions/octal_to_binary.c
Normal file
62
conversions/octal_to_binary.c
Normal file
@ -0,0 +1,62 @@
|
||||
/**
|
||||
* @brief Octal to binay conversion by scanning user input
|
||||
* @details
|
||||
* The octalTobinary function take the octal number as long
|
||||
* return a long binary nuber after conversion
|
||||
* @author [Vishnu P](https://github.com/vishnu0pothan)
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
/**
|
||||
* @brief Converet octal number to binary
|
||||
* @param octalnum octal value that need to convert
|
||||
* @returns A binary number after conversion
|
||||
*/
|
||||
long octalToBinary(int octalnum)
|
||||
{
|
||||
int decimalnum = 0, i = 0;
|
||||
long binarynum = 0;
|
||||
|
||||
/* This loop converts octal number "octalnum" to the
|
||||
* decimal number "decimalnum"
|
||||
*/
|
||||
while(octalnum != 0)
|
||||
{
|
||||
decimalnum = decimalnum + (octalnum%10) * pow(8,i);
|
||||
i++;
|
||||
octalnum = octalnum / 10;
|
||||
}
|
||||
|
||||
//i is re-initialized
|
||||
i = 1;
|
||||
|
||||
/* This loop converts the decimal number "decimalnum" to the binary
|
||||
* number "binarynum"
|
||||
*/
|
||||
while (decimalnum != 0)
|
||||
{
|
||||
binarynum = binarynum + (long)(decimalnum % 2) * i;
|
||||
decimalnum = decimalnum / 2;
|
||||
i = i * 10;
|
||||
}
|
||||
|
||||
//Returning the binary number that we got from octal number
|
||||
return binarynum;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Main function
|
||||
* @returns 0 on exit
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
int octalnum;
|
||||
|
||||
printf("Enter an octal number: ");
|
||||
scanf("%d", &octalnum);
|
||||
|
||||
//Calling the function octaltoBinary
|
||||
printf("Equivalent binary number is: %ld", octalToBinary(octalnum));
|
||||
return 0;
|
||||
}
|
293
data_structures/linked_list/doubly_linked_list.c
Normal file
293
data_structures/linked_list/doubly_linked_list.c
Normal file
@ -0,0 +1,293 @@
|
||||
/**
|
||||
* @file
|
||||
* @brief Implementation of [Doubly linked list](https://en.wikipedia.org/wiki/Doubly_linked_list)
|
||||
* @details
|
||||
* A doubly linked list is a data structure with a sequence
|
||||
* of components called nodes. Within that nodes there are
|
||||
* three elements: a value recorded, a pointer to the next
|
||||
* node, and a pointer to the previous node.
|
||||
*
|
||||
* In this implementation, the functions of creating the list,
|
||||
* inserting by position, deleting by position, searching
|
||||
* for value, printing the list, and an example of how the
|
||||
* list works were coded.
|
||||
*
|
||||
* @author [Gabriel Mota Bromonschenkel Lima](https://github.com/GabrielMotaBLima)
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* @brief Doubly linked list struct
|
||||
*/
|
||||
typedef struct list
|
||||
{
|
||||
double value; ///< value saved on each node
|
||||
struct list *next, *prev; ///< directing to other nodes or NULL
|
||||
} List;
|
||||
|
||||
/**
|
||||
* @brief Create list function, a new list containing one node will be created
|
||||
* @param value a value to be saved into the first list node
|
||||
* @returns new_list the list created
|
||||
*/
|
||||
List *create(double value);
|
||||
|
||||
/**
|
||||
* @brief Insertion by position into the list function
|
||||
* @param list a doubly linked List
|
||||
* @param value a value to be inserted into the list
|
||||
* @param pos a position into the list for value insertion
|
||||
* @returns list the input list with a node more or the same list
|
||||
*/
|
||||
List *insert(List *list, double value, int pos);
|
||||
|
||||
/**
|
||||
* @brief Deletion by position into the list function
|
||||
* @param list a doubly linked List
|
||||
* @param pos a position into the list for value Deletion
|
||||
* @returns list the input list with deleted values or the same list
|
||||
*/
|
||||
List *delete(List *list, int pos);
|
||||
|
||||
/**
|
||||
* @brief Search value into the list function
|
||||
* @param list a doubly linked list
|
||||
* @param value a value to be looked for into the list
|
||||
* @returns `1` if the looked up value exists
|
||||
* @returns `0` if the looked up value doesn't exist
|
||||
*/
|
||||
int search(List *list, double value);
|
||||
|
||||
/**
|
||||
* @brief Print list function
|
||||
* @param list a doubly linked List
|
||||
* @returns void
|
||||
*/
|
||||
void print(List *list);
|
||||
|
||||
/**
|
||||
* @brief Example function
|
||||
* @returns void
|
||||
*/
|
||||
void example();
|
||||
|
||||
/**
|
||||
* @brief Main function
|
||||
* @returns 0 on exit
|
||||
*/
|
||||
int main()
|
||||
{
|
||||
// examples for better understanding
|
||||
example();
|
||||
// code here
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create list function, a new list containing one node will be created
|
||||
* @param value a value to be saved into the first list node
|
||||
* @returns new_list the list created
|
||||
*/
|
||||
List *create(double value)
|
||||
{
|
||||
List *new_list = (List *)malloc(sizeof(List));
|
||||
new_list->value = value;
|
||||
new_list->next = NULL;
|
||||
new_list->prev = NULL;
|
||||
return new_list;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Insertion by position into the list function
|
||||
* @param list a doubly linked List
|
||||
* @param value a value to be inserted into the list
|
||||
* @param pos a position into the list for value insertion
|
||||
* @returns list the input list with a node more or the same list
|
||||
*/
|
||||
List *insert(List *list, double value, int pos)
|
||||
{
|
||||
// list NULL case
|
||||
if (list == NULL)
|
||||
{
|
||||
list = create(value);
|
||||
return list;
|
||||
}
|
||||
|
||||
// position existing case
|
||||
if (pos > 0)
|
||||
{
|
||||
List *cpy = list, *tmp = cpy;
|
||||
int flag = 1, index = 1, size = 0;
|
||||
|
||||
while (tmp != NULL)
|
||||
{
|
||||
size++;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
// first position case
|
||||
if (pos == 1)
|
||||
{
|
||||
List *new_node = create(value);
|
||||
new_node->next = cpy;
|
||||
cpy->prev = new_node;
|
||||
list = new_node;
|
||||
return list;
|
||||
}
|
||||
|
||||
// position existing in list range case
|
||||
if (size + 2 > pos)
|
||||
{
|
||||
while (cpy->next != NULL && index < pos)
|
||||
{
|
||||
flag++;
|
||||
index++;
|
||||
cpy = cpy->next;
|
||||
}
|
||||
|
||||
List *new_node = (List *)malloc(sizeof(List));
|
||||
new_node->value = value;
|
||||
|
||||
// position into list with no poiting for NULL
|
||||
if (flag == pos)
|
||||
{
|
||||
cpy->prev->next = new_node;
|
||||
new_node->next = cpy;
|
||||
new_node->prev = cpy->prev;
|
||||
cpy->prev = new_node;
|
||||
}
|
||||
|
||||
// last position case
|
||||
if (flag < pos)
|
||||
{
|
||||
new_node->next = cpy->next;
|
||||
new_node->prev = cpy;
|
||||
cpy->next = new_node;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Deletion by position into the list function
|
||||
* @param list a doubly linked List
|
||||
* @param pos a position into the list for value Deletion
|
||||
* @returns list the input list with deleted values or the same list
|
||||
*/
|
||||
List *delete(List *list, int pos)
|
||||
{
|
||||
// list NULL case
|
||||
if (list == NULL)
|
||||
return list;
|
||||
|
||||
// position existing case
|
||||
if (pos > 0)
|
||||
{
|
||||
List *cpy = list, *tmp = cpy;
|
||||
int flag = 1, index = 1, size = 0;
|
||||
|
||||
while (tmp != NULL)
|
||||
{
|
||||
size++;
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
// first position case
|
||||
if (pos == 1)
|
||||
{
|
||||
if (size == 1)
|
||||
return NULL;
|
||||
cpy = cpy->next;
|
||||
cpy->prev = NULL;
|
||||
return cpy;
|
||||
}
|
||||
|
||||
// position existing in list range case
|
||||
if (size + 2 > pos)
|
||||
{
|
||||
while (cpy->next != NULL && index < pos)
|
||||
{
|
||||
flag++;
|
||||
index++;
|
||||
cpy = cpy->next;
|
||||
}
|
||||
|
||||
if (flag == pos)
|
||||
{
|
||||
// position into list with no poiting for NULL
|
||||
if (cpy->next != NULL)
|
||||
{
|
||||
cpy->prev->next = cpy->next;
|
||||
cpy->next->prev = cpy->prev;
|
||||
}
|
||||
|
||||
// last position case
|
||||
else
|
||||
cpy->prev->next = NULL;
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Search value into the list function
|
||||
* @param list a doubly linked list
|
||||
* @param value a value to be looked for into the list
|
||||
* @returns `1` if the looked up value exists
|
||||
* @returns `0` if the looked up value doesn't exist
|
||||
*/
|
||||
int search(List *list, double value)
|
||||
{
|
||||
if (list == NULL)
|
||||
return 0;
|
||||
if (list->value == value)
|
||||
return 1;
|
||||
search(list->next, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Print list function
|
||||
* @param list a doubly linked List
|
||||
* @returns void
|
||||
*/
|
||||
void print(List *list)
|
||||
{
|
||||
if (list != NULL)
|
||||
{
|
||||
printf("%f\t", list->value);
|
||||
print(list->next);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Example function
|
||||
* @returns void
|
||||
*/
|
||||
void example()
|
||||
{
|
||||
List *my_list = NULL;
|
||||
double node_value = 0;
|
||||
int searching;
|
||||
|
||||
my_list = create(node_value);
|
||||
my_list = insert(my_list, 3, 1);
|
||||
my_list = insert(my_list, 5, 3);
|
||||
my_list = insert(my_list, 10, 3);
|
||||
my_list = insert(my_list, 20, 3);
|
||||
|
||||
print(my_list);
|
||||
searching = search(my_list, 20);
|
||||
printf("\n%d\n", searching);
|
||||
|
||||
my_list = delete (my_list, 1);
|
||||
my_list = delete (my_list, 1);
|
||||
my_list = delete (my_list, 1);
|
||||
my_list = delete (my_list, 1);
|
||||
|
||||
print(my_list);
|
||||
searching = search(my_list, 20);
|
||||
printf("\n%d\n", searching);
|
||||
}
|
@ -8,7 +8,10 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// DATA STRUCTURES
|
||||
struct node
|
||||
/**
|
||||
* Defining the structure of the node which contains 'data' (type : integer), two pointers 'next' and 'pre' (type : struct node).
|
||||
*/
|
||||
struct node
|
||||
{
|
||||
int data;
|
||||
struct node *next;
|
||||
@ -52,14 +55,14 @@ void enque(int x)
|
||||
{
|
||||
if (head == NULL)
|
||||
{
|
||||
head = (struct node *)malloc(1 * sizeof(struct node));
|
||||
head = (struct node *)malloc(sizeof(struct node));
|
||||
head->data = x;
|
||||
head->pre = NULL;
|
||||
tail = head;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp = (struct node *)malloc(1 * sizeof(struct node));
|
||||
tmp = (struct node *)malloc(sizeof(struct node));
|
||||
tmp->data = x;
|
||||
tmp->next = tail;
|
||||
tail = tmp;
|
||||
@ -92,4 +95,4 @@ int deque()
|
||||
/**
|
||||
* Returns the size of the Queue.
|
||||
*/
|
||||
int size() { return count; }
|
||||
int size() { return count; }
|
||||
|
@ -13,6 +13,9 @@
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// DATA STRUCTURES
|
||||
/**
|
||||
* creating a stucture with 'data'(type:int), two pointers 'next','pre' (type: struct node) .
|
||||
*/
|
||||
struct node
|
||||
{
|
||||
int data;
|
||||
|
71
sorting/insertion_sort_recursive.c
Normal file
71
sorting/insertion_sort_recursive.c
Normal file
@ -0,0 +1,71 @@
|
||||
/**
|
||||
* @file
|
||||
* @brief [Insertion sort](https://en.wikipedia.org/wiki/Insertion_sort)
|
||||
* algorithm implementation.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
/**
|
||||
* @addtogroup sorting Sorting algorithms
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* Insertion sort algorithm implements using Recursion
|
||||
* @param arr array to be sorted
|
||||
* @param size size of array
|
||||
*/
|
||||
void RecursionInsertionSort(int *arr, int size)
|
||||
{
|
||||
if(size <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// marking recursive call to reach starting element
|
||||
RecursionInsertionSort(arr,size-1);
|
||||
|
||||
int key = arr[size-1];
|
||||
int j = size-2;
|
||||
// swapping logic for insertion sort
|
||||
while(j >= 0 && arr[j] > key)
|
||||
{
|
||||
arr[j+1] = arr[j];
|
||||
j--;
|
||||
}
|
||||
arr[j+1] = key;
|
||||
}
|
||||
/** @} */
|
||||
/** Test function
|
||||
* @returns None
|
||||
*/
|
||||
static void test()
|
||||
{
|
||||
const int size = rand() % 500; /* random array size */
|
||||
int *arr = (int *)calloc(size, sizeof(int));
|
||||
|
||||
/* generate size random numbers from -50 to 49 */
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
arr[i] = (rand() % 100) - 50;/* signed random numbers */
|
||||
}
|
||||
RecursionInsertionSort(arr, size);
|
||||
for (int i = 0; i < size ; ++i)
|
||||
{
|
||||
assert(arr[i] <= arr[i + 1]);
|
||||
}
|
||||
free(arr);
|
||||
}
|
||||
|
||||
/** Main function
|
||||
* @returns integer 0
|
||||
*/
|
||||
int main(int argc, const char *argv[])
|
||||
{
|
||||
/* Intializes random number generator */
|
||||
srand(time(NULL));
|
||||
test();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user