5月6号考核
发布日期:2021-05-15 01:05:03 浏览次数:17 分类:精选文章

本文共 5280 字,大约阅读时间需要 17 分钟。

C语言代码示例与实现

以下是一些常见于C语言程序员日常工作的代码片段,涵盖排序算法、链表操作、字符串操作等内容,每段代码后都附有简要注释和实现思路。


一、快速排序算法实现

#include 
#include
int main(void) {
int len;
scanf("%d", &len);
int* nums = (int*)malloc(sizeof(int) * len);
for (int i = 0; i < len; ++i) {
scanf("%d", nums + i);
}
int target, i, j;
scanf("%d", &target);
for (i = 0, j = len - 1; i < j;) {
if ((nums[i] + nums[j]) > target) {
j--;
} else if ((nums[i] + nums[j]) < target) {
i++;
} else {
printf("[%d,%d]", nums[i], nums[j]);
break;
}
}
return 0;
}

算法描述

这个代码实现了一个快速排序算法的思路,其中使用两个指针,左指针从数组起点,右指针从数组终点。通过比较两个指针所指的元素和目标值的和,决定移动指针的位置。当发现和等于目标值时,输出这对元素并结束程序。这种方法在数据层面上复杂度较低,适合处理较短的数组。


二、双链表的合并操作实现

#include 
#include
typedef struct LinkList {
int val;
struct LinkList* next;
} Node;
Node* creat() {
int n;
puts("输入长度");
scanf("%d", &n);
Node* head = (Node*)malloc(sizeof(Node));
Node* end = head;
for (int i = 0; i < n; ++i) {
Node* node = (Node*)malloc(sizeof(Node));
scanf("%d", &node->val);
end->next = node;
end = node;
}
end->next = NULL;
return head;
}
void print(Node* head) {
while (head->next) {
printf("%d ", head->next->val);
head = head->next;
}
}
int main(void) {
Node* head1 = creat();
Node* head2 = creat();
Node* newhead = (Node*)malloc(sizeof(Node));
Node* t1 = head1->next, * t2 = head2->next, * p = newhead;
while (t1 && t2) {
if (t1->val <= t2->val) {
p->next = t1;
p = t1;
t1 = t1->next;
} else if (t1->val > t2->val) {
p->next = t2;
p = t2;
t2 = t2->next;
}
}
if (t1 == NULL) {
p->next = t2;
}
if (t2 == NULL) {
p->next = t1;
}
print(newhead);
return 0;
}

算法描述

这个代码实现了对两个双链表的合并操作。通过不断地比较两个链表的当前节点的值,决定将哪一个节点加入新的合并链表中。合并完成后,输出最终的链表内容。整个过程类似于合并两个有序数组的过程。


三、字符串交错排列工具

#include 
#include
int main(void) {
char word1[101];
char word2[101];
char word3[101];
gets(word1);
gets(word2);
memset(word3, 0, sizeof(word3));
int len1 = strlen(word1);
int len2 = strlen(word2);
int i = 0, j = 0, len = 0;
for (; i < len1 && j < len2;) {
if (len % 2 == 0) {
word3[len++] = word1[i++];
} else {
word3[len++] = word2[j++];
}
}
if (i == len1) {
while (word2[j]) {
word3[len++] = word2[j++];
}
}
if (j == len2) {
while (word1[i]) {
word3[len++] = word1[i++];
}
}
word3[len] = 0;
puts(word3);
return 0;
}

算法描述

这个代码实现了一个字符串交错排列的功能。通过遍历两个字符串的字符,交替将字符拷贝到目标字符串中。当其中一个字符串的末尾被拷贝完后,剩下的字符也被依次拷贝到目标字符串中,最终输出结果。这种方法类似于合并两个字符序列,但以特定的顺序进行。


四、字符串乘法功能

#include 
#include
#include
#define M 10005
char s1[M], s2[M], s[M];
int a[M], b[M], c[M];
int main(void) {
int i, j, m, n, k;
int flag1 = 1;
int flag2 = 1;
gets(s1);
gets(s2);
memset(c, 0, sizeof(c));
n = strlen(s1);
m = strlen(s2);
if (s1[0] == '-') {
flag1 = -1;
}
if (s2[0] == '-') {
flag2 = -1;
}
k = n + m;
/*把字符串s1和s2逆序用数字排列*/
for (i = 0; i < n; i++) {
if (flag1 == -1) {
if (i == n - 1) {
break;
}
}
a[i] = s1[n - i - 1] - '0';
}
for (i = 0; i < m; i++) {
if (flag1 == -1) {
if (i == n - 1) {
break;
}
}
b[i] = s2[m - 1 - i] - '0';
}
/* 乘运算*/
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
c[i + j] += a[i] * b[j];
}
}
for (i = 0; i <= k; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
/*去除前导0*/
i = k;
while (c[i] == 0) {
i--;
}
/*判断两个非负数之积是否为0,以及逆序打印c[]*/
if (i < 0) {
printf("0");
} else {
if (flag1 * flag2 == -1) {
printf("-");
}
for (; i >= 0; i--) {
printf("%d", c[i]);
}
}
printf("\n");
return 0;
}

算法描述

这个代码实现了一个字符串乘法功能,将两个字符串按照数值方式进行操作。首先将字符串逆序转换为数字数组进行乘法运算,乘法完成后再逆序转换回字符串,处理负号和前导零等问题,最终输出结果。


五、生成排列序列代码

#include 
int book[10]; //标记数组
int find[10]; //答案数组
int len;
void print(int n) {
for (int i = 1; i <= n; ++i) {
printf("%5d", find[i]);
}
printf("\n");
}
void dfs(int step, int n) {
if (step == n + 1) {
print(n); //输出这种排列
return; //注意,输出后一定要返回
}
for (int i = 1; i <= n; ++i) {
if (book[i]) { //如果i被使用过,继续找没使用过的i
continue;
}
//找到未被使用的i
book[i] = 1; //标记它
find[step] = i; //把它放到答案里
dfs(step + 1, n); //继续找下一个位置
//注意,是一步步返回的,一定要在每步结束后把标记归0
book[i] = 0;
}
return;
}
int main(void) {
int n;
scanf("%d", &n);
book[10] = { //初始化数组
0
};
DFS(1, n);
return 0;
}

算法描述

这个代码实现了一个生成全排列的深度优先搜索(DFS)算法。使用标记数组记录每个数字是否已经使用过,然后通过递归的方式生成所有可能的排列序列。一旦生成完整的排列(所有元素被使用),就记录下来并输出结果。


以上是几种常见C语言代码片段的实现与优化描述,每个代码都附有详细的注释和算法思路,供开发者参考和学习。

上一篇:C语言文件的基础操作
下一篇:【C语言】模拟链表

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月24日 18时56分29秒