一、实验目的: 1、掌握线性表的逻辑结构 2、掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算 3、加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能力
|
实验场地及仪器、设备和材料:devc++
|
实验训练内容(包括实验原理和操作步骤):(1)初始化顺序表L (2)从键盘上依次输入任意个整数以创建顺序表L (3)输出顺序表中的各元素 (4)输出顺序表L的长度 (5)输出顺序表L的第3个元素 (6)查找元素10,如果存在输出其位序,不存在输出0 (7)在顺序表的第5个位置插入数据元素25 (8)删除顺序表中的第3个数据元素 (9)查找顺序表中的最大值和最小值并输出 (10)实现顺序表的就地逆置 (11)清空顺序表L (12)销毁顺序表L 根据要求自己写出对应的代码来实现 |
二、实验总结与评价
实验总结(包括实验数据分析、实验代码、实验结果、实验过程中出现的问题及解决方法等):
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int ElemType;
typedef int status;
typedef struct SqList
{ ElemType *elem;//存储空间的基地址
int length;//当前长度
}SqList;//顺序表结构为Sqlist
status InitList(SqList&L) //(1)顺序表的初始化
{ L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZEde数组空间
if (!L.elem)
exit(OVERFLOW);//存储分配失败推出
L.length=0;//空表程度为0
return OK;
}
status CreateSqList (SqList &L, int n )// (2)从键盘上依次输入;顺序表的创建
{
int i;
L.length=n;
printf("输入整型元素: ");
for (i=0; i<n; i++)
scanf("%d", &L.elem[i]);
return OK;
}
status DisplaySqList (SqList L)//(3)输出顺序表的各元素
{
int i;
for (i=0; i<L.length; i++)
printf("%d ", L.elem[i]);
return OK;
}
status ListLength(SqList L)//(4)输出顺序表的长度
{
return(L.length);
}
bool GetElem(SqList L,int i)//(5)输出顺序表L的第3个元素
{
if(i<1||i>L.length)
return false;
printf("顺序表的第三个元素是%d\n",L.elem[i-1]);
for (i=0; i<L.length; i++)
printf("%d ", L.elem[i]);
return true;
}
status LocateElem(SqList L,int e)//(6)查找元素10
{
int i=0;
while(i<L.length&&L.elem[i]!=e)
i++;
if(i<L.length)
{
return i+1;
}//若不存在输出0
else
{
return 0;
}//存在则输出其位序
}
bool ListInsert(SqList &L,int i,int e)//(7)在第5个位置插入数据元素25
{
int j;
if(i<1||i>L.length+1||L.length==MAXSIZE)
return false;
i--;
for(j=L.length;j>i;j--)
L.elem[j]=L.elem[j-1];
L.elem[i]=e;
L.length++;
for (i=0; i<L.length; i++)
printf("%d ", L.elem[i]);
return true;
}
bool ListDelete(SqList&L,int i)//(8)删除表中的第3个元素
{
int j;
if(i<i||i>L.length)
return false;
i--;
for(j=i;j<L.length-1;j++)
L.elem[j]=L.elem[j+1];
L.length--;
for (i=0; i<L.length; i++)
printf("%d ", L.elem[i]);
return true;
}void Comparesize(SqList L)//(9)查找表中的最大值和最小值输出
{
int i,max,min;
max=L.elem[0];
min=L.elem[0];
for(i=1;i<L.length;i++)
{
if(L.elem[i]>max)
max=L.elem[i];
if(L.elem[i]<min)
min=L.elem[i];
}
printf("max:%d,min:%d",max,min);
}
void Localinversion(SqList L)//(10)实现顺序表的就地逆置
{
int i,j,temp;
for(i=0,j=L.length-1;i<=j;i++,j--)
{
temp=L.elem[j];
L.elem[j]=L.elem[i];
L.elem[i]=temp;
}
}
void ClearList(SqList &L)//(11)清空顺序表L
{
L.length=0;
}
void DestroyList(SqList &L)//(12)销毁顺序表
{
L.elem=NULL;
L.length=0;
}
int Menu(void)
{
int i;
printf("请选择你要的功能\n");
printf("1.初始化顺序表L\n");
printf("2.从键盘上依次输入任意个整数以创建顺序表L\n");
printf("3.输出顺序表中的各元素\n");
printf("4.输出顺序表L的长度\n");
printf("5.输出顺序表L的第3个元素\n");
printf("6.查找元素10,如果存在输出其位序,不存在输出0\n");
printf("7.在顺序表的第5个位置插入数据元素25\n");
printf("8.删除顺序表中的第3个数据元素\n");
printf("9.查找顺序表中的最大值和最小值并输出\n");
printf("10.实现顺序表的就地逆置\n");
printf("11.清空顺序表L\n");
printf("12.销毁顺序表L\n");
scanf("%d",&i);
return i;
}
int main()
{
int ch;
SqList sq;
while(1){
ch=Menu();
switch(ch)
{
case 1:
InitList(sq);
break;
case 2:
int i;
printf("请输入要输入的元素个数\n");
scanf("%d",&i);
CreateSqList(sq,i);
break;
case 3:
DisplaySqList(sq);
printf("\n");
break;
case 4:
printf("\n输出的顺序表L长度为%d\n",ListLength(sq));
break;
case 5:
GetElem(sq,3);
break;
case 6:
printf("元素10的位置%d\n",LocateElem (sq));
break;
case 7:
printf("在顺序表的第5个位置插入数据元素25\n");
ListInsert(sq,5,25);
break;
case 8:
printf("删除L的第三个元素\n");
ListDelete(sq,3);
break;
case 9:
Comparesize(sq);
printf("\n");
break;
case 10:
printf("就地逆置后为:");
Localinversion(sq);
break;
case 11:
ClearList(sq);
break;
case 12:
DestroyList(sq);
break;
}
}
return 0;
}
实验结果:
对实验的自我评价:
在实验过程中,感觉要弄清楚什么时候要用线性表L的地址什么时候要用线性表L的指针。编译完后发现还是会有一些经常犯的小错误,比如说SqList,ListLengh这种,总是会不小心写出Sqlist,Listleng;还有“;”号也是经常漏,下次要多多注意。