精选100道C语言编程习题详解(第三十一至三十五题)

更新:11-09 民间故事 我要投稿 纠错 投诉

大家好,今天给各位分享精选100道C语言编程习题详解(第三十一至三十五题)的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

包括

包括

#定义MAX_VERTICES 100

//图的最大顶点数

//图的邻接表表示

类型定义结构{

int 边[MAX_VERTICES][MAX_VERTICES];

整数n; //顶点数

} 图;

//初始化图

void initGraph(Graph *g, int n) {

g-n=n;

for (int i=0; i n; i++) {

for (int j=0; j n; j++) {

g-边[i][j]=-1; //没有边用-1表示

}

}

}

//添加边缘

void addEdge(Graph *g, int u, int v) {

g-边[u][v]=1; //边用1表示

g-边[v][u]=1; //无向图需要添加双向边

}

//深度优先搜索算法

void dfs(Graph *g, int v, bool Visited[]) {

访问过[v]=true; //将当前顶点标记为已访问

printf("%d", v); //输出当前顶点数

for (int i=0; i g-n; i++) {

if (g-edges[v][i]==1 !visited[i]) { //如果当前顶点和下一个顶点之间有边并且下一个顶点没有被访问过,则继续搜索下一个顶点

dfs(g, i, 访问过);

}

}

}

int main() {

图g; //定义图结构变量

initGraph(g, 6); //初始化图

addEdge(g, 0, 1); //添加边

addEdge(g, 0, 2);

addEdge(g, 1, 3);

addEdge(g, 2, 3);

addEdge(g, 3, 4);

addEdge(g, 3, 5);

bool 访问过[MAX_VERTICES]; //标记每个顶点是否被访问过,初始值为false

for (int i=0; i g.n; i++) { //将访问的数组初始化为false

访问过[i]=false;

}

printf("DFS 顺序:"); //输出深度优先搜索的结果

dfs(g, 0, 访问过); //从顶点0开始执行深度优先搜索

printf("n");

返回0;

}

在此代码中,Graph 结构表示一个无向图,由邻接表表示。 initGraph函数用于初始化图,addEdge函数用于添加边,dfs函数实现深度优先搜索算法。在main函数中,首先初始化图,然后标记每个顶点是否被访问过,最后从顶点0开始进行深度优先搜索并输出搜索结果。

2. 实现广度优先搜索算法。

下面是用C语言实现广度优先搜索算法的示例代码:

包括

包括

包括

#定义MAX_VERTICES 100

//图的最大顶点数

//图的邻接表表示

类型定义结构{

int 边[MAX_VERTICES][MAX_VERTICES];

整数n; //顶点数

} 图;

//初始化图

void initGraph(Graph *g, int n) {

g-n=n;

for (int i=0; i n; i++) {

for (int j=0; j n; j++) {

g-边[i][j]=-1; //没有边用-1表示

}

}

}

//添加边缘

void addEdge(Graph *g, int u, int v) {

g-边[u][v]=1; //边用1表示

g-边[v][u]=1; //无向图需要添加双向边

}

//广度优先搜索算法

void bfs(Graph *g, int start) {

int 队列[MAX_VERTICES]; //队列用于存储要访问的顶点号

int 前=0,后=0; //队列的front和rear指针

bool 访问过[MAX_VERTICES]; //标记每个顶点是否被访问过,初始值为false

for (int i=0; i g-n; i++) { //将访问的数组初始化为false

访问过[i]=false;

}

访问过[开始]=true; //将起始顶点标记为已访问

printf("%d", 开始); //输出起始顶点数

队列[后++]=开始; //将起始顶点添加到队列中

while (front back) { //当队列不为空时,取出队列的第一个元素并访问其相邻顶点。

int v=队列[front++]; //取出队列第一个元素v

for (int i=0; i g-n; i++) { //遍历v的所有相邻顶点i

if (g-edges[v][i]==1 !visited[i]) { //如果顶点i 和v 之间存在一条边且未被访问过,则将其标记为已访问并将其添加到队列中

printf("%d", i); //输出顶点i的个数

访问过[i]=true; //将顶点i 标记为已访问

队列[后++]=i; //将顶点i 添加到队列中

}

}

}

}

int main() {

图g; //定义图结构变量

initGraph(g, 6); //初始化图

addEdge(g, 0, 1); //添加边

addEdge(g, 0, 2);

addEdge(g, 0, 3);

addEdge(g, 0, 4);

addEdge(g, 0, 5);

addEdge(g, 0, 6);

}

3.实现链表操作(插入、删除、反转等)。

下面是使用C语言进行链表操作的基本示例。我们将创建一个简单的链表结构并实现插入、删除和反转功能。

包括

包括

//定义链表节点

结构节点{

整数数据;

结构节点*下一个;

};

//将节点插入到链表末尾

void insertNode(struct Node** head, int data) {

struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));

新节点数据=数据;

新节点下一个=NULL;

if (*head==NULL) { //如果链表为空,则新节点为头节点

*头=新节点;

返回;

}

结构节点* temp=*head;

while (temp-next !=NULL) { //遍历查找链表末尾

temp=临时下一个;

}

临时下一个=新节点; //在链表末尾插入新节点

}

//删除指定数据的节点

void deleteNode(struct Node** head, int data) {

if (*head==NULL) { //如果链表为空,则直接返回

返回;

}

if ((*head)-data==data) { //如果头节点是要删除的节点

结构节点* temp=*head;

*头=(*头)-下一个; //删除头节点并更新头指针

免费(临时); //释放旧头节点的内存

返回;

}

结构节点* temp=*head;

while (temp-next !=NULL temp-next-data !=data) { //遍历找到要删除节点的前一个节点

temp=临时下一个;

}

if (temp-next !=NULL) { //如果找到要删除的节点,则删除并更新前一个节点的next指针

struct Node* toDelete=temp-next;

临时下一个=临时下一个-下一个; //删除该节点并更新前一个节点的next指针

自由(删除); //释放被删除节点的内存

}

}

//反向链表

无效反向列表(结构节点**头){

结构节点* prev=NULL;

结构节点*当前=*头;

结构节点*下一个=NULL;

while (current !=NULL) { //遍历链表,将节点的next指针的方向一一反转

下一个=当前-下一个; //暂时保存下一个节点,因为反转后,当前节点的next会变成NULL,无法访问下一个节点。

当前-下一个=上一个; //将当前节点的下一个节点指向前一个节点,完成反转。

上一个=当前; //移动前一个和当前节点并继续下一个循环。

当前=下一个; //移动当前节点。

}

*头=上一个; //将反转后的链表的头节点设置为prev,因为反转后原来的头节点已成为最后一个节点。

}

4、实现二叉树操作(遍历、搜索等)。

下面是使用C语言实现二叉树基本操作(遍历、搜索等)的示例代码:

包括

包括

//定义二叉树节点

结构节点{

整数数据;

结构节点*左;

结构节点*右;

};

//创建新节点

结构节点* createNode(int data) {

struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));

新节点数据=数据;

newNode-left=NULL;

newNode-right=NULL;

返回新节点;

}

//将节点插入二叉树

void insertNode(struct Node** root, int data) {

if (*root==NULL) { //如果二叉树为空,则创建一个新节点作为根节点

*root=createNode(数据);

返回;

}

if (data(*root)-data) { //如果要插入的数据小于根节点,则插入到左子树中

insertNode(((*root)-左), 数据);

} else { //否则,插入右子树

insertNode(((*root)-右), 数据);

}

}

//中序遍历二叉树(左子树-根节点-右子树)

void inorderTraversal(struct Node* root) {

if (root !=NULL) { //如果节点不为空,先遍历左子树

inorderTraversal(左根);

printf("%d", 根数据); //访问根节点数据

inorderTraversal(根右); //再次遍历右子树

}

}

//二分查找树中是否存在二分查找(左边界-查找数据-右边界)

int binarySearch(struct Node* root, int target) {

左整数=0; //左边界为0(最小值)

int右=100000; //右边界为100000(最大值)

while (left=right) { //当左边界小于等于右边界时,继续查找

int 中=(左+ 右)/2; //中间值是mid(四舍五入)

if (root==NULL || root-data==target) { //如果二叉树为空或者找到目标数据,则返回对应的索引值(0表示找到,-1表示未找到)

返回根==NULL? 0 : -1;

} else if (root-data target) { //如果当前节点的值小于目标数据,则将左边界更新为mid+1,并继续在右子树中搜索

左=中+1;

} else { //否则,将右边界更新为mid-1 并继续在左子树中搜索

右=中-1;

}

}

返回-1; //在二叉搜索树中没有找到目标数据,返回-1表示没有找到。

}

5. 实现堆排序算法。

下面是用C语言实现堆排序算法的示例代码:

包括

//交换数组中两个元素的位置

无效交换(int * arr,int i,int j){

int temp=arr[i];

arr[i]=arr[j];

arr[j]=温度;

}

//调整堆以满足堆的属性

void heapify(int* arr, int n, int i) {

int 最大=i; //将根节点索引初始化为最大值

int 左=2 * i + 1; //左子节点索引

int 右=2 * i + 2; //右子节点索引

//如果左子节点大于根节点,则更新最大索引

if (左n arr[左] arr[最大]) {

最大=左;

}

//如果右子节点大于最大索引对应的值,则更新最大索引

if (右n arr[右] arr[最大]) {

最大=右;

}

//如果最大索引不是根节点,则交换根节点和最大索引对应的值,递归调整子树

如果(最大!=我){

交换(arr,i,最大);

heapify(arr, n, 最大);

}

}

//堆排序函数

无效堆排序(int* arr, int n) {

//构建最大堆(从最后一个非叶子节点开始)

for (int i=n/2 - 1; i=0; i--) {

堆化(arr,n,i);

}

//从最后一个元素开始,依次将最大元素与当前元素交换,调整堆

for (int i=n - 1; i=0; i--) {

交换(arr,0,i);

堆化(arr,i,0);

}

}

int main() {

int arr[]={5, 3, 8, 4, 2, 1, 9, 7, 6}; //待排序的数组

int n=sizeof(arr)/sizeof(arr[0]); //数组长度

堆排序(arr,n); //种类

printf("对结果进行排序:");

for (int i=0; i n; i++) {

printf("%d", arr[i]); //输出排序结果

}

printf("n");

返回0;

}

————————————————

关于本次精选100道C语言编程习题详解(第三十一至三十五题)和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

用户评论

ˉ夨落旳尐孩。

太棒了!我一直想练习一些C语言基础题,刚好碰到这个系列

    有9位网友表示赞同!

浮光浅夏ζ

这100个编程题真是太经典了,我以前刷过一部分,看来可以好好回顾一下

    有11位网友表示赞同!

人心叵测i

收藏了!下次做作业的时候用到再看看这些题目

    有17位网友表示赞同!

命硬

31到35题能帮我巩固一下C语言的语句结构吗?

    有15位网友表示赞同!

冷风谷离殇

C语言学习真的很重要,这100个例子看起来挺挑战性的

    有16位网友表示赞同!

oО清风挽发oО

希望这些编程题涵盖了不同难度级别,这样才能学得更全面

    有13位网友表示赞同!

(り。薆情海

做完这些题目后一定可以提高我的编程逻辑思维能力

    有19位网友表示赞同!

念旧情i

期待学习更多C语言的知识和技巧!

    有19位网友表示赞同!

初阳

这些经典编程题能让我更好地理解C语言的应用

    有6位网友表示赞同!

百合的盛世恋

我还没开始学C语言,这个系列的文章看起来很有帮助

    有10位网友表示赞同!

烟雨萌萌

做完这100个例子,感觉自己离成为一名合格的程序员更近了一步!

    有16位网友表示赞同!

墨染天下

学习编程确实很枯燥,希望这些题目能让我保持学习的动力

    有14位网友表示赞同!

执妄

C语言是基础性很强的语言,掌握它很重要

    有6位网友表示赞同!

花容月貌

我已经做了一些编程题了,还想挑战一下这100个经典案例

    有18位网友表示赞同!

怪咖

我打算用c语言开发一个简单的应用程序,希望能从中受益

    有18位网友表示赞同!

不离我

分享学习C语言的经验和心得能让我更快进步!

    有18位网友表示赞同!

逃避

谢谢作者为我们创作这些高质量的编程题!

    有9位网友表示赞同!

孤自凉丶

做编程题的过程能让我的算法水平不断提高

    有17位网友表示赞同!

男神大妈

期待看到更多精彩的C语言 programming内容!

    有18位网友表示赞同!

【精选100道C语言编程习题详解(第三十一至三十五题)】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:成语汇编:描绘欢笑的词汇精选 下一篇:8款亲子互动游戏,助力孩子专注力培养,家庭时光更欢乐!