- 将一个整数倒置
- 斐波那契数列中任何一项的值">求斐波那契数列中任何一项的值
- 求一个数字是否是质数(素数)
- 选择排序
- 冒泡排序
- 动态创建一个链表,并将链表遍历输出
- 链表的有关操作
- 汉诺塔
将一个整数倒置
#include <stdio.h>int main(void){int number = 233; //目标数字int sum = 0; //用于存放倒置后的数字int temp = 0; //用于临时存储number的值temp = number;while(temp != 0){sum = sum * 10 + temp % 10; //temp对10取余是为了得到个位数字temp /= 10; //为了下一次循环能获取到下一位数字}printf("%d",sum); //循环完成后sum即为number倒置后的数字return 0;}
求斐波那契数列中任何一项的值
#include <stdio.h>int main(void){int number; //指定要访问斐波那契数列中的哪一项int f1 = 1; //斐波那契数列中默认的第一项的值int f2 = 1; //斐波那契数列中默认的第二项的值int f3 = 2; //斐波那契数列中默认的第三项的值printf("请输入你要访问斐波那契数列中的哪一项");scanf("%d", &number);if (number == 1){printf("%d", f1);}else if (number == 2){printf("%d", f2);}else{for (int i = 3; i <= number; i++){f3 = f1 + f2;f1 = f2;f2 = f3;}printf("%d", f3);}return 0;}
求一个数字是否是质数(素数)
#include <stdio.h>bool IsPrime(int val){int i;for (i = 2; i < val; i++) //从2开始循环到目标数字本身,检查目标数字能否被中间的数字整除{if (val % i == 0){break;}}if (val == i) //如果i与val的值一致,说明循环没有中途被break终止,即val是质数{return true;}else{return false;}}int main(void){bool prime = IsPrime(233);return 0;}
选择排序
#include <stdio.h>void Sort_Array(int* pArr, int length){int temp;for (int i = 0; i < length-1; i++){for (int j = i+1; j < length; j++){if (pArr[i] > pArr[j]) //升序排列{temp = pArr[i];pArr[i] = pArr[j];pArr[j] = temp;}}}}int main(void){int arr[5] = {5, 4, 3, 2, 1};Sort_Array(arr, 5);return 0;}
冒泡排序
#include <stdio.h>void Sort_Array(int* pArr, int length){int temp;for (int i = 0; i < length-1; i++){for (int j = 0; j < length-1-i; j++){if (pArr[j] > pArr[j+1]) //升序排列{temp = pArr[j];pArr[j] = pArr[j+1];pArr[j+1] = temp;}}}}int main(void){int arr[5] = {5, 4, 3, 2, 1};Sort_Array(arr, 5);return 0;}
动态创建一个链表,并将链表遍历输出
#include <stdio.h>#include <stdlib.h>struct Node{int data; //数据域struct Node* pNext; //指针域};struct Node* CreateList(void){int length; //存储链表节点数int value; //临时存储链表节点数据域的值struct Node* pHead = (struct Node*)malloc(sizeof(struct Node)); //动态创建一个节点,将其地址赋给头指针struct Node* pTail = pHead; //定义一个指向尾节点的指针,并将头指针的值赋给它,此时头节点和尾节点是同一个节点pTail->pNext = NULL; //将尾节点的指针域设为NULLprintf("请输入您要创建有几个节点的链表:length = ");scanf("%d", &length);for (int i = 0; i < length; i++){printf("请输入第%d个节点的值:value = ",i+1);scanf("%d", &value);struct Node* pNew = (struct Node*)malloc(sizeof(struct Node)); //动态创建一个新节点pNew->data = value;pNew->pNext = NULL; //在创建了一个新节点后,默认此节点的指针域为NULLpTail->pNext = pNew; //在第一次执行这条语句时,相当于将头节点的指针域指向了pNew//在第n次执行这条语句时,相当于将第n-1次创建的节点的指针域指向了pNewpTail = pNew; //在创建了一个新节点后,默认此节点为新的尾节点}return pHead;}void TraverseList(struct Node* pHead){if (pHead->pNext == NULL){printf("链表为空");return;}struct Node* p = pHead->pNext;while (p != NULL){printf("%d ", p->data);p = p->pNext;}}int main(void){struct Node* pHead; //创建一个头指针pHead = CreateList(); // 创建一个链表,并将头指针的值返回TraverseList(pHead); //遍历链表return 0;}
链表的有关操作
#include <stdio.h>#include <malloc.h>#include <stdlib.h>//结构体声明typedef struct Node{int data;struct Node* pNext;}NODE, * PNODE;//函数声明PNODE Create_List();void Traverse_List(PNODE pHead);bool IsEmpty_List(PNODE pHead);int CalcuteLength_List(PNODE pHead);void Sort_List(PNODE pHead);bool Insert_List(PNODE pHead, int pos, int val);bool Delete_List(PNODE pHead, int pos, int* deleteVal);int main(void){int value;PNODE pHead = NULL;pHead = Create_List();printf("构造好的链表是:");Traverse_List(pHead);Sort_List(pHead);printf("排序后的链表为:");Traverse_List(pHead);if(Insert_List(pHead, 5, 233))Traverse_List(pHead);if(Delete_List(pHead, 5, &value))Traverse_List(pHead);return 0;}//函数定义PNODE Create_List(){int length; //用于存储链表的有效长度int value; //用于临时存储数据PNODE pHead = (PNODE)malloc(sizeof(NODE));PNODE pTail = pHead;pTail->pNext = NULL;printf("请输入您要创建的链表节点个数:");scanf("%d", &length);for (int i = 0; i < length; i++){printf("请输入第%d个节点的值:", i + 1);scanf("%d", &value);PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->data = value;pNew->pNext = NULL;pTail->pNext = pNew;pTail = pNew;}return pHead;}void Traverse_List(PNODE pHead) //将链表遍历输出{PNODE p = pHead->pNext;while (p != NULL){printf("%d ", p->data);p = p->pNext;}printf("\n");}bool IsEmpty_List(PNODE pHead) //判断链表是否为空{if (pHead->pNext == NULL){return true;}else{return false;}}int CalcuteLength_List(PNODE pHead) //计算链表有效节点数{int length = 0;PNODE p = pHead->pNext;while (p != NULL){length++;p = p->pNext;}return length;}void Sort_List(PNODE pHead) //将链表升序排序{int temp;for (PNODE p = pHead->pNext; p != NULL; p = p->pNext){for (PNODE q = p->pNext; q != NULL; q = q->pNext){if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}}}}bool Insert_List(PNODE pHead, int pos, int val) //在链表的第pos个节点插入新节点{int i;PNODE p = pHead;//利用 i<pos-1 控制 p=p->pNext 的循环次数,i可看作p在链表中指向第i个节点(头节点看作0),最终p指向目标节点的前一个节点for (i = 0; p != NULL && i < pos - 1; i++){p = p->pNext;}if (i>pos-1 || p == NULL){return false;}PNODE pNew = (PNODE)malloc(sizeof(NODE));pNew->data = val;pNew->pNext = p->pNext;p->pNext = pNew;printf("在第%d号节点前插入一个新节点,插入节点的数据域是:%d\n", pos, val);return true;}bool Delete_List(PNODE pHead, int pos, int* deleteVal) //将第pos个节点删除{int i;PNODE p = pHead;for (i = 0; i < pos - 1 && p != NULL; i++){p = p->pNext;}if (i > pos - 1 || p == NULL){return false;}PNODE r = p->pNext;*deleteVal = r->data;p->pNext = p->pNext->pNext;free(r);r = NULL;printf("删除链表中的第%d号节点,删除节点中的数据域是:%d\n", pos, *deleteVal);return true;}
汉诺塔
解决递归问题时一定要认真思考这个自定义函数本身解决的是什么问题!
#include <stdio.h>void hanoi(int n, char A, char B, char C) //将n个盘子从A柱借助B柱移到C柱上{/*汉诺塔问题的复杂度是2的n次方减1问题很复杂,但实际上解决问题的编码就只有三句伪算法:如果只有一个盘子,将该盘子从A柱直接移到C柱如果有n个盘子(n>1),分为三步:Step1、将n-1个盘子从A柱借助C柱移到B柱上Step2、将第n个盘子从A柱直接移到C柱上Step3、将n-1个盘子从B柱借助A柱移到C柱上*/if (n == 1){printf("将编号为%d的盘子从%c柱子移到%c柱子上\n", n, A, C);}else{hanoi(n - 1, A, C, B);printf("将编号为%d的盘子从%c柱子移到%c柱子上\n", n, A, C);hanoi(n - 1, B, A, C);}}int main(void){hanoi(4, 'A', 'B', 'C');return 0;}
