Compare commits

..

3 Commits

Author SHA1 Message Date
刘彩月 66680458fd Merge branch '刘梦琦'
1 year ago
刘彩月 8b4e8c60f1 1
1 year ago
刘梦琦 8baabc6757 刘梦琦
1 year ago

@ -151,38 +151,235 @@ Status QueueTraverse(LinkQueue Q);//遍历队列Q
# 3. 系统实现
说明所使用的语言、开发工具等。
介绍项目的文件结构,以及主要函数的功能。
语言:C语言
开发工具:VS Code
采用模块化设计,通过大量的函数实现,银行开门、客户进门、客户离开等功能进而统计一天内客户在银行逗留的平均时间
## 3.1 核心数据结构的实现
描述数据结构的实现方法。
可以配合程序代码加以说明。如:
首先通过有序链表,实现一部分功能如:先初始化有序表在第i个位置之前插入元素e删除链表中第一个结点并以q返回已知p指向线性链表中的一个结点返回p所指结点中元素的值等等。其次通过队列实现入队和出队。
```
struct LNode {
E data; // 数据元素
LNode *next; // 指向下一个结点的指针
};
typedef struct
{
int OccurTime;//事件发生时刻
int NType;//事件类型0表示到达事件1-4表示四个窗口的离开事件
}Event, ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * LinkList;
typedef LinkList EventList;
typedef struct
{
int ArrivalTime;//到达时刻
int Duration;//办理事务所需事件
}QElemType;
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode, * QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
EventList ev;//事件表
Event en;//事件
LinkQueue q[5];//四个客户队列
QElemType customer;//客户记录
int TotalTime, CustomerNum, CloseTime;
```
链表
【1】通过一个个指针将节点串起来
【2】对于元素的随机访问需要使用计数器来访问指定的元素并且只能从头节点开始访问每访问一个节点计数器加1直到给定的“下标”
【3】增加元素和删除元素的效率很高
队列
【1】先进先出
【2】线程池中的线程就是从任务队列中取出任务
## 3.2 核心算法的实现
```
Status InitList(LinkList& L)//链表初始化
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
{
exit(OVERFLOW);
}
L->next = NULL;
return OK;
}
对该数据结构的特点进行分析。
Status ListInsert_L(LinkList& L, int i, ElemType e)//在第i个位置之前插入元素e
{
LinkList p = L;
int j = 0;
while (p && j < i - 1)//i-1,
{
p = p->next;
j++;
}
if (!p || j > i - 1)
{
return ERROR;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
if (!s)
{
exit(OVERFLOW);
}
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListEmpty(LinkList L)//判断链表是否为空
//空表头指针和头结点仍然存在但头结点指向NULL
{
if (L->next)
{
return FALSE;
}
else
{
return TRUE;
}
}
Status DelFirst(LinkList L, LNode*& q)//删除链表中第一个结点并以q返回
{
if (!L->next)
{
return ERROR;
}
q = L->next;
L->next = q->next;
return OK;
}
LNode* GetHead(LinkList L)//返回链表头结点
{
return L;
}
ElemType GetCurElem(LNode* p)//已知p指向线性链表中的一个结点返回p所指结点中元素的值
{
return p->data;
}
## 3.2 核心算法的实现
描述算法的实现方法。
可以配合程序代码加以说明。如:
void PrintEventList()//打印事件链表 
{
printf("Current Eventlist is:\n");
ListTraverse(ev);
}
Status ListTraverse(LinkList& L) //遍历链表  
{
LNode* p = L->next;
if (!p) {
printf("List is empty.\n");
return ERROR;
}
```
// 冒泡排序
void bubble_sort(T a[], int n)
while (p != NULL) {
printf("OccurTime:%d,Event Type:%d\n", p->data.OccurTime, p->data.NType);
p = p->next;
}
printf("\n");
return OK;
}
Status InitQueue(LinkQueue& Q)//链队列的初始化
{
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q.front)
{
exit(OVERFLOW);
}
Q.front->next = NULL;
return OK;
}
Status EnQueue(LinkQueue& Q, QElemType e)//入队
{
QNode* p = (QueuePtr)malloc(sizeof(QNode));
if (!p)
{
exit(OVERFLOW);
}
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue& Q, QElemType& e)//出队
{
if (Q.front == Q.rear)
{
return ERROR;
}
QNode* p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)//注意这里要考虑到,当队列中最后一个元素被删后,队列尾指针也丢失了,因此需对队尾指针重新复制(指向头结点)
{
Q.rear = Q.front;
}
free(p);
return OK;
}
int QueueLength(LinkQueue Q)//返回队列的长度
{
int count = 0;
QNode* p = Q.front->next;
while (p) {
p = p->next;
count++;
}
return count;
}
Status GetHead(LinkQueue Q, QElemType& e)//获取队头元素
{
if (Q.front == Q.rear)
{ return ERROR;}
e = Q.front->next->data;
}
Status QueueEmpty(LinkQueue Q)//判断队列是否为空
{
if (Q.front == Q.rear)
{
......
return TRUE;
}
````
return FALSE;
}
void PrintQueue()//打印队列
{
//打印当前队列  
int i;
for (i = 1; i <= 4; i++) {
printf("窗口 %d 有 %d 个客户:", i, QueueLength(q[i]));
QueueTraverse(q[i]);
}
printf("\n");
}
Status QueueTraverse(LinkQueue Q)//遍历队列Q  
{
QNode* p = Q.front->next;
if (!p) {
printf("--Is empty.\n");
return ERROR;
}
while (p) {
printf("(到达时刻 %d min 办理业务需要花费 %d min) ", p->data.ArrivalTime, p->data.Duration);
p = p->next;
}
printf("\n");
return OK;
}
```
对该算法的时间和空间复杂度进行分析。
# 4.系统测试
@ -335,6 +532,7 @@ The Average Time is 15.285714
成员2金雨佳
成员3赵亚璇在项目的前期准备阶段大家一起讨论跟随课程的推进使用课程中学到的各种知识将整个项目的架构逐渐搭建起来层次和逻辑也越来越清晰。在这一阶段时间学习的过程虽然不容易但确实学到了不少实用的知识。在运用相关框架进行实践开发的过程中也遇到了各种各样的问题通过查找资料和不断的尝试也都逐一解决了这一过程自己的能力也得到了锻炼有不错的成就感。
成员4刘梦琦
通过这次数据结构实训,让我意识到了团队协作的重要性,运用数据结构的知识模拟银行系统,更加熟练地掌握单链表和队列的应用,将所学的知识用在实践项目上时我此次实训的最大收获,在未来的生活中,我要努力学习技术,将知识联系到实际生活当中,把所学用到所用。
# 参考文献

Loading…
Cancel
Save