CS:APP3e 深入理解计算机系统_3e C Programming Lab实验
**queue.h:**
/*
* Code for basic C skills diagnostic.
* Developed for courses 15-213/18-213/15-513 by R. E. Bryant, 2017
*/
/*
* This program implements a queue supporting both FIFO and LIFO
* operations.
*
* It uses a singly-linked list to represent the set of queue elements
*/
#include <stdbool.h>
/************** Data structure declarations ****************/
/* Linked list element (You shouldn't need to change this) */
typedef struct ELE {
int value;
struct ELE *next;
} list_ele_t;
/* Queue structure */
typedef struct {
list_ele_t *head; /* Linked list of elements */
list_ele_t *tail;
unsigned size;
} queue_t;
/************** Operations on queue ************************/
/*
Create empty queue.
Return NULL if could not allocate space.
*/
queue_t *q_new();
/*
Free all storage used by queue.
No effect if q is NULL
*/
void q_free(queue_t *q);
/*
Attempt to insert element at head of queue.
Return true if successful.
Return false if q is NULL or could not allocate space.
*/
bool q_insert_head(queue_t *q, int v);
/*
Attempt to insert element at tail of queue.
Return true if successful.
Return false if q is NULL or could not allocate space.
*/
bool q_insert_tail(queue_t *q, int v);
/*
Attempt to remove element from head of queue.
Return true if successful.
Return false if queue is NULL or empty.
If vp non-NULL and element removed, store removed value at *vp.
Any unused storage should be freed
*/
bool q_remove_head(queue_t *q, int *vp);
/*
Return number of elements in queue.
Return 0 if q is NULL or empty
*/
int q_size(queue_t *q);
/*
Reverse elements in queue
No effect if q is NULL or empty
*/
void q_reverse(queue_t *q);
queue.c:
/*
* Code for basic C skills diagnostic.
* Developed for courses 15-213/18-213/15-513 by R. E. Bryant, 2017
*/
/*
* This program implements a queue supporting both FIFO and LIFO
* operations.
*
* It uses a singly-linked list to represent the set of queue elements
*/
#include <stdlib.h>
#include <stdio.h>
#include "harness.h"
#include "queue.h"
/*
Create empty queue.
Return NULL if could not allocate space.
*/
queue_t *q_new()
{
queue_t *q = NULL;
if((q = malloc(sizeof(queue_t))))
{
q->head = NULL;
q->tail = NULL;
q->size = 0;
return q;
}
else
{
return NULL;
}
}
/* Free all storage used by queue */
void q_free(queue_t *q)
{
/* How about freeing the list elements? */
/* Free queue structure */
if (q)
{
list_ele_t *i = q->head;
while(i)
{
list_ele_t *tmp = i;
i = i->next;
free(tmp);
}
free(q);
}
}
/*
Attempt to insert element at head of queue.
Return true if successful.
Return false if q is NULL or could not allocate space.
*/
bool q_insert_head(queue_t *q, int v)
{
list_ele_t *newh;
/* What should you do if the q is NULL? */
if (q)
{
if ((newh = malloc(sizeof(list_ele_t))))
{
newh->value = v;
newh->next = q->head;
q->head = newh;
if (!q->size)
{
q->tail = newh;
}
++q->size;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
/*
Attempt to insert element at tail of queue.
Return true if successful.
Return false if q is NULL or could not allocate space.
*/
bool q_insert_tail(queue_t *q, int v)
{
/* You need to write the complete code for this function */
/* Remember: It should operate in O(1) time */
list_ele_t *newh;
if (q)
{
if ((newh = malloc(sizeof(list_ele_t))))
{
newh->value = v;
newh->next = NULL;
if (q->tail)
{
q->tail->next = newh;
q->tail = newh;
++q->size;
}
else
{
q->head = q->tail = newh;
++q->size;
}
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
/*
Attempt to remove element from head of queue.
Return true if successful.
Return false if queue is NULL or empty.
If vp non-NULL and element removed, store removed value at *vp.
Any unused storage should be freed
*/
bool q_remove_head(queue_t *q, int *vp)
{
/* You need to fix up this code. */
if (!q || !q->size)
{
return false;
}
else
{
if (vp)
{
*vp = q->head->value;
}
list_ele_t *tmp = q->head;
q->head = q->head->next;
free(tmp);
--q->size;
return true;
}
}
int q_size(queue_t *q)
{
/* You need to write the code for this function */
/* Remember: It should operate in O(1) time */
if (!q || !q->size)
{
return 0;
}
else
{
return q->size;
}
}
/*
Reverse elements in queue
*/
void q_reverse(queue_t *q)
{
if (q && q->size)
{
int cache[q->size];
list_ele_t *tmp = q->head;
for (int i = q->size - 1; (i >= 0) && (tmp != NULL); --i)
{
cache[i] = tmp -> value;
tmp = tmp->next;
}
tmp = q->head;
for (int i = 0; (i < q->size) && (tmp != NULL); ++i)
{
tmp->value = cache[i];
tmp = tmp->next;
}
}
}
测试:
frank@under:~/Desktop/cs:app/lab/cprogramminglab/cprogramminglab-handout$ ./qtest
cmd>help
cmd>help
Commands:
# ... | Display comment
free | Delete queue
help | Show documentation
ih v [n] | Insert v at head of queue n times (default: n == 1)
it v [n] | Insert v at tail of queue n times (default: n == 1)
log file | Copy output to file
new | Create new queue
option [name val] | Display or set options
quit | Exit program
reverse | Reverse queue
rh [v] | Remove from head of queue. Optionally compare to expected value v
rhq [v] | Remove from head of queue without reporting value
show | Show queue contents
size [n] | Compute queue size n times (default: n == 1)
source file | Read commands from source file
time cmd arg ... | Time command execution
Options:
echo 1 Do/don't echo commands
error 5 Number of errors until exit
fail 30 Number of times allow queue operations to return false
malloc 0 Malloc failure probability percent
verbose 4 Verbosity level
cmd>new
cmd>new
q = []
cmd>show
cmd>show
q = []
cmd>ih 1
cmd>ih 1
q = [1]
cmd>ih 2
cmd>ih 2
q = [2 1]
cmd>ih 3
cmd>ih 3
q = [3 2 1]
cmd>size
cmd>size
Queue size = 3
q = [3 2 1]
cmd>it 0
cmd>it 0
q = [3 2 1 0]
cmd>it -1
cmd>it -1
q = [3 2 1 0 -1]
cmd>size
cmd>size
Queue size = 5
q = [3 2 1 0 -1]
cmd>reverse
cmd>reverse
q = [-1 0 1 2 3]
cmd>size
cmd>size
Queue size = 5
q = [-1 0 1 2 3]
cmd>rh -1
cmd>rh -1
Removed -1 from queue
q = [0 1 2 3]
cmd>size
评分:
frank@under:~/Desktop/cs:app/lab/cprogramminglab/cprogramminglab-handout$ ./driver.py
--- Trace Points
+++ TESTING trace trace-01-ops:
# Test of insert_head and remove_head
--- trace-01-ops 7/7
+++ TESTING trace trace-02-ops:
# Test of insert_head, insert_tail, and remove_head
--- trace-02-ops 7/7
+++ TESTING trace trace-03-ops:
# Test of insert_head, insert_tail, reverse, and remove_head
--- trace-03-ops 7/7
+++ TESTING trace trace-04-ops:
# Test of insert_head, insert_tail, and size
--- trace-04-ops 7/7
+++ TESTING trace trace-05-ops:
# Test of insert_head, insert_tail, remove_head reverse, and size
--- trace-05-ops 7/7
+++ TESTING trace trace-06-robust:
# Test operations on NULL queue
--- trace-06-robust 7/7
+++ TESTING trace trace-07-robust:
# Test operations on empty queue
--- trace-07-robust 7/7
+++ TESTING trace trace-08-robust:
# Test remove_head with NULL argument
--- trace-08-robust 7/7
+++ TESTING trace trace-09-malloc:
# Test of malloc failure on new
--- trace-09-malloc 7/7
+++ TESTING trace trace-10-malloc:
# Test of malloc failure on insert_head
--- trace-10-malloc 7/7
+++ TESTING trace trace-11-malloc:
# Test of malloc failure on insert_tail
--- trace-11-malloc 7/7
+++ TESTING trace trace-12-perf:
# Test performance of insert_tail
--- trace-12-perf 7/7
+++ TESTING trace trace-13-perf:
# Test performance of size
--- trace-13-perf 8/8
+++ TESTING trace trace-14-perf:
# Test performance of insert_tail, size, and reverse
--- trace-14-perf 8/8
--- TOTAL 100/100
CS:APP3e 深入理解计算机系统_3e C Programming Lab实验的更多相关文章
- CS:APP3e 深入理解计算机系统_3e MallocLab实验
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- CS:APP3e 深入理解计算机系统_3e Attacklab 实验
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- CS:APP3e 深入理解计算机系统_3e bomblab实验
bomb.c /*************************************************************************** * Dr. Evil's Ins ...
- CS:APP3e 深入理解计算机系统_3e ShellLab(tsh)实验
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- CS:APP3e 深入理解计算机系统_3e Y86-64模拟器指南
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- CS:APP3e 深入理解计算机系统_3e Datalab实验
由于http://csapp.cs.cmu.edu/并未完全开放实验,很多附加实验做不了,一些环境也没办法搭建,更没有标准答案.做了这个实验的朋友可以和我对对答案:) 实验内容和要求可在http:// ...
- CS:APP3e 深入理解计算机系统_3e CacheLab实验
详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取. ...
- 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework
8.9 关于并行的定义我之前写过一篇文章,参考: 并发与并行的区别 The differences between Concurrency and Parallel +---------------- ...
- 深入理解计算机系统_3e 第四章家庭作业(部分) CS:APP3e chapter 4 homework
4.52以后的题目中的代码大多是书上的,如需使用请联系 randy.bryant@cs.cmu.edu 更新:关于编译Y86-64中遇到的问题,可以参考一下CS:APP3e 深入理解计算机系统_3e ...
随机推荐
- Node做中转服务器,转发接口
查询各种资料,和整理网上一哥们不完整的接口.做成,可以使用的转发服务! 由于项目在做前后端分离,牵扯跨域和夸协议问题,临时抱佛脚,选择用nodejs做中转,我想应该好多人都用它.但是做普通的表单转发没 ...
- 《Linux命令行与shell脚本编程大全》 第八章管理文件系统
8.1 探索linux文件系统 8.1.1 基本的Linux文件系统 ext:最早的文件系统,叫扩展文件系统.使用虚拟目录操作硬件设备,在物理设备上按定长的块来存储数据. 用索引节点的系统来存放虚拟目 ...
- 使用duilib开发简单的Window安装包
一.具体思路 安装过程:安装包的制作包括资源文件的打包,资源文件打包到安装包exe中,安装的时候需要从exe中提取出对应的资源文件, 然后解压文件安装到指定目录,然后就是对安装的可执行程序进行注册表的 ...
- [转载] zookeeper应用——集中配置管理系统的实现
转载自http://blog.csdn.net/huangfengxiao/article/details/8844239 1 场景描述 参考http://www.ibm.com/developerw ...
- Shell 快速指南
Shell 快速指南 ███████╗██╗ ██╗███████╗██╗ ██╗ ██╔════╝██║ ██║██╔════╝██║ ██║ ███████╗███████║█████╗ ██║ ...
- websocket做手机页面聊天与PC页面聊天一对一的即时通讯
当时要写这个需求的时候,很头痛,手机端页面的客服功能,相当于QQ这样一个一对一聊天室功能了,瞬间蒙蔽的我也不知道用什么去写这个东西,一开始用ajax,定时器去写,写着写着发现这尼玛不在同一个页面怎么做 ...
- 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets
本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...
- 《java.util.concurrent 包源码阅读》19 PriorityBlockingQueue
前面讲ScheduledThreadPoolExecutor曾经重点讲到了DelayedWorkQueue,这里说的PriorityBlockingQueue其实是DelayedWorkQueue的简 ...
- C#常见错误解决方法
1.能提供Visual Studio开发工具包吗? 解决方法: Visual Studio 2017开发环境下载地址: https://www.visualstudio.com/zh-hans/dow ...
- 小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教
首先你输入了一个字符串,这个字符串是有大小的,电脑将其放在内存中,自动给其一个起始指针指向这个字符串的首位置,然后,你将这个字符串赋值给一个变量,这个对象又在内存中开辟出一个空间,这个变量会自动连接这 ...