当前位置: 首页 > article >正文

c语言练习题【数据类型、递归、双向链表快速排序】

练习1:数据类型

请写出以下几个数据的数据类型

整数 a
a 的地址
存放a的数组 b
存放a的地址的数组
b的地址
c的地址
指向 printf 函数的指针 d
存放 d的数组

  1. 整数 a 的类型
    数据类型是 int

  2. a 的地址
    数据类型是 int*(指向 int 类型的指针)

  3. 存放 a 的数组 b
    数据类型是 int[](整型数组)

  4. 存放 a 的地址的数组 c
    数据类型是 int*[](指针数组,每个元素是指向 int 的指针)
    c的数据类型是指针数组类型,可以表示为:int * c[ ] = {&a};

  5. b 的地址
    指向整型数组的指针
    b的数据类型是 int(*)[](数组指针),b 的地址可以表示为: b, &b, &b[0]

  6. c 的地址
    数据类型是 int*(*)[](指向指针数组的指针)

  7. 指向 printf 函数的指针 d
    printf 函数的类型是 int(*)(const char*, ...)d 的数据类型是 int(*)(const char*, ...)

  8. 存放 d 的数组
    数据类型是 int(*[])(const char*, ...)(函数指针数组,每个元素是指向 printf 函数的指针)。

    #include <stdio.h>
    
    int main() {
        // 打印 "Hello, World!" 到控制台
        printf("Hello, World!\n");
    
        // 定义一个整型变量 a,并初始化为 10
        int a = 10;
    
        // 打印变量 a 的地址
        printf("a的地址是:%p\n", &a);
    
        // 定义一个整型数组 b,并将 a 的值存入数组中
        int b[] = {a};
    
        // 定义一个整型指针 c,并将 a 的地址赋值给它
        int * c[] = {&a};
    
        // 下面的注释是对 b 和 c 的说明
        // b, &b, &b[0]; // b 是数组名,&b 是数组的地址,&b[0] 是数组第一个元素的地址
        // c, &c, &c[0]; // c 是指针,&c 是指针的地址,&c[0] 是指针指向的第一个元素的地址
    
        // 定义一个指向 printf 函数的指针 funcs_d
        int (*funcs_d)(const char*, ...) = printf; // 指向printf函数的指针
    
        // 定义一个数组 d,存放指向 printf 函数的指针
        int (*d[])(const char*, ...) = {printf}; // 存放指向printf函数的指针的数组
    
        return 0; // 返回 0,表示程序正常结束
    }

 练习2:递归

请用递归实现计算:1+1/3-1/5+1/7-1/9+…. 1/n 的值,n通过键盘输入

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

double  rec_add(int n)
{
	double sum=0;

	if (n==1)
	{
		return 1;
	}else
	{
		double sum=1.0/n;
		if ((n/2)%2==0)
		{
			return sum+rec_add(n-2);
		}else{
			return -sum+rec_add(n-2);	
		}
	}
	return sum;
}

int main(int argc, const char *argv[])
{
	int n=0;
	printf("输入n(奇数):");
	scanf("%d",&n);
	if (n<=0 ||n%2==0)
	{
		printf("重新输入一个正奇数\n");
		return 1;
	}

	double  result=rec_add(n);
	printf("result=%f\n",result);

	return 0;
}

练习3:写一个双向链表的快速排序函数

#include <stdio.h>
#include <stdlib.h>

// 双向链表节点结构体
typedef struct Node {
    int data;
    struct Node *prev;
    struct Node *next;
} Node;

// 创建新的节点
Node* create_node(int data) {
    Node *new_node = (Node*)malloc(sizeof(Node));
    new_node->data = data;
    new_node->prev = new_node->next = NULL;
    return new_node;
}

// 在链表尾部插入节点
void append(Node **head, int data) {
    Node *new_node = create_node(data);
    if (*head == NULL) {
        *head = new_node;
    } else {
        Node *temp = *head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = new_node;
        new_node->prev = temp;
    }
}

// 打印链表
void print_list(Node *head) {
    Node *temp = head;
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

// 切分链表并返回基准节点
Node* partition(Node *low, Node *high) {
    int pivot = high->data;
    Node *i = low->prev;
    Node *j = low;

    while (j != high) {
        if (j->data <= pivot) {
            i = (i == NULL) ? low : i->next;
            int temp = i->data;
            i->data = j->data;
            j->data = temp;
        }
        j = j->next;
    }
    i = (i == NULL) ? low : i->next;
    int temp = i->data;
    i->data = high->data;
    high->data = temp;
    return i;
}

// 快速排序递归函数
void quick_sort(Node *low, Node *high) {
    if (low != NULL && high != NULL && low != high && low != high->next) {
        Node *p = partition(low, high);
        quick_sort(low, p->prev);
        quick_sort(p->next, high);
    }
}

// 获取链表的最后一个节点
Node* get_tail(Node *head) {
    while (head != NULL && head->next != NULL) {
        head = head->next;
    }
    return head;
}

int main() {
    Node *head = NULL;

    // 插入一些数据到链表
    append(&head, 5);
    append(&head, 3);
    append(&head, 8);
    append(&head, 4);
    append(&head, 1);
    append(&head, 7);
    
    printf("Original list: ");
    print_list(head);

    Node *tail = get_tail(head);

    // 执行快速排序
    quick_sort(head, tail);

    printf("Sorted list: ");
    print_list(head);

    return 0;
}


http://www.kler.cn/a/531921.html

相关文章:

  • 执行策略更改
  • 洛谷 P11626 题解
  • 【Elasticsearch】 Intervals Query
  • 《MPRnet》学习笔记
  • Rust中使用ORM框架diesel报错问题
  • Python写一个爱心
  • 14-9-3C++STL的set容器
  • C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】
  • 安装nvm后报错
  • 计算机网络中常见高危端口有哪些?如何封禁高危端口?
  • nvm的安装和使用
  • VSCode源码分析参考资料
  • Java自定义IO密集型和CPU密集型线程池
  • OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
  • 【6. 深入理解 C++ 中的常量】
  • G1. Yunli‘s Subarray Queries (easy version)
  • Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)
  • 2月3日星期一今日早报简报微语报早读
  • 遭受大量境外网络攻击,郭盛华公开发声支持DeepSeek
  • 基于Spring Security 6的OAuth2 系列之十 - 授权服务器--刷新token
  • 优化代码性能:利用CPU缓存原理
  • 人工智能学习(五)之机器学习逻辑回归算法
  • DeepSeek-R1 本地部署教程(超简版)
  • SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?
  • DRM系列七:Drm之CREATE_DUMB
  • C++(进阶) 第8章unordered_map和unordered_set的使⽤(哈希)