2-25练习题

文章详细描述了循环队列在数组中的实现,包括元素的入队、出队、判断队列空满状态、清空队列以及计算元素个数的方法,同时展示了与链表相关的list_head结构和操作函数。
摘要由CSDN通过智能技术生成

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值