实验1:顺序表的基本操作
实验目的:
1、掌握顺序表的存储结构
2、实现顺序表的基本操作
实验内容:
//建立一个顺序表L1=(11,2,35,41,65,2);
1)查找元素5是否存在
2)删除位序为3的元素
3)输出所有元素
4)输出顺序表的长度
5)输出元素2第一次出现的位序
实验要求:
- 代码完整
- 程序的运行结果
- 实验心得
程序清单:
#include<stdio.h>
#include<stdlib.h> //malloc realloc
typedef int ElemType; /* 在实际问题中,根据需要定义所需的数据类型 */
#define INITSIZE 100 /* 顺序表存储空间的初始分配量 */
typedef struct
{ ElemType *data; /* 存储空间基地址 */
int length; /* 顺序表长度(即已存入的元素个数) */
int listsize; /* 当前存储空间容量(即能存入的元素个数) */
}sqlist;
/* (1)初始化操作(创建一个空的顺序表L) */
void initlist(sqlist *L)
{
L->data =(ElemType *)malloc(sizeof(ElemType)*INITSIZE);
L->length =0;
L->listsize =INITSIZE; //补充代码
}
/* (2)求表长操作(统计顺序表L中存储的数据元素个数) */
int getlen(sqlist *L)
{
return(L->length);//补充代码
}
/* (3)取元素操作(取出顺序表L的第i个数据元素的值) */
int getelem(sqlist *L,int i,ElemType *e)
{
if(i<1||i>L->length) return 0;
*e=L->data [i-1];
return 1;
}
/* (4)元素定位操作(在顺序表L中,查找第1个与x值相等的数据元素的位置) */
int locate(sqlist *L,ElemType x)
{
int i=0;
while(i<L->length )
if(L->data [i]==x) return i+1;
else i++;
return 0; //补充代码
}
/* (5)插入操作(在顺序表L中的第i个位序上插入一个值为x的数据元素) */
int insert(sqlist *L,int i,ElemType x)
{ int j;
if(i<1||i>L->length+1) return 0; /* 参数i不合理,返回0 */
if(L->length==L->listsize) /* 存储空间不够,增加一个存储空间 */
{ L->data=(ElemType *)realloc(L->data,(L->listsize+1)*sizeof(ElemType));
L->listsize++; /* 重置存储空间长度 */
}
for(j=L->length-1;j>=i-1;j--)
L->data[j+1]=L->data[j];//补充代码 /* 将序号为i及之后的数据元素后移一位*/
L->data[i-1]=x; /* 在序号i处放入x */
L->length++; //补充代码 /* 顺序表长度增1 */
return 1; /* 插入成功,返回1 */
}
/* (6)删除操作(将顺序表L的第i个元素删除) */
int delete(sqlist *L,int i,ElemType *e)
{ int j;
if(i<1||i>L->length) return 0; /* 参数i不合理,返回0 */
*e=L->data[i-1]; /* 存储被删除的元素 */
for(j=i;j<L->length;j++)
L->data[j-1]=L->data[j];//补充代码 /* 将序号为i及之后的数据元素前移一位 */
L->length--; /* 顺序表长度减1 */
return 1; /* 删除成功,返回1 */
}
/* (7)输出操作(输出顺序表L的各数据元素值) */
void list(sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%5d",L->data[i]);
}
printf("\n"); //补充代码
}
int main(){
sqlist L1;
int i;
int t[6]={11,2,35,41,65,2};
initlist(&L1);
for(i=0;i<6;i++)
insert(&L1,i+1,t[i]);
if(locate(&L1,5))
printf("yes!\n");
else
printf("no!\n");
int n;
if(delete(&L1,3,&n))
printf("%d 删除成功!\n",n);
else
printf("删除失败!\n");
list(&L1);
printf("%d\n",getlen(&L1));
printf("元素2第一次出现的位序: %d",locate(&L1,2));
return 0;
}
运行结果:
实验心得: 经过这次实验,顺性表的结构特点和基本操作以及C语言相关的程序设计方法与技术得到了巩固,同时也发现,扎实的基础知识是实验的基础,只有把课本上的相关知识弄清楚了, 实验才能进行下去, 少浪费很多时间。这次实验不仅仅是实现一个顺序表的各种基本的操作, 更重要的是通过做实验的过程开发了相应的思路。