数据结构实验线性表及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机系数据结构实验报告(1)
实验目的:
帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。
问题描述:
1、构造一个空的线性表L。
2、在线性表L的第i个元素之前插入新的元素e;
3、在线性表L中删除第i个元素,并用e返回其值。
实验要求:分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线性表的基本操作算法。
2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行
分析。
算法分析:
由于两种存储结构都用来创建线性结构的数据表,可采用相同的输出模式和整体结构类似的算法,如下:
实验内容和过程:
顺序存储结构线性表程序清单:
//顺序存储结构线性表的插入删除
#include
#include
using namespace std;
# define LISTSIZE 100
# define CREMENTSIZE 10
typedef char ElemType; //定义数据元素类型为字符型
typedef struct {
ElemType *elem; //数据元素首地址
int len; //当前元素个数
int listsize; //当前存储最大容量
}SqList;
//构造一个空的线性表L
int InitList(SqList &L)
{
L.elem=(ElemType *)malloc(LISTSIZE*sizeof(ElemType));
if (!L.elem) exit(-2); //分配空间失败
L.len=0;
L.listsize=LISTSIZE;
}
//在顺序线性表L中第i个位置之前插入新的元素e
int ListInsert(SqList &L,int i,ElemType e)
{
if (i<1||i>L.len+1) return -1; //i值不合法
if (L.len>=L.listsize)
{
ElemType *newelem=(ElemType *)realloc(L.elem,(L.listsize+CREMENTSIZE)*sizeof(ElemType));
//存储空间已满,增加分配
if(!newelem) exit (-2); //分配失败
L.elem=newelem;
L.listsize+=CREMENTSIZE;
}
ElemType *q=&(L.elem[i-1]) ;
for (ElemType *p=&(L.elem[L.len-1]);p>=q;--p) *(p+1)=*p; //插入位置及其后的元素后移
*q=e; ++L.len;
return 1;
}
//在顺序线性表L中删除第i个元素,并用e返回其值
int ListDelete(SqList &L,int i,ElemType&e)
{
if (i<1||i>L.len) return -1; //i值不合法
ElemType *p=&(L.elem[i-1]);
e=*p; ElemType*q=L.elem+L.len-1;
for (++p;p<=q+1;++p) *(p-1)=*p; //被删除元素之后的元素前移
--L.len;
return 1;
}
int main ()
{
SqList L; char e,ch;
int i,j,state;
InitList(L); //构造线性表
printf("请输入原始数据(字符串个数0~99):L="); //数据初始化
gets(L.elem);
for ( j=1;L.elem[j-1]!='\0';j++) L.len=j; //获取表长L.len
L.elem[j]='\0';
printf("操作:插入(I)还是删除(D)?\n"); //判断进行插入还是删除操作AGAIN:
cin>>ch;
if(ch=='I')
{
cout<<"插在第几个元素之前:"; //插入操作
cin>>i; cout<<"输入要插入的新元素:";
cin>>e;
cout< printf("输入数据:L=(%s) ListInsert(L,%d,%c)",L.elem,i,e); state=ListInsert (L,i,e); } else if (ch=='D') { cout<<"删除第几个元素:"; //删除操作 cin>>i; cout< printf("输入数据:L=(%s) DeleteList(L,%d,e)",L.elem,i); state=ListDelete(L,i,e); } else goto AGAIN; //操作指示符输入错误处理cout< if(state==-1) cout<<"ERROR,"; printf("L=(%s) ",L.elem); //输出结果 if(ch=='D'&&state!=-1) cout<<",e="< } 链式存储结构线性表程序清单: // - - - - -单链存储结构线性表的插入删除- - - - - #include #include using namespace std; #define null 0 typedef char ElemType; //定义数据元素类型为字符型typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; int GetElem(LinkList L,int i,ElemType &e) //获取第i个元素的值{ LinkList p;int j; p=L->next; j=1; while(p&&j { p=p->next; ++j; //寻找第i个元素 } if(!p||j>i) return -1; //寻找失败 e=p->data; return 1; } int ListInsert(LinkList &L,int i,ElemType e) { //在带头结点的单链线性表L中第i个元素之前插入元素e LinkList p,s; int j; p=L;j=0; while(p&&j