当前位置:文档之家› 数据结构实验报告——线性表

数据结构实验报告——线性表

实验报告:线性表的基本操作实验1:实现顺序表各种基本运算的算法一、实验目的学会并运用顺序表存储结构及各种运算。

二、实验环境VC++6.0三、实验准备(1) 复习课件中理论知识(2)练习课堂所讲的例子四、实验内容编写一个程序实现SqList.cpp,实现顺序表基本运算,并在此基础上设计个主程序exp1.cpp,完成如下功能:(1)初始化顺序表L;(2)依次插入a、b、c、d、e元素;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空:(6)输出顺序表L的第3个元素;(7)输出元素a的位置;(8)在第4个位置上插入f元素;(9)输出顺序表L;(10)删除顺序表L的第3 个元素;(11)输出顺序表L;(12)顺序表L;五、实验步骤1、构造一个空的线形表并分配内存空间Status InitList_Sql(SqList &L){L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem) exit(OVERFLOW);L.length=0; L.listsize=LIST_INIT_SIZE; return OK; }2、求线性表的长度Status ListLength(SqList L) {return L.length; }3、线性表清空void ClearList(SqList &L){ L.length = 0; }4、在顺序线形表 L 中第 i 个位置之前插入新的元素 eStatus ListInsert_Sq(SqList &L,int i,ElemType e)5、查找'm'在顺序表中的位序e = 'm'; i = LocateElem_Sq(L,e);printf("元素 m 在顺序表中的位序是:%d\n",i);6、在第4个位置上插入f元素printf("(在第 4 个元素位置上插入 f 元素\n");ListInsert_Sq(L,4,'f');7、删除第 3 个元素printf("(删除顺序表 L 中第 3 个元素:"); ListDelete_Sq(L, 3, e);printf("被删除的第 3 个元素值是:%c",e);8、重新申请空间ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof( ElemType)); if(!newbase) exit(OVERFLOW);L.elem=newbase;新的存储空间基址 L.listsize+=LISTINCREMENT;9、初始化并插入元素InitList_Sql(L); printf("依次插入 a,b,c,d,e 元素\n");10、输出顺序表、释放顺序表printf("输出顺序表 L:"); ListTraverse(L); printf("(释放顺序表L\n"); DestroyList(L);六、实验总结通过该实验的学习,对课堂内容再次巩固,对顺序表也有了更深的了解。

顺序表无非几种操作顺序表的构建与释放、元素插入、增加容量、删除元素、查找元素等。

在此过程中,我感觉顺序表的操作比较麻烦,就分配空间来说因为他使用的是顺序空间,不确定要分配多大空间,如果不够用还要从新分配。

此外在插入和删除元素时必须从表尾开始移动其他元素。

附:源代码#include <stdlib.h>#include <stdio.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;//----线形表的动态分配顺序存储结构#define LIST_INIT_SIZE 100 //顺序表存储空间的初始分配量#define LISTINCREMENT 10 //线形表存储空间的分配增量typedef char ElemType;typedef struct{ElemType *elem; //存储空间基址int length; //当前长度int listsize; //当前分配的存储容量(以 sizeof(ElemType)为单位) }SqList;Status InitList_Sql(SqList &L) //构造一个空的线形表{ //分配内存空间L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem)//存储分配失败exit(OVERFLOW);L.length=0;L.listsize=LIST_INIT_SIZE;return OK;}//InitList_Sq//遍历一个线性表void ListTraverse(SqList L){for(int i=0;i<L.length;i++){if(i==0)printf("(");printf("%c",L.elem[i]);if(i==L.length-1)printf(")\n");elseprintf(",");}}//求线性表的长度Status ListLength(SqList L){return L.length;}//把线性表清空void ClearList(SqList &L){L.length = 0;}//判断线性表是否是空表bool ListEmpty(SqList &L){return (L.length == 0)?true:false;}//销毁线性表void DestroyList(SqList &L){free(L.elem);L.length = 0;L.listsize = 0;}// 在顺序线性表 L 中查找第 1 个值与 e 满足相等的元素的位序。

// 若找到,则返回其在 L 中的位序,否则返回 0。

int LocateElem_Sq(SqList L, ElemType e) { // 算法 2.6int i = 1; // i 的初值为第 1 个元素的位序while (i <= L.length && L.elem[i-1] != e)i++;if (i > L.length){i=0;return i;} elsereturn i;} // LocateElem_Sqbool GetElem(SqList &L,int i,ElemType &e){if(i<1 || i>L.length)return false;e = L.elem[i-1];return true;}//插入一个元素Status ListInsert_Sq(SqList &L,int i,ElemType e)//在顺序线形表L 中第 i 个位置之前插入新的元素 e{//i 的合法值为 1<=i<=ListLength.Sq(L)+1if(i<1||i>L.length+1)return ERROR;//i 值不合法,出错if(L.length>=L.listsize)//如果容量不够,再重新申请空间{ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT) *sizeof(ElemType));if(!newbase)//存储空间分配失败exit(OVERFLOW);L.elem=newbase;//新的存储空间基址L.listsize+=LISTINCREMENT;//存储容量增加了}ElemType *p,*q;q=&(L.elem[i-1]);for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;//插入 e++L.length;return OK;}Status ListDelete_Sq(SqList &L, int i, ElemType &x){ if (( i<1 ) || (i > L.length))return ERROR;ElemType *p,*q;p = & ( L.elem[ i-1 ] ) ; // P 要被删除的位置x = * p; // 把删除的数据放到 x 中q = L.elem + L. length - 1;for (++p; p <= q; ++ p)*(p-1) = *p; // 移动数据--L.length; // 长度减 1return OK;}void main(){SqList L;ElemType e;printf("顺序表的基本运算如下:\n");printf("(1)初始化顺序表 L:\n");InitList_Sql(L); //初始化顺序表printf("(2)依次插入 a,b,c,d,e 元素\n"); //插入几个元素 ListInsert_Sq(L,1,'a');ListInsert_Sq(L,2,'b');ListInsert_Sq(L,3,'c');ListInsert_Sq(L,4,'d');ListInsert_Sq(L,5,'e');printf("(3)输出顺序表 L:");ListTraverse(L);printf("(4)顺序表的长度是:%d\n",ListLength(L));printf("(5)顺序表 L 为%s\n",(ListEmpty(L)?"空":"非空"));GetElem(L,3,e);printf("(6)顺序表 L 中第 3 个元素是:%c\n",e);//查找'e'在顺序表中的位序e = 'e';int i = LocateElem_Sq(L,e);printf("(7)元素 e 在顺序表中的位序是:%d\n",i);//查找'm'在顺序表中的位序e = 'm';i = LocateElem_Sq(L,e);printf("(7)元素 m 在顺序表中的位序是:%d\n",i);printf("(8)在第 4 个元素位置上插入 f 元素\n");ListInsert_Sq(L,4,'f');printf("(9)输出顺序表 L:");ListTraverse(L);//删除第 3 个元素printf("(10)删除顺序表 L 中第 3 个元素:");ListDelete_Sq(L, 3, e);printf("被删除的第 3 个元素值是:%c",e);printf("线性表的长度是:%d\n",ListLength(L));printf("(11)输出顺序表 L:");ListTraverse(L);printf("(12)释放顺序表 L\n");DestroyList(L);}实验结果:实验题2:实现单链表表各种基本运算的算法一、实验目的领会单链表存储结构和掌握单链表中各种基本运算算法设计。

相关主题