Day01_刷题niuke20250905
C语言_数据结构_云尖软件开发笔试试题
题目分析
1. 1.
将一个单向链表表插入到一个循环链表尾部(循环链表指在单向链表的基础上,将最后一个节点的下一节点指向首节点)
2. 2.
例如循环链表为A->B->C->D,单向链表为E->F->G,则插入后的结果为A->B->C->D->E->F->G
3. 3.
用C语言编写函数实现此功能,输入参数为循环链表表的头指针及单向链表的头指针,返回值为插入后的循环链表的头指针
4. 4.
节点结构定义如下
#include <stdio.h>// 节点结构定义
typedef struct node
{int data;struct node *next;
} NODE_S;// 函数实现:将单向链表插入到循环链表尾部
NODE_S* insert_list(NODE_S *circle_head, NODE_S *single_head)
{// 如果循环链表为空,将单向链表首尾相连形成循环链表if (circle_head == NULL){if (single_head == NULL)return NULL;// 找到单向链表的尾节点NODE_S *tail = single_head;while (tail->next != NULL)tail = tail->next;// 将尾节点指向头节点,形成循环tail->next = single_head;return single_head;}// 如果单向链表为空,直接返回循环链表if (single_head == NULL)return circle_head;// 找到循环链表的尾节点(指向头节点的节点)NODE_S *circle_tail = circle_head;while (circle_tail->next != circle_head)circle_tail = circle_tail->next;// 找到单向链表的尾节点NODE_S *single_tail = single_head;while (single_tail->next != NULL)single_tail = single_tail->next;// 将循环链表的尾节点指向单向链表的头节点circle_tail->next = single_head;// 将单向链表的尾节点指向循环链表的头节点,形成新的循环single_tail->next = circle_head;return circle_head;
}// 测试代码
void print_list(NODE_S *head)
{if (head == NULL){printf("空链表\n");return;}NODE_S *p = head;do{printf("%d -> ", p->data);p = p->next;} while (p != head);printf("(回到头节点)\n");
}// 主函数用于测试
int main()
{// 创建循环链表 A->B->C->DNODE_S A = {1, NULL};NODE_S B = {2, NULL};NODE_S C = {3, NULL};NODE_S D = {4, NULL};A.next = &B;B.next = &C;C.next = &D;D.next = &A; // 形成循环// 创建单向链表 E->F->GNODE_S E = {5, NULL};NODE_S F = {6, NULL};NODE_S G = {7, NULL};E.next = &F;F.next = &G;G.next = NULL;printf("插入前的循环链表:\n");print_list(&A);// 调用函数插入单向链表NODE_S *result = insert_list(&A, &E);printf("插入后的循环链表:\n");print_list(result);return 0;
}
C语言_循环查找
题目分析
1. 1.
有一个长度为10的数组,其中有重复数据
2. 2.
要求相同的数据只保留一份,其余重复的数据用0替代
3. 3.
处理后的数组长度仍为10,只是将重复的元素替换为0
从例子可以看出:- 处理前:[20, 1, 23, 4, 9, 29, 4, 32, 4, 5]
- 处理后:[20, 1, 23, 4, 9, 29, 32, 5, 0, 0]
#include <stdio.h>// 处理数组,保留相同数据只保留一份,其它用0替代
void process_array(int arr[], int size) {// 标记数组,用于记录元素是否已经出现过int visited[size];for (int i = 0; i < size; i++) {visited[i] = 0; // 初始化为0,表示未访问}// 遍历数组for (int i = 0; i < size; i++) {// 如果当前元素已被标记为访问过,则跳过if (visited[i] == 1) {continue;}// 标记当前元素为已访问visited[i] = 1;// 检查后续元素是否与当前元素相同for (int j = i + 1; j < size; j++) {if (arr[j] == arr[i] && visited[j] == 0) {// 将重复元素替换为0arr[j] = 0;// 标记为已访问visited[j] = 1;}}}
}int main() {// 示例数组int arr[10] = {20, 1, 23, 4, 9, 29, 4, 32, 4, 5};int size = 10;printf("处理前 => ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");// 处理数组process_array(arr, size);printf("处理后 => ");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}