用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx

上传人:b****8 文档编号:9696471 上传时间:2023-05-20 格式:DOCX 页数:14 大小:19.88KB
下载 相关 举报
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第1页
第1页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第2页
第2页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第3页
第3页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第4页
第4页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第5页
第5页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第6页
第6页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第7页
第7页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第8页
第8页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第9页
第9页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第10页
第10页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第11页
第11页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第12页
第12页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第13页
第13页 / 共14页
用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx

《用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx》由会员分享,可在线阅读,更多相关《用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx(14页珍藏版)》请在冰点文库上搜索。

用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰.docx

用无序循环单链表格完成优先级队列抽象大数据类型1405110002王一杰

轻工大学

数学与计算机学院

数据结构课程设计

设计题目:

用无序循环单链表完成优先级队列抽象数据类型

 

专业计算机大类

班级计算机1404班

学号1405110002

姓名王一杰

指导教师

 

2015年12月31日

数 据 结 构 实验报告成绩_____

学号

1405110002

王一杰

授课教师

专业

计算机大类

实验报告递交日期

2015.1.5

实验题目

用无序循环单链表完成优先级队列抽象数据类型。

1.需求分析

1.程序的实现功能:

基本操作:

(1)Make:

构造空的优先级队列。

(2)Size:

返回优先队列中元素个数。

(3)IsEmpty:

如果优先级队列是否为空则返回真,否则返回假。

(4)Insert:

插入一个数据元素到优先级队列。

(5)FindMax:

查找、返回优先级最高的元素

(6)DeleteMax:

删除、返回优先级最高的元素。

编写函数:

(1)建立循环队列,返回尾指针函数linkqueue*create()

(2)X入队,返回尾指针函数linkqueue*enqueue(linkqueue*rear,intx)

(3)出队返回队头元素函数linkqueue*outqueue(linkqueue*rear)

(4)显示队列元素函数voidlist(linkqueue*rear)

(5)删除队列函数linkqueue*del(linkqueue*rear)

(6)主函数完成功能:

a).调用rear=creat();

b).调用list(rear);

c).输入x值;

d).调用enqueue(rear,x);

e).调用list(rear);

f).调用outqueue(rear)

g).调用list(rear);

h)调用del(rear)i)list(rear).

2.从文件读入或随机产生作业的信息,作业的信息包括作业id(一个6字符字符串)、作业长度(一个表示秒数的int)、作业优先级。

每一作业同样会被赋予一个到达编号(作业号)。

该模拟程序应该输出作业id、作业优先级、作业长度以及完成时间(相对于从时间0开始的模拟程序而言的,可以设一个全局变量模拟)。

二.主要算法的算法思想.

1.构造空的优先级队列.

2.返回优先级队列中的元素个数.

3.如果优先级队列为空则返回真,否则返回假。

4.将队列重置为空.

5.插入一个数据元素到优先级队列.

6.查找、返回优先级最高的元素.

7.删除、返回优先级最高的元素.

三.设计:

1.#include

#include

#include

#include

typedefintStatus;

typedefstruct{

unsignedintnumber;

unsignedintpriority;

}job;

typedefstructlnode{

job*data;

structlnode*next;

}LNode,*LinkList;

 

2.参数表(列出所有的符号常量与全局变量)

参数名

数据传递方式

数据容

传递

所属函数

NULL

符号常量

宏定义

0

所有函数

3.列出每个函数的函数声明、函数作用、函数值、形参容与形式、主要算法步骤等

1).构造空的优先级队列

StatusMake(LinkList&L)

{

if(L)return-1;

L=(LNode*)malloc(sizeof(LNode));

L->data=NULL;

L->next=L;

return0;

}

2).返回优先级队列中的元素个数。

StatusSize(LinkListL)

{

inti;

LNode*p;

for(i=0,p=L;p->next!

=L;p=p->next,i++);

returni;

}

3).如果优先级队列为空则返回真,否则返回假。

StatusIsEmpty(LinkListL)

{

return(L->next==L);

}

 

4).将队列重置为空。

voidClear(LinkListL)

{

LNode*p,*ptmp;

for(p=L->next;p!

=L;)

{

ptmp=p;

p=p->next;

free(ptmp->data);

free(ptmp);

}

L->next=L;

}

5).//插入一个数据元素到优先级队列。

StatusInsert(LinkListL,job*data)

{

LNode*ptmp;

ptmp=(LNode*)malloc(sizeof(LNode));

if(!

ptmp)return-2;

ptmp->data=(job*)malloc(sizeof(job));

if(!

ptmp->data){free(ptmp);return-2;}

memcpy(ptmp->data,data,sizeof(job));

ptmp->next=L->next;

L->next=ptmp;

return0;

}

6).查找、返回优先级最高的元素。

job*FindMax(LinkListL)

{

LNode*p;

p=L->next;

if(p==L)returnNULL;

LNode*p0;

for(p0=p;p0!

=L;p0=p0->next)

if(p0->data->prioritydata->priority||p0->data->priority==p->data->priority&&p0->data->numberdata->number)

p=p0;

returnp->data;

}

7).//删除、返回优先级最高的元素。

job*DeleteMax(LinkListL)

{

LNode*p;

job*pD;

p=L->next;

if(p==L)returnNULL;

LNode*p0;

LNode*p1;

for(p1=p0=L;p0->next!

=L;p0=p0->next)

if(p0->next->data->prioritydata->priority||p0->next->data->priority==p->data->priority&&p0->next->data->numberdata->number)

{p=p0->next;p1=p0;}

p1->next=p1->next->next;

pD=p->data;

free(p);

returnpD;

}

 

四.调试分析:

1.调试中出现的问题,解决的办法

1)没有把头结点表示出来,不知道把最高优先级怎么表示。

2).写list函数时,没有注意到循环队列,陷入死循环。

2.每个函数的时、空复杂性分析

1).linkqueue*create()建单链表函数

T(n)=O(n),S(n)=O(n);

2).linkqueue*enqueue(linkqueue*rear,intx)输出队列函数

T(n)=O

(1),S(n)=O

(1);

3).linkqueue*outqueue(linkqueue*rear)入队函数

T(n)=O

(1),S(n)=O

(1);

4).voidlist(linkqueue*rear)出队函数

T(n)=O(n),S(n)=O

(1);

5).linkqueue*del(linkqueue*rear)删除队列

T(n)=O

(1),S(n)=O

(1);

6).Intmain()主函数

T(n)=O(n),S(n)=O(n).

3.改进设想,经验体会

在优先级队列中无法找出最高优先级。

五.使用说明:

如何使用你编制的程序、操作步骤.

输入R---删除,取出优先级最高的作业并从队列中删除之

输入A---添加新作业

输入L---列举全部作业

输入Q---退出

六.测试结果:

输入输出数据容:

窗口显示如下:

(下划线部分为输入部分,其余为输出部分)

测试数据固定输出:

用无序循环单链表完成优先级队列抽象数据类型

王一杰

班级计算机大类1404班

学号1405110002

日期2015年12月30日

输入R:

输入A:

输入Q:

输入L:

7.源代码:

#include

#include

#include

#include

typedefintStatus;

typedefstruct{

unsignedintnumber;

unsignedintpriority;

}job;

typedefstructlnode{

job*data;

structlnode*next;

}LNode,*LinkList;

//构造空的优先级队列。

StatusMake(LinkList&L)

{

if(L)return-1;

L=(LNode*)malloc(sizeof(LNode));

L->data=NULL;

L->next=L;

return0;

}

//返回优先级队列中的元素个数。

StatusSize(LinkListL)

{

inti;

LNode*p;

for(i=0,p=L;p->next!

=L;p=p->next,i++);

returni;

}

//如果优先级队列为空则返回真,否则返回假。

StatusIsEmpty(LinkListL)

{

return(L->next==L);

}

//将队列重置为空。

voidClear(LinkListL)

{

LNode*p,*ptmp;

for(p=L->next;p!

=L;)

{

ptmp=p;

p=p->next;

free(ptmp->data);

free(ptmp);

}

L->next=L;

}

//插入一个数据元素到优先级队列。

StatusInsert(LinkListL,job*data)

{

LNode*ptmp;

ptmp=(LNode*)malloc(sizeof(LNode));

if(!

ptmp)return-2;

ptmp->data=(job*)malloc(sizeof(job));

if(!

ptmp->data){free(ptmp);return-2;}

memcpy(ptmp->data,data,sizeof(job));

ptmp->next=L->next;

L->next=ptmp;

return0;

}

//查找、返回优先级最高的元素。

job*FindMax(LinkListL)

{

LNode*p;

p=L->next;

if(p==L)returnNULL;

LNode*p0;

for(p0=p;p0!

=L;p0=p0->next)

if(p0->data->prioritydata->priority||p0->data->priority==p->data->priority&&p0->data->numberdata->number)

p=p0;

returnp->data;

}

//删除、返回优先级最高的元素。

job*DeleteMax(LinkListL)

{

LNode*p;

job*pD;

p=L->next;

if(p==L)returnNULL;

LNode*p0;

LNode*p1;

for(p1=p0=L;p0->next!

=L;p0=p0->next)

if(p0->next->data->prioritydata->priority||p0->next->data->priority==p->data->priority&&p0->next->data->numberdata->number)

{p=p0->next;p1=p0;}

p1->next=p1->next->next;

pD=p->data;

free(p);

returnpD;

}

intmain()

{

constchar*prtstr="----------------------";

job*pfindData,*premoveData,tmpData;

LNode*ptmp;

intSerialNum=0;

intc;

LinkListpHead=NULL;

pfindData=premoveData=NULL;

Make(pHead);

while

(1)

{

system("cls");

printf("用无序循环单链表完成优先级队列抽象数据类型\n");

printf("王一杰\n");

printf("班级计算机大类1404班\n");

printf("学号1405110002\n");

printf("日期2015年12月31日\n");

printf("%s选择菜单%s",prtstr,prtstr);

printf("\n\tR---删除,取出优先级最高的作业并从队列中删除之\n\tA---添加新作业\n\tL---列举全部作业\n\tQ---退出\n");

if(premoveData)

{

printf("\n\t\t最近取出的作业号:

%06d",premoveData->number);

}

else

{

printf("\n\n\n");

}

printf("请选择操作菜单:

");

fflush(stdin);

c=getchar();

if(c>='a'&&c<='z')c-=('a'-'A');

if(c!

='R'&&c!

='A'&&c!

='L'&&c!

='Q')continue;

fflush(stdin);

switch(c)

{

case'R':

if(premoveData)free(premoveData);

premoveData=DeleteMax(pHead);

continue;

case'A':

memset(&tmpData,0,sizeof(tmpData));

printf("增加新作业:

\n请输入作业优先级:

");scanf("%d",&tmpData.priority);

fflush(stdin);

tmpData.number=++SerialNum;

if(!

Insert(pHead,&tmpData))printf("插入成功\n");

elseprintf("插入失败\n");

break;

case'L':

printf("全部作业队列:

\n");

if(IsEmpty(pHead))

printf("当前作业队列为空\n");

for(ptmp=pHead->next;ptmp!

=pHead;ptmp=ptmp->next)

printf("\n作业号:

%06d优先级:

%d",ptmp->data->number,ptmp->data->priority);

break;

case'Q':

Clear(pHead);free(pHead);

if(premoveData)free(premoveData);

printf("Byebye");

exit(0);

}

printf("\n按回车键继续......");

fflush(stdin);

getchar();

}

return0;

}

源代码共106行

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2