首页 范文大全 古典文学 职场知识 中国文学 公文书信 外国名著 寓言童话 百家讲坛 散文/诗歌 美文欣赏 礼仪知识 民俗风情
  • 工作总结
  • 工作计划
  • 心得体会
  • 竞聘演讲
  • 会议发言
  • 爱国演讲
  • 就职演说
  • 开业开幕
  • 思想学习
  • 征文演讲
  • 经验材料
  • 述职报告
  • 调研报告
  • 工作汇报
  • 年终总结
  • 申报材料
  • 学习体会
  • 企划方案
  • 活动方案
  • 技巧经验
  • 模板范例
  • 思想宣传
  • 经济工作
  • 工作报告
  • 组织人事
  • 反腐倡廉
  • 慰问贺电
  • 先进事迹
  • 思想汇报
  • 入党申请书
  • 党会发言
  • 先进性教育
  • 入团申请书
  • 个人简历
  • 演讲稿
  • 调查报告
  • 实习报告
  • 和谐社会
  • 观后感
  • 读后感
  • 作文范文
  • 自我鉴定
  • 讲话稿
  • 自查报告
  • 数据结构实验

    时间:2021-01-06 15:05:45 来源:蒲公英阅读网 本文已影响 蒲公英阅读网手机站

    相关热词搜索:数据结构 实验

     实验一、约瑟夫环问题 实验目的

      1)掌握线性表的存储结构; 2)学会利用线性表解决实际问题。

     实验内容

      编号为 1,2,┅,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个密码 m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 顺序报数,如此下去,直到所有人全部出列为止。

     实验要求

      1)建立模型模拟约瑟夫环问题,确定存储结构,用单链表实现;

      2)输入 m 的初值,人数 n,输入每个人的密码;出圈的顺序请依次输出。

     数据结构分析

      由于约瑟夫环问题本身具有循环性质,考虑采用循环链表。链表的每个结点有两个域,分别是序号和其所持有的密码。建立单链表后,根据算法找到相应的结点,对找到的结点进行输出,并把该结点从链表中删除,再释放该结点空间。

     实验程序

     #include <malloc.h>

     // 实验 数据: 总人数:6

     初始密码:18

     个人密码:2,1,4,2,4,8

     #include <stdio.h>

     //

     出圈顺序:6,3,2,4,1,5 typedef struct LNode {int id,password; struct LNode *next;} LNode, *LinkList; void main() { int n,m,e,i,Flag=1; LinkList L,p,q,s;

     printf(“请输入总人数 n:\n”);

      scanf(“%d”,&n);

     printf(“请输入初始密码 m:\n”);

     scanf(“%d”,&m);

     for(i=1;i<=n;i++)

      //

     创建循环单链表

     {

     s=(LinkList)malloc(sizeof(struct LNode));

     // 申请存放一个结点的空间 if (i==1) {L=s; p=s;}

     // i=1 创建结点,i>1 链接结点 printf(“请输入第%d 个人的密码:\n”,i); scanf(“%d”,&e); s->id=i; s->passwoed=e; p->next=s; p=s; } s->next=L;

     // 构成循环链表

      p=q=L;

      //约瑟夫环问题----报数,依次出列

      while(Flag)

      { printf(“出圈顺序依次为:\n”); for(i=1;i<m;i++) { q=p; p=p->next;} //搜索第 m 个人 if (p==q) Flag=0;

     //表示全部查找完毕 s=p;

      // 找到第 m 个人出列 q->next=p->next; p=p->next;

     // 指出下一次第一个要报数的人 m=s->password;

     // 更新 m 值 printf(“第%d 个人出列,密码:%d\n”,s->id,s->password); free(s);

     }}

     实验二、数制转换和汉诺塔 实验目的

      1)掌握栈的逻辑结构和物理存储结构; 2)学会利用栈的特点解决实际问题。

     实验内容

      1)将一个非负的十进制数 n 转换成 d(范围 2~36)进制数。

      2)实现 m(不超过 10)层的三柱汉诺塔移动方案。

     实验要求

      1)输入 n 和 d,确定存储结构,输出 d 进制数,大于 10 的数,用对应的英文字母表示;

      2)输入 m 值,输出汉诺塔移动步骤。

     数据结构分析

      上述两个问题,可以利用栈的后进先出特性解决,用递归法来编写程序。

     实验程序

      #include <stdio.h>

      void conversion(int n,int d)

     // 十进制转换为 d 进制

      { if (n<=0) return; conversion(n/d,d); if (n%d <10) printf(“%d”,n%d); else printf(“%c”, (char)(n%d+55));

      }

     void main() { int n,d ;

     printf (“请输入一个非负十进制数\n”);

     scanf(“%d”,&n); printf (“请输入需要转换的进制数\n”); scanf(“%d”,&d); printf (“十进制%d 转换%d 进制的结果是:”,n,d); conversion(n,d); } _______________________________________________________________

      #include <stdio.h>

      void hanoi(int m,char x,char y,char z)

     // 汉诺塔,将塔座 x 上 m 个圆盘按规则, {

      // 通过塔座 y,搬动到塔座 z。

     if (n==1) printf(“把%d 号圆盘从塔座%c 移到塔座%c\n”,1,x,z); else { hanoi(n-1,x,z,y); printf(“把%d 号圆盘从塔座%c 移到塔座%c\n”,n,x,z); hanoi(n-1,y,x,z);} } void main() { int m;

     char x=„X‟, y=„Y‟, z=„Z‟ ;

     printf (“请输入汉诺塔圆盘数目,不超过 10\n”);

     scanf(“%d”,&m); hanoi(m,x,y,z); }

     实验三、串的模式匹配 实验 目的

      1)熟悉和理解串的逻辑结构和物理存储结构; 2)学会利用 KMP 算法验证字符串的模式匹配。

     实验内容

      输入主串 S 和模式串 T,用堆分配存储方式存储串,并将串 S 和串 T 输出;然后计算模式串 T 的 next 函数,并将计算结果输出;最后进行模式匹配,输出从主串 S 的第 1 个字符起,主串 S 和模式串 T 首次匹配的字符位置。

     实验要求

      1)输入主串 S 和模式串 T;

      2)采用克努特—莫里斯—普拉特(简称 KMP 算法),实现模式匹配。

     数据结构分析 当主串 S 中第 i 个字符与模式串 T 中第 j 个字符“失配”时,考虑主串中第 i 个字符(i指针不回溯)应与模式串 T 中哪个字符比较。通过对模式匹配过程特点的分析,对模式串 T构造 next 函数,设模式串中某个字符的 next 函数值为 k,则当“失配”发生时,匹配仅需从模式中第 k 个字符与主串 S 中第 i 个字符比较起继续进行。

     实验程序 #include <stdio.h> #include <string.h> int Index_KMP(char *S, char *T, int pos) { int i,j,next[20];

      i=0; j=-1; next[0]=0;

      while(i<strlen(T))

      { if (j==-1 || T[i]==T[j]) { i++; j++; if (T[i]==T[j]) next[i]=next[j]; else next[i]=j; } else j=next[j];

      }

      i=pos; j=0;

      while(S[i] && T[j])

      { if (j==-1 || S[i]==T[j]) { i++; j++; }

      // 继续比较后续字符 else j=next[j];

     // 模式串向右移动 } if (j>strlen(T)) return i-strlen(T); else return -1;

     // 匹配成功,返回位置;否则返回-1 } void main() { char S[100],T[20]; int pos; printf(“请输入主串 S:\n”);

      gets(S); printf(“请输入模式串 T:”);

     gets(T); printf(“请输入起始位置:”);

     scanf(“%d”,&pos); printf(“返回值是:%d\n”,Index_KMP(S,T,pos)); }

    • 范文大全
    • 职场知识
    • 精美散文
    • 名著
    • 讲坛
    • 诗歌
    • 礼仪知识