苏嵌项目实战 学习日志3
姓名:张丽娜
日期: 2018/09/05
今日学习任务
- 学习数据结构中队列的知识
- 使用C语言实现了顺序队列的操作与链式队列的操作
今日任务完成情况
- 理解了顺序队列的概念与链式队列的概念。
- 完成了相关代码。
课堂代码
queue.c
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
int InitQueue(Qu *q)
{
Node *p = (Node *)malloc(sizeof(Node)); //申请头结点
if (NULL == p)
{
return FAILURE;
}
p->next = NULL; //空队,没有下一个结点
q->front = q->rear = p;
return SUCCESS;
}
int EnterQueue(Qu *q, int e)
{
if (NULL == q) //入参判断
{
return FAILURE;
}
if (q->rear == NULL)
{
return FAILURE;
}
Node *p = (Node *)malloc(sizeof(Node));
if (NULL == p)
{
return FAILURE;
}
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return SUCCESS;
}
int LengthQueue(Qu q)
{
int len = 0;
Node *p = q.front->next;
while (p)
{
len++;
p = p->next;
}
return len;
}
int GetFront(Qu q)
{
//如果是空队,没有队头元素,返回失败
if (q.front == q.rear)
{
return FAILURE;
}
return q.front->next->data;
}
int DelQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
if (q->front == q->rear)
{
return FAILURE;
}
Node *p = q->front->next; //保存第一个结点
int e = p->data;
q->front->next = p->next;
free(p);
if (q->rear == p)
{
q->rear = q->front;
}
return e;
}
int ClearQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
if (q->front == q->rear)
{
return SUCCESS;
}
Node *p = q->front->next;
while (p)
{
q->front->next = p->next;
free(p);
p = q->front->next;
}
q->rear = q->front;
return SUCCESS;
}
int DestroyQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
ClearQueue(q);
free(q->front);
q->front = q->rear = NULL;
return SUCCESS;
}
queue.h
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
int InitQueue(Qu *q)
{
Node *p = (Node *)malloc(sizeof(Node)); //申请头结点
if (NULL == p)
{
return FAILURE;
}
p->next = NULL; //空队,没有下一个结点
q->front = q->rear = p;
return SUCCESS;
}
int EnterQueue(Qu *q, int e)
{
if (NULL == q) //入参判断
{
return FAILURE;
}
if (q->rear == NULL)
{
return FAILURE;
}
Node *p = (Node *)malloc(sizeof(Node));
if (NULL == p)
{
return FAILURE;
}
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return SUCCESS;
}
int LengthQueue(Qu q)
{
int len = 0;
Node *p = q.front->next;
while (p)
{
len++;
p = p->next;
}
return len;
}
int GetFront(Qu q)
{
//如果是空队,没有队头元素,返回失败
if (q.front == q.rear)
{
return FAILURE;
}
return q.front->next->data;
}
int DelQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
if (q->front == q->rear)
{
return FAILURE;
}
Node *p = q->front->next; //保存第一个结点
int e = p->data;
q->front->next = p->next;
free(p);
if (q->rear == p)
{
q->rear = q->front;
}
return e;
}
int ClearQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
if (q->front == q->rear)
{
return SUCCESS;
}
Node *p = q->front->next;
while (p)
{
q->front->next = p->next;
free(p);
p = q->front->next;
}
q->rear = q->front;
return SUCCESS;
}
int DestroyQueue(Qu *q)
{
if (NULL == q)
{
return FAILURE;
}
ClearQueue(q);
free(q->front);
q->front = q->rear = NULL;
return SUCCESS;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
int main(void)
{
Qu queue; //创建一个队列
int ret, i;
ret = InitQueue(&queue);
if (ret == FAILURE) //返回值判断
{
printf("Init Failure!\n");
exit(1);
}
else if (ret == SUCCESS)
{
printf("Init Success!\n");
}
for (i = 0; i < 10; i++)
{
ret = EnterQueue(&queue,i+1);
if (ret == FAILURE)
{
printf("Enter failure!\n");
}
else if (ret == SUCCESS)
{
printf("Enter %d success!\n", i + 1);
}
}
//获取队列的长度
int length = LengthQueue(queue);
printf("Length is %d!\n", length);
//获取队头元素
ret = GetFront(queue);
if (ret == FAILURE)
{
printf("Get front failure!\n");
}
else
{
printf("Front is %d!\n", ret);
}
for (i = 0; i < 3; i++)
{
ret = DelQueue(&queue);
if (ret == FAILURE)
{
printf("Delete failure!\n");
}
else
{
printf("Delete %d success!\n", ret);
}
}
ret = ClearQueue(&queue);
if (ret == FAILURE)
{
printf("Clear failure!\n");
}
else
{
printf("Clear Success!\n");
}
ret = DestroyQueue(&queue);
if (ret == SUCCESS)
{
printf("Destroy success!\n");
}
else if (ret == FAILURE)
{
printf("Destroy failure!\n");
}
for (i = 0; i < 10; i++)
{
ret = EnterQueue(&queue, i + 1);
if (ret == FAILURE)
{
printf("Enter failure!\n");
}
else if (ret == SUCCESS)
{
printf("Enter %d success!\n", i + 1);
}
}
return 0;
}
今日开发中出现的问题汇总
- 链表理解起来有些难度。
今日开发收获
- 学习了链表
- 熟悉了C语言各种概念。
自我评价
基本完成任务目标,课后仍需继续努力。