2-25练习题

6.假设循环队列用数组实现,其定义如下:

#define SEQLEN 32

int seqn [ SEQLEN ];

/*用于存放队列数据的数组*/

int head;/*数组下标索引,指向队列头部,若队列不空,指向队列头元素*/

int tail;/*数组下标索引,指向队列尾部,若队列不空,指向队列空元素*/

队列示例:

循环队列中保存了1、2,3三个数据的状态。

seqn

head=1

tail=4

(1)假如队列未满,现有变量 data 需要入队,请写出表达式;

seqn[tail] = data;

tail = (tail + 1) % SEQLEN;

(2)假如队列未空,现在需要从队列取一个元素并赋值给变量data,请写出表达式;

data = seqn[head];

head = (head + 1) % SEQLEN;

(3)请写出队列为空的判断条件:

head == tail

(4)请写出队列满的判断条件:

(head + 1) % SEQLEN == tail

(5)请写出清空队列的表达式:

head = 0;

tail = 0;

(6)请写出计算队列中元素个数的表达式:

(head <= tail) ? (tail - head) : (SEQLEN - head + tail)

(7)队列最多可以存放几个元素:

循环队列最多可以存放的元素个数为 SEQLEN - 1,因为需要浪费一个位置来区分队列为空和队列为满的状态。

所以最多可以存放31个元素。

6, 补下面队列代码

struct list_head {

struct list_head *next, *prev;

};

/**

* used to add new element into list.

* @new: specify the new element.

* @prev: specify the previous element.

* @next: specify the next element.

* 插入 到 prev 和 next 中间

*/

static inline void _list_add(struct list_head * new,

struct list_head * prev,

struct list_head *next)

}

new=(struct list_head*)malloc(sizeof(struct list_head));

if(NULL = new)

{

printf("创建新节点失败\n");

return;

}

new->next = NULL;

new->prev = NULL;

new->prev=new->prev->next;

new->prev->next = new;

/**

* used to maintain link status when delete an element.

*@prev: specify the previous element.

*@next: specify the next element.

* 删除 prev 和 next 中间那个

*/

static inline void __list_del(struct list_head *prev, struct list_head *next)

{

struct list_head* p;

p=prev->next;

prev->next = prev->next->next;

free(p);

p=NULL;

}

/**

* used to add element into the tall of list.

* @new: specify the new element.

* @head: specify the head element.

* 插入到队尾

* /

static inline void list_add_tail(struct list_head *new, struct list_head *head)

{

new=(struct list_head*)malloc(sizeof(struct list_head));

if(NULL = new)

{

printf("申请新节点失败\n");

return;

}

p=head;

while(p->next!=NULL)

{

p=p->next;

}

p->next = new->next;

p->next = new;

new->prev = p;

new->next=NULL;

}

/**

* used to remove element.

* @entry: specify the element which want to be deleted.

* 删掉

*/

static inline void list_del(struct list_head *entry)

{

struct list_head* p;

if(entry->next!=NULL)

{

entry->prev->next = entry->next;

entry->next->prev = entry->prev;

free(entry);

entry=NULL;

}

else

{

entry->prev->next = NULL;

free(entry);

entry=NULL;

}

}

/**

* used to check list is empty or not.

* @head: specify the head element.

* 判断是否为空

*/

static inline int list_empty(const struct list_head *head)

{

return head->next == head->prev;

}

相关推荐
越甲八千2 小时前
windowsC++操作ADB
c++·windows·adb
九班长3 小时前
Mirror的多人连接管理及房间系统
windows
一个懒鬼3 小时前
Edge浏览器打开PDF文件显示空白(每次需要等上一会)
windows·pdf
com未来4 小时前
使用 NSSM 安装 Tomcat 11.0.6 为 Windows 服务
java·windows·tomcat
不要数手指啦5 小时前
Apifox使用方法
windows
IT专业服务商15 小时前
联想 SR550 服务器,配置 RAID 5教程!
运维·服务器·windows·microsoft·硬件架构
海尔辛15 小时前
学习黑客5 分钟小白弄懂Windows Desktop GUI
windows·学习
gushansanren16 小时前
基于WSL用MSVC编译ffmpeg7.1
windows·ffmpeg
伐尘17 小时前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio
专注代码七年17 小时前
在Windows 境下,将Redis和Nginx注册为服务。
windows·redis·nginx