数据结构实验最全 顺序表的操作及其应用.doc_第1页
数据结构实验最全 顺序表的操作及其应用.doc_第2页
数据结构实验最全 顺序表的操作及其应用.doc_第3页
数据结构实验最全 顺序表的操作及其应用.doc_第4页
数据结构实验最全 顺序表的操作及其应用.doc_第5页
免费预览已结束,剩余39页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验1 顺序表的操作及其应用一、实验目的 1)掌握线性表的顺序存储结构;2)熟练掌握顺序表基本算法的实现;3)掌握利用线性表数据结构解决实际问题的方法和基本技巧;4)按照实验题目要求独立正确地完成实验内容二、实验内容要求:数据元素类型ElemType 取整型int 或者char。顺序存储实现如下算法:1)创建一顺序表;2)输出该顺序表;3)在顺序表中查找第i 个元素,并返回其值;4)在顺序表中第i 个元素之前插入一已知元素;5)在顺序表中删除第i 个元素;6)实现顺序表的合并。(选做) 源程序:/A Sequential List顺序表#include #include #include #include #include #include #define InitSize 100 /线性表存储空间的初始分配量#define ListIncrement 10 /线性表存储空间的分配增量typedef int ElemType;typedef struct ElemType *elem; int length; int listsize;SqList;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;Status InitList(SqList &L) /初始化 L.elem=(ElemType *)malloc(InitSize*sizeof(ElemType); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=InitSize; return OK; /求表长int ListLength(SqList &L) return L.length;/输入元素int DataInput(SqList &L) int i=1,j=1; printf(输入数据后,按“0”结束输入n); while(j) scanf(%d,&j); if(j!=0) L.elemi=j; L.length+; i+; if(iInitSize) break; return FALSE;/输出顺序表Status ListTraverse(SqList L) ElemType *p; int i; p=L.elem; for(i=0;iL.length;i+) printf(%d ,*p+); printf(n); return OK;/查找元素Status GetElem(SqList L,int i,ElemType &e) if(iL.length) exit(ERROR); e=L.elemi-1; return OK;/插入元素Status ListInsert(SqList &L,int i,ElemType e) ElemType *newbase,*q,*p; if(iL.length+1) return ERROR; if(L.length=L.listsize) newbase=(ElemType *) realloc(L.elem,(L.listsize+ListIncrement)*sizeof(ElemType); if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize=L.listsize+ListIncrement; q=&(L.elemi-1); for(p=&(L.elemL.length-1);p=q;-p) *(p+1)=*p; *q=e; +L.length; return OK;/删除元素Status ListDeletSq(SqList &L,int i,ElemType &e) ElemType *p,*q; if(iL.length) return ERROR; p=&(L.elemi-1); e=*p; q=L.elem+L.length-1; for(+p;p=q;+p) *(p-1)=*p; -L.length; return OK;/主函数int main() SqList L; ElemType e; char ch; int t; while(1) system(cls); printf(t-MENU-n); printf(t|1.创建一顺序表 |n); printf(t|2.输入数据 |n); printf(t|3.输出顺序表 |n); printf(t|4.查找表中元素 |n); printf(t|5.于表中插入元素 |n); printf(t|6.删除表中元素 |n); printf(t|7.退出 |n); printf(t|-n); fflush(stdin); ch=getchar(); if(ch=7) break; switch(ch) case 1: InitList(L); printf(初始化顺序表成功!n); printf(按任何键继续操作n); getch(); break; case 2:DataInput(L); printf(数据输入成功!n); printf(按任何键继续操作n); getch(); break; case 3:ListTraverse(L); getch(); break; case 4:printf(你查找是第几个元素:); fflush(stdin); scanf(%d,&t); GetElem(L,t,e); printf(你查找的元素是:%dn,e); printf(按任何键继续操作n); getch(); break; case 5:printf(输入你要插入的元素:); scanf(%d,&e); ListInsert(L,t,e); printf(成功插入!n);printf(按任何键继续操作n); getch(); break; case 6:printf(你想删除第几个数据:); scanf(%d,&t); ListDeletSq(L,t,e); printf(成功删除!n); printf(按任何键继续操作n); getch(); break; default:break; return FALSE;运行截图: 主菜单:1. 创建顺序表;2. 输入数据:3. 插入数据:三、实验总结: 问题:1. 刚开始接触数据结构时,完全不知道这门课程是学什么的,一脸茫然,通过反复看书,最后逐渐明白了其中的含义。2. 有些c语言的函数和c+语言函数不同。3. 函数和指针的知识还不够好,不够牢固。心得体会; 数据结构是一门重要的课程,万事开头难,刚开始学的时候是很难的,需要自己反复地思考和阅览书籍,才能解开一个个矛盾。C语言是很基础的,数据结构要想学好,c语言的最基本,特别是要学好里面的函数和指针知识,因为数据结构里面很多都是用到指针和函数的。 实验二 链表的操作及其应用一、实验目的了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在Turbo C实现以上操作更好的了解书本上的内容并体会线性表的两种存储结构的区别。二、实验内容 单链表的插入算法 单链表的删除算法 循环链表的插入和删除算法(选做)源程序:#include #include #include #include typedef int ElemType;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef struct LNodeElemType data;struct LNode *next;LNode,*LinkList;Status CreateList(LinkList &L,int n)/ 创建链表 L=(LinkList)malloc(sizeof(LNode);/生成带头结点的链表 LinkList head,p; int i; if(!L) printf(创建失败!); return FALSE; L-next=NULL; head=L; for(i=0;idata);/输入新结点值p-next=NULL;/尾插法,插入新结点head-next=p;head=p; return TRUE;Status GetElem_L(LinkList L,int i,ElemType &e) int j=1; LinkList p; p=L-next;/使p指向第一个结点 while(p&jnext; /后移 +j; if(!p|ji)/第i个元素不存在 printf(取元素失败!); return ERROR; e=p-data;/取第i个元素 return OK; Status ListInsert_L(LinkList &L,int i,ElemType e)/在带头结点的单链表L中的第i个位置之前插入元素e LinkList p,s;p=L; int j=0; while(p&jnext; +j; if(!p|ji-1) printf(插入失败!); return ERROR; s=(LinkList)malloc(sizeof(LNode);/生成新结点指向要插入的元素 s-data=e; s-next=p-next; p-next=s; return OK;Status ListDelete_L(LinkList L,int i,ElemType &e)/在带头结点的单链表L中,删除第i个元素,并由e返回其值 LinkList p,q; int j=0; p=L; while(p-next&jnext; +j; if(!p|ji-1) printf(删除元素失败!); return ERROR; /删除位置不合理 q=p-next; /删除并释放结点 p-next=q-next; e=q-data; free(q); return OK;Status OutputList(LinkList L) LinkList p;for(p=L-next;p!=NULL;p=p-next)printf(%4d,p-data);printf(n);return OK;main() char ch; int n,i; int e; LinkList L; while(1) system(cls); printf(ttt-MENU-n); printf(ttt|1.创建链表 |n); printf(ttt|2.输出链表 |n); printf(ttt|3.插入元素 |n); printf(ttt|4.删除元素 |n); printf(ttt|5.退出 |n); printf(ttt|-|n); ch=getchar(); if(ch=5) break; switch(ch) case 1: printf(请输入你要创建的结点数:); scanf(%d,&n);printf(每输入一个值后按ENTER继续)n);CreateList(L,n);printf(创建成功!n);break; case 2:printf(单链表的值是:); OutputList(L); getch(); break; case 3:printf(链表是:); OutputList(L); printf(请输入你要在第几个元素前插入元素:); scanf(%d,&i); printf(请输入你要插入的元素值:); scanf(%d,&e); ListInsert_L(L,i,e); printf(插入成功!n); printf(新单链表是:); OutputList(L); getch(); break; case 4:printf(链表是:); OutputList(L); printf(你要删除第几个元素:); scanf(%d,&i); ListDelete_L(L,i,e); printf(删除成功!n); printf(新单链表是:); OutputList(L); getch(); break; default:break; getch(); return OK;运行截图:主菜单: 1. 创建链表:2. 输出链表:3. 插入元素:4. 删除链表:三、实验总结:问题:1. 创建链表时,运用前插法,使得最后输出时是反过来输出的;2. 在调用函数ListInsert_L(L,i,e);时忘记写输入e的语句scanf(%d,&e); (就是要插入的元素),使得在最后输出了一个负数或者说是乱码; 解决方法:1.通过看书和上网学到了尾插法,就是说尾插法的作用是使得最后输出时的数值是按照输入的顺序输出的;3. 第二个问题的解决方法是最后加上了scanf(%d,&e);这个语句,这样才不会出现乱码,输出如我所愿; 心得体会:通过对实验一的学习后,我对数据结构有了更深刻的认识,使得我在做实验的过程中速度加快了很多,掌握了各种函数的应用,能够更深刻地了解单链表的操作及其应用。 实验三 栈的操作及其应用一、实验目的 了解栈的概念、栈的特性、在两种存储结构上如何实现栈的基本操作以及栈在程序设计中的应用。通过在Turbo C中实现顺序栈的插入和删除加深理解顺序栈的意义。二、实验内容 顺序栈的进栈、出栈算法 链式栈的进栈、出栈算法(选做)源程序code:#include #include #include typedef int selemtype;#define chushi 100#define zengliang 10#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef struct selemtype *base;selemtype *top;int stacksize;sqstack;Status initstack(sqstack &s) /初始化栈,构造一个空栈; s.base=(selemtype *)malloc(chushi* sizeof(selemtype); if(!s.base) printf(存储分配失败n!); return FALSE; s.top=s.base; s.stacksize=chushi; return TRUE;Status gettop(sqstack s,selemtype &e)/取栈顶元素if(s.top=s.base)printf(栈为空!n);return FALSE;e=*(s.top-1);return TRUE;Status push(sqstack &s,selemtype e)/插入元素 进栈if(s.top-s.base=s.stacksize)/栈满s.base=(selemtype *)realloc(s.base,(s.stacksize+zengliang)*sizeof(selemtype);if(!s.base)printf(存储分配失败!);return FALSE;s.top=s.base+s.stacksize;s.stacksize+=zengliang; *s.top+=e;return TRUE;Status pop(sqstack &s,selemtype &e)/删除元素 出栈 if(s.top=s.base) printf(栈为空!); return FALSE; e=*-s.top; return TRUE;stacklength(sqstack &s) /初始条件:栈S已存在 操作结果:返回S的元素个数,即栈的长度 return s.top-s.base; Status output_stack(sqstack s) selemtype *p;int i;p=s.base;if(s.top=s.base) printf(栈不存在!n); return FALSE;for(i=0;istacklength(s);i+) printf(%4d,*p+);printf(n);return TRUE;Status clearstack(sqstack s) s.top=s.base; /s.top = s.base作为顺序栈空的标记 return OK; main() sqstack s;char ch;selemtype e;while(1) system(cls);printf(ttt-MENUE-n);printf(ttt|1.初始化顺序栈 |n);printf(ttt|2.输入栈的元素 |n);printf(ttt|3.输出顺序栈 |n);printf(ttt|4.进栈 |n);printf(ttt|5.出栈 |n);printf(ttt|6.清空顺序栈 |n); printf(ttt|7.退出 |n);printf(ttt|-|n);ch=getchar();if(ch=7)break;switch(ch) case 1:initstack(s) ; printf(初始化成功!n);printf(按任何键继续);getch();break; case 2:printf(顺序栈是:);output_stack(s); printf(请逐个输入数据)n你要输入的元素是:); scanf(%d,&e);push(s,e);printf(成功输入数据!n);printf(顺序栈是:);output_stack(s);printf(按任何键继续);getch();break; case 3:printf(顺序栈的值是:); output_stack(s);printf(按任何键继续);getch();break; case 4:printf(顺序栈的值是:); output_stack(s); printf(进栈的元素:); scanf(%d,&e); push(s,e);printf(进栈成功!n); printf(顺序栈的值是:); output_stack(s);printf(按任何键继续);getch();break; case 5:printf(顺序栈的值是:); output_stack(s); pop(s,e);printf(出栈成功!n); printf(现在顺序栈的值是:); output_stack(s);printf(按任何键继续);getch();break; case 6: clearstack(s); printf(清空完毕!n); printf(按任何键继续); break; return OK;运行截图: 主菜单: 1 初始化顺序表:2.进栈:3.出栈:三、实验总结: 问题:(1):在进栈和输入的时,忘记了判断栈是否为满栈;在输出和出栈时,忘记判断栈是否为空。(2):有时运用了太多的getch()函数,使得程序运行的有点慢; 实验心得: (1) :掌握了栈这种抽象数据类型的特点,并能在相应的应用任务中正确选用它; 总的来说,栈是操作受限的线性表,是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(botton); 栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构,因为它的修改是按后进先出的原则进行的。 (2): 加上这个实验,我已经学了线性表(顺序表,单链表)和栈,知道它们都是线性表,而且对以后的学习有很大的作用,可以说这是学习以后知识的总要基础; 实验四 队的操作及其应用 一.实验目的: 了解队列的概念、队列的特性、在两种存储结构上如何实现队列的基本操作以及队列在程序设计中的应用。通过在Turbo C中实现队列的插入和删除加深理解链队列和循环队列的意义。二、实验内容: (1) 链队列的进队和出队算法源程序code:#include #include #include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int QElemType;typedef struct QNode /结点类型 QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front;/队头指针 QueuePtr rear;/对尾指针LinkQueue;Status InitQueue(LinkQueue &Q)/初始化链队列 构造一个空队列 Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode); if(!Q.front) printf(存储分配失败!n); exit(OVERFLOW); Q.front-next=NULL; return OK;Status EnQueue(LinkQueue &Q,QElemType e)/在队尾插入元素e QNode *p; p=(QueuePtr)malloc(sizeof(QNode); if(!p) printf(存储分配失败!n); exit(OVERFLOW); p-data=e; p-next=NULL; Q.rear-next=p; Q.rear=p; return OK;Status DeQueue(LinkQueue Q,QElemType &e)/在队头删除元素QNode *p; if(Q.front=Q.rear) printf(队列为空!n); return ERROR; p=Q.front-next; e=p-data; Q.front-next=p-next; if(Q.rear=p) Q.rear=Q.front;/如果被删的是最后一个元素,则为指针丢失,因此为为指针重新赋值(指向头结点) free(p); return OK;Status OutputQueue(LinkQueue Q)/输出元素QNode *p; if(Q.front=Q.rear) printf(队列为空!n); return ERROR; for(p=Q.front-next;p!=NULL;p=p-next) printf(%4d,p-data); printf(n); return OK;Status DestroyQueue(LinkQueue &Q)/销毁队列 while(Q.front) Q.rear=Q.front-next; free(Q.front); Q.front=Q.rear; return OK; int main()/注意 char ch; QElemType e; LinkQueue Q; while(1) system(cls); printf(ttt-MENU-n); printf(ttt|1.创建链队列 |n); printf(ttt|2.输出链队列 |n); printf(ttt|3.进队(插入元素) |n); printf(ttt|4.出队(删除元素) |n); printf(ttt|5.销毁队列 |n); printf(ttt|6.退出 |n); printf(ttt|-|n); ch=getchar(); if(ch=6) break; switch(ch) case 1:InitQueue(Q); printf(创建成功!n); printf(请输入队列的初始数据(按0结束):n); while(e) scanf(%d,&e); if(!e)break; EnQueue(Q,e); printf(按任何键继续n); getch(); break; case 2:printf(此时链队列是:); OutputQueue(Q); printf(按任何键继续n); getch(); break; case 3:printf(此时链队列是:); OutputQueue(Q); printf(请输入进队的元素:); scanf(%d,&e); EnQueue(Q,e); printf(进队成功!n); printf(此时链队列是:); OutputQueue(Q); printf(按任何键继续n); getch(); break; case 4:printf(此时链队列是:); OutputQueue(Q); DeQueue(Q,e); printf(出队成功!n); printf(此时链队列是:); OutputQueue(Q); printf(按任何键继续n); getch(); break; case 5:DestroyQueue(Q); printf(销毁成功!n); printf(按任何键继续n); getch(); break; getch(); return OK;运行截图: 主菜单: 1. 2.创建队列3.输出原始队列4.进队5.出队6.销毁队列三、实验总结:问题:1.在写主函数面main()时,总是忘记写(); 2.声明*p时,原来用的是QueuePtr,但最后改成Qnode程序才正确;实验心得: (1) 掌握了队列这种抽象数据类型的特点,并能在相应的应用任务中正确选用它; 队列是操作受限的线性表,是只允许仅在表的一端进行插入,而在另一端进行删除操作的线性表。在队列中,允许插入的一端称为队尾(rear),允许删除的一端称为对头(front); 队列又称为先进先出(First In First Out)的线性表,简称FIFO结构。 因为它的修改是按先进先出的原则进行的。 (2) 掌握循环队列和链队列的基本操作实现算法,特别注意在循环队列中队满和队空的描述方法。 实验五 串的操作及其应用一、实验目的1)掌握队列的基本定义; 2)掌握循环队列基本操作的实现; 3)掌握利用栈和循环队列进行回文字符串的判定。二、实验内容:问题描述:本题目中的串编辑要求对串实现以下三种功能:插入:把一个字符串插入到给定串的指定位置删除:将串中某指定位置开始的若干字符从串中删除置换:用一串字符置换给定串中某指定位置开始的若干字符基本要求输入要求:首先输入功能标志符,表明要求实现何种功能,然后再输入有关数据输入C, 表示要求根据用户输入的以回车为结束符的字符串建立顺序串输入I,表示要求输入;然后输入插入的起始位置和要插入的字符串输入D,表示要求删除;然后输入删除的起始位置和删除长度输入R,表示要求置换 ;然后输入置换的起始位置、置换长度和将要换入的字符串输入E,结束串编辑。源程序code:#include #include #include #include /包含strlen(s) 返回s的长度,不包括结束符NULL,碰到第一个字符串结束符0停止扫面#define OK 1 #define ERROR 0 #define OVERFLOW -1typedef struct char *ch; /若是非空串,则按串长分配储存区,否则ch为NULL int length; /串长度HString; /建立串 生成一个其值等于chars的串Tint StrAssign(HString &T,char *chars) int len=strlen(chars); /求串chars的长度len if(T.ch) free(T.ch); /若T存在则释放T原有的空间 if(!len) /串常量chars为空 printf(所输入的字符串为空!n); T.ch=NULL; T.length=0; else if(!(T.ch=(char *)malloc(len+1)*sizeof(char) exit(0); strcpy(T.ch,chars); /调用系统原有函数复制字符串,给T赋值 T.length=len; return 0;/返回串S的长度 int StrLength(HString S)return S.length;/比较字符串/若ST,则返回值0,若S=T,则返回值=0,若ST,则返回值0int StrCompare(HString S,HString T) int i;for(i=0;iS.length&iT.length;+i) if(S.chi!=T.chi) return S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论