华为数据结构笔试题
根据给定的信息,本文将对华为数据结构笔试题进行详细解析。题目要求是:若干只老鼠围成一个圈,一只猫绕着这些老鼠转圈,每隔若干只老鼠就吃掉一只,然后继续转,以此类推,直到所有老鼠都被吃掉为止。我们需要找到老鼠被吃掉的具体顺序。 ### 一、问题分析 首先明确题目给出的数据结构和算法需求: - **数据结构**:题目中使用了单向循环链表来表示老鼠的位置。 - **算法需求**:实现了一个模拟猫捕食过程的算法。 ### 二、数据结构设计与实现 #### 2.1 数据结构定义 题目中的数据结构定义如下: ```c typedef char datatype; typedef struct node { struct node *front; datatype info; struct node *rear; } node; ``` - `datatype`:这里使用`char`类型存储节点信息(本题中用于表示老鼠)。 - `node`结构体包含三个成员变量:`front`(前驱节点指针)、`info`(节点信息)、`rear`(后继节点指针)。 #### 2.2 链表操作函数 - **初始化链表** (`init`):创建空链表。 - **插入节点** (`insert`):在链表中的指定位置插入新节点。 - **显示链表** (`display`):遍历并打印链表中的所有节点。 - **删除节点** (`dele`):按照题目要求,模拟猫捕食的过程,即每隔固定数量的节点删除一个节点。 #### 2.3 函数实现 - **初始化链表** (`init`):返回空链表。 - **插入节点** (`insert`):根据参数`num`在链表中的相应位置插入新节点。如果链表为空,则创建一个环形链表;如果链表不为空,则在指定位置插入新节点,并更新相邻节点之间的指针关系。 - **显示链表** (`display`):遍历链表并打印所有节点信息。 - **删除节点** (`dele`):模拟猫捕食的过程,每次按照指定的数量跳过节点后删除一个节点。 ### 三、模拟猫捕食过程 根据题目要求,模拟猫捕食的过程主要涉及以下步骤: 1. 初始化一个空的单向循环链表。 2. 往链表中插入若干个节点,代表老鼠的位置。 3. 按照题目要求,每隔一定数量的节点就删除一个节点,直到链表为空。 ### 四、核心代码解析 #### 4.1 插入节点 (`insert`) 该函数实现了在指定位置插入节点的功能。当链表为空时,直接创建一个环形链表;当链表不为空时,则在指定位置插入节点,并更新前后节点之间的指针关系。 #### 4.2 删除节点 (`dele`) 该函数实现了按照指定数量跳过节点后删除一个节点的功能。当链表为空或参数`num`小于等于0时,输出错误信息并退出程序。当链表不为空时,则按照指定数量跳过节点后删除一个节点,并更新前后节点之间的指针关系。 ### 五、总结 本题通过构建一个单向循环链表,结合链表的基本操作实现了题目要求的功能。在实际编程过程中需要注意的是,对于链表的操作需要确保指针的正确更新,避免出现野指针等问题。此外,还需要注意边界条件的处理,比如当链表为空或者需要插入/删除的节点位置不合法等情况。
/*头文件,文件名:SLB.h*/
#ifndef SLB
#define SLB
typedef char datatype;
typedef struct node
{
struct node *front;
datatype iofo;
struct node *rear;
}node;
#endif
/*双链表操作文件,文件名:SLB.cpp*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"SLB.h"
/*初始化双链表*/
node * init()
{
return NULL;
}
/*建立双链表*/
node * insert(node *my_head,int num,datatype data)
{
node *p=(node *)malloc(sizeof(node));
p->iofo=data;
p->rear=NULL;
node *q=my_head;
int j=0;
if(num<0)
{
puts("插入的位置不存在!");
exit(1);
}
else if(num==0)//插入位置在最前边
{
if(!my_head)//双链表空
{
p->front=p;
p->rear=p;
my_head=p;
return my_head;
}
else//双链表非空
{
while(q->rear!=my_head)//q指向双链表的最后一个节点
q=q->rear;
p->front=my_head->front;
p->rear=q->rear;
q->rear=p;
my_head->front=p;
my_head=p;
return my_head;
}
}
剩余6页未读,继续阅读
- wang10151888612014-10-24挺好的 看了一半 还没看完
- 花城浪人2018-03-16浪费LZ的D币
- Txhuifei01_2014-04-19真的是华为数据结构笔试题么?
- lihuiqi2392012-08-30一般吧 非常通用的面试题
- 粉丝: 1
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助