实验一 顺序表的操作

来源:互联网 发布:js中定义jso 编辑:程序博客网 时间:2024/06/14 04:04

实验一 顺序表的操作
一、实验目的
1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.了解顺序表的应用。

二、实验内容
1.建立顺序表,并在顺序表上实现插入、删除和查找等基本操作。
2.删除有序顺序表中的重复元素。

三、实验要求
1.建立顺序表并实现相关基本操作。
(1)根据输入顺序表的长度n和各个数据元素值建立一个顺序表,并输出顺序表中各元素值,观察输入的内容与输出的内容是否一致。
(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值。
(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值。
(4)在顺序表中查找第i个元素,如果查找成功,则显示“查找成功”和该元素在顺序表中的位置,否则显示“查找失败”。
2.删除有序顺序表中的重复元素。
(1)根据输入的n个非递减的有序数据建立一个有序顺序表,并输出有序顺序表中各元素值。
(2)删除有序顺序表中所有的重复元素,并显示删除后的有序顺序表中各元素值。

四、详细程序清单

#include<stdio.h>#define MAXLEN 30typedef struct{    int elem[MAXLEN];    int length;}Sqlist;void Create(Sqlist &L)//创建{    int n,i=0;    printf("请输入线性表元素个数(小于30)\n");    while(scanf("%d",&n)&&n>30||n<0)    {        printf("数据不合法,请重新输入\n");    }    printf("请输入%d个数,用空格分开\n",n);    while(n--)    {        scanf("%d",&L.elem[i]);        i++;        L.length++;    } }void Show(Sqlist L)//显示{    printf("当前顺序表中元素有:\t");     for(int i=0;i<L.length;i++)    {        printf("%d ",L.elem[i]);    }    printf("\n");}int Insert(Sqlist &L,int i,int x)//插入{     int key=1;    if (i<1||i>L.length+1)    {        printf("插入位置不正确\n");         key=0;        return key;    }    for(int j=L.length-1;j>=i-1;j--)           L.elem[j+1]=L.elem[j];    L.elem[i-1]=x;     L.length++;     return key;}int Delete(Sqlist &L,int i)//删除{    int key=1;    if (i<1||i>L.length)         {            printf("删除位置不正确\n");             key=0;            return key;        }    for(int j=i;j<=L.length-1;j++)            L.elem[j-1]=L.elem[j];        L.length--;        return key; }int Search(Sqlist L,int e)//查找 {        int i,key=1;        for (i=0;i<L.length&&L.elem[i]!=e;i++);        if (i<L.length)        {            printf("查找成功,%d在",e);             for(;i<L.length;++i)                if(e==L.elem[i])                printf("第%d",i+1);            printf("的位置\n");            return key;        }        else {printf("查找失败\n"); key=0;return key;}}void DelSqlist(Sqlist &L)//去重 {    int i,j,temp;    for (j=0;j<L.length;j++)        for (i=0;i<L.length-1-j;i++)        {            if(L.elem[i]>L.elem[i+1])            {                temp=L.elem[i];                L.elem[i]=L.elem[i+1];                L.elem[i+1]=temp;            }        }        i=0; while(i<L.length-1)   if (L.elem[i]==L.elem[i+1])       {         for (j=i+1;j<L.length;j++)         L.elem[j-1]=L.elem[j];         L.length--;     }   else     i++;}int main() {    int i,x,e,slect,key;    Sqlist L;    L.length=0;    Create(L);    Show(L);    printf("请选择操作:\t 1.插入元素\t2.删除元素\t3.查找元素\t4.删除重复元素\n");    while(~scanf("%d",&slect))    {        key=0;        switch (slect)        {             case 1:if (L.length>=MAXLEN) {                printf("顺序表中已放满元素,无法插入新元素\n");                break;}                while(key==0){                printf("请输入要插到的位置和元素值\n");                 scanf("%d%d",&i,&x);                 key=Insert(L,i,x);                Show(L);                }break;             case 2:while(key==0){                printf("请输入要删除的位置\n");                 scanf("%d",&i);                 key=Delete(L,i);                Show(L);                 }break;             case 3: while(key==0){                printf("请输入要查找的元素\n");                 scanf("%d",&e);                 key=Search(L,e);                }break;             case 4:DelSqlist(L);Show(L);break;             default:printf("输入错误,请重新输入\n"); break;        }        printf("请选择操作:\t 1.插入\t2.删除\t3.查找\t4.删除重复元素\n");    }   }

五、程序运行结果
这里写图片描述

六、实验心得体会
1.考虑问题要全面,尽可能增强程序的鲁棒性;
2.将程序模块化,能使其更加可读、易找错、易修改;
3.函数和变量的命名要能一眼看出来它的意思;
4.错误很多,调试很烦,要有耐心。