实验1:顺序表的基本操作(包括基本代码)

实验1:顺序表的基本操作

实验目的:

1、掌握顺序表的存储结构

2、实现顺序表的基本操作

实验内容:

//建立一个顺序表L1=(11,2,35,41,65,2);

1)查找元素5是否存在

2)删除位序为3的元素

3)输出所有元素

4)输出顺序表的长度

5)输出元素2第一次出现的位序

实验要求:                                                    

  1. 代码完整
  2. 程序的运行结果
  3. 实验心得

程序清单:

#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语言相关的程序设计方法与技术得到了巩固,同时也发现,扎实的基础知识是实验的基础,只有把课本上的相关知识弄清楚了, 实验才能进行下去, 少浪费很多时间。这次实验不仅仅是实现一个顺序表的各种基本的操作, 更重要的是通过做实验的过程开发了相应的思路。

猜你喜欢

转载自blog.csdn.net/zsl20200217/article/details/123559632