locate函数实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验报告
题目:实现下述要求的Locate运算的函数
学生姓名杨晨雨
学生学号3014216050
学院名称计算机学院
专业计算机科学与技术
时间2015/11/08
目录
第一章、需求分析 (1)
第二章、概要设计 (2)
2.1抽象数据类型 (2)
2.2算法 (3)
2.3算法分析 (3)
第三章、详细设计 (5)
第四章、调试分析 (8)
第五章、测试分析 (9)
第六章、未来展望与思考 (11)
第一章需求分析
设有一个带表头结点的双向链表L,每个结点有4个数据成员:指向前驱结点的指针prior、指向后继结点的指针next、存放数据的成员data和访问频度freq。
所有结点的freq初始时都为0。
每当在链表上进行一次Locate (L, x)操作时,令元素值为x的结点的访问频度freq加1,并将该结点前移,链接到与它的访问频度相等的结点后面(如果该结点没有找到与它访问频度相等的结点,链接到表头后面结点),使得链表中所有结点,保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
要用到的程序块包括:双向链表的生成函数、locate函数.
第二章概要设计
2.1抽象数据类型设计
ADT List{
数据对象 D={ai|ai(-ElemSet, i=1,2,3,…,n, n>=0}
数据关系 R1={<ai-1,ai>|ai-1,ai(-D,i=1,2,…,n}
基本操作:
InitList(&L)
操作结果:构造一个新的线性表。
DestroyList(&L)
初始条件:线性表L已存在。
操作结果:销毁线性表L
ClearList(&L)
初始条件:线性表L已存在。
操作结果:将L重置为空表。
ListEmpty(L)
初始条件: 线性表L已存在。
操作结果:若L为空表,则返回TRUE,否则返回FALSE。
ListLength(L)
初始条件:线性表L已存在。
操作结果:返回L中元素个数。
GetElem(L, i, &e)
初始条件:线性表L已存在, 1<=i<=ListLength(L)。
操作结果:用e返回L中的第i个元素的值。
LocateElem(L, e, compare())
初始条件:线性表L已存在,compare()是数据元素判定的
函数。
操作结果:返回L中第一个与e满足关系compare()的数据
元素的位序。
若这样的元素不存在,则返回值为
零。
PriorElem(L, cur_e, &pre_e)
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是第一个,则用
pre_e返回她的前驱,否则操作失败,pre_e无定
义
NextElem(L,cur_e, &next_e)
初始条件:线性表L已存在。
操作结果:若cur_e是L的数据元素,且不是最后一个,则
用next_e返回他的后继,否则操作失败,next_ e
无定义。
ListInsert(&L, I, e)
初始条件:线性表L已存在,1<=i<=ListLength(L)+1。
操作结果:在L中第i个位置之前插入新元素e,L的长度
加1。
ListDelete(&L, i, &e)
初始条件:线性表L已存在且非空,1<=i<=ListLength(L)。
操作结果:删除L的第i个元素,用e返回其值,L的长度
减1。
ListTraverse(L, visit())
初始条件:线性表L已存在。
操作结果:依次对L的每个元素调用函数visit()。
一旦visit()
失败,则操作失败。
}ADT List
2.2算法
本题的算法包括两部分,一是建立双向不循环链表,二是链表中结点的定位和移动。
2.2.1建立双向链表:
采用带头结点的双向链表,如下为双向链表的结点定义:
struct Node{
DataType data;
int freq;
struct Node *prior;
struct Node *next;
}DuLNode
2.2.2 结点的定位和移动
先定位结点,然后频度加一,根据此结点的频度向前依次查询,将结点移动到相同频度结点的后面。
2.3 算法分析
表长为n,查询次数为x次。
时间复杂度为O(nx)。
第三章详细设计
源代码如下:
/*------------------------------------------------------------------
Josephus.cpp
The solution of the Joseph problem with a circular linked list
Version 2.0
Last Modify 2015/11/08
Copyright (c)2013 Hanna of Tianjin University School of Computer
Science and Technology
All rights reserved
------------------------------------------------------------------*/
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE = 100;
typedef struct Node{//结构类型和结构变量
int data;//数据域
int freq;
struct Node *prior;//前指针域
struct Node *next;//后指针
}DuLNode,*DuLinkList;
DuLinkList CreatCycList(int n)
{ //生成双向链表
DuLNode *p, *q;
q = (DuLNode*)malloc(sizeof(DuLNode));
q->next=q->prior= NULL;//创建一个空表
q->data=n;q->freq=0;
DuLinkList head=q;
int i;
for(i = 1; i<=n; i++)
{ //创建一个有n个结点的链表
p = (DuLNode*)malloc(sizeof(DuLNode));
//建立新节点
p -> data = i; //结点的数据域赋值为i
p->freq=0;
p -> next = NULL;//指针域赋值为空
q->next=p;
p->prior=q;
q=q->next;
}
return head;
}
void Locate( DuLinkList &L,int x) {int freq=0;
DuLNode *p,*current;
p=L->next;
for(int j=1;j<L->data;j++)
{
if(p->data==x) break;
p=p->next;
if(p!=L->next)
{
if(p->next==NULL)
{
p->freq++;
current=p;
p->prior->next=NULL;
}
else
{
p->freq++;
current=p;
p->prior->next=p->next;
p->next->prior=p->prior;
}
while(current->freq>p->freq) p=p->prior;
current->next=p->next;
p->next->prior=current;
p->next=current;
current->prior=p;
}
else
p->freq++;
}
int main()
{
int n,m;
printf("%s\n","Please input link list length:");
scanf("%d\n",&n);
printf("%s\n","The link list data are");
DuLinkList L= CreatCycList(int n);
for(int i=1;i<=n;i++)
printf("%s%d%s\n","The 1 node is",i,", its frequency is 0.");
printf("%s\n","Let's start to test Locate Function.<-1 means stopping input number>");
scanf ("%d\n",&m);
while( m!=-1)
{
Locate( L, m);
printf("%s","Please input number :");
scanf ("%d\n",&m);
}
printf("%s\n","After test,the link data are :");
DuLinkList *q;
q=L->next;
while(q->next!=NULL)
{
printf("%s%d%s%d\n","The 1 node is ",q->data,"its frequency is ",q->freq);
q=q->next;
}
printf("%s%d%s%d\n","The 1 node is ",q->data,"its frequency is ",q->freq);
system("PAUSE");
return 0;
}
}
第四章调试分析
第五章测试分析
测试了题目中给出的数据,得到正确结果
第六章未来展望与思考
通过实验,复习了链表的数据结构,熟悉了链表的建立算法。
第二道题相比于第一道题更加复杂,但是做起来更加熟练。
所以编程熟能生巧。