1、数据结构实验最全顺序表的操作及其应用 实验1 顺序表的操作及其应用一、实验目的 1)掌握线性表的顺序存储结构;2)熟练掌握顺序表基本算法的实现;3)掌握利用线性表数据结构解决实际问题的方法和基本技巧;4)按照实验题目要求独立正确地完成实验内容二、实验内容要求:数据元素类型ElemType 取整型int 或者char。顺序存储实现如下算法:1)创建一顺序表;2)输出该顺序表;3)在顺序表中查找第i 个元素,并返回其值;4)在顺序表中第i 个元素之前插入一已知元素;5)在顺序表中删除第i 个元素;6)实现顺序表的合并。(选做) 源程序:/A Sequential List顺序表#include #
2、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 -2typ
3、edef 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) scan
4、f(%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
5、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=&(
6、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; Elem
7、Type 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: Ini
8、tList(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()
9、; 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. 插入数据:三、实验总
10、结: 问题:1. 刚开始接触数据结构时,完全不知道这门课程是学什么的,一脸茫然,通过反复看书,最后逐渐明白了其中的含义。2. 有些c语言的函数和c+语言函数不同。3. 函数和指针的知识还不够好,不够牢固。心得体会; 数据结构是一门重要的课程,万事开头难,刚开始学的时候是很难的,需要自己反复地思考和阅览书籍,才能解开一个个矛盾。C语言是很基础的,数据结构要想学好,c语言的最基本,特别是要学好里面的函数和指针知识,因为数据结构里面很多都是用到指针和函数的。 实验二 链表的操作及其应用一、实验目的了解单链表的基本概念、结构的定义及在单链表上的基本操作(插入、删除、查找以及线性表合并),通过在Turb
11、o 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 LNode ElemType data; struct LNode *next;LNode,*LinkL
12、ist;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) in
13、t 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
14、; 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-ne
15、xt=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.插
16、入元素 |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(链表是:); Ou
17、tputList(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(新单链表是:); Out
18、putList(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. 第二个问题的解决方法是最后加上了sc
19、anf(%d,&e);这个语句,这样才不会出现乱码,输出如我所愿; 心得体会:通过对实验一的学习后,我对数据结构有了更深刻的认识,使得我在做实验的过程中速度加快了很多,掌握了各种函数的应用,能够更深刻地了解单链表的操作及其应用。 实验三 栈的操作及其应用一、实验目的 了解栈的概念、栈的特性、在两种存储结构上如何实现栈的基本操作以及栈在程序设计中的应用。通过在Turbo C中实现顺序栈的插入和删除加深理解顺序栈的意义。二、实验内容 顺序栈的进栈、出栈算法 链式栈的进栈、出栈算法(选做)源程序code:#include #include #include typedef int selemtype
20、;#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);
21、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
22、*)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(
23、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
24、作为顺序栈空的标记 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(c
25、h=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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1