顺序表的基本操作

21 篇文章 2 订阅
2 篇文章 0 订阅

一、实验目的:

1、复习C语言程序设计中的知识。

2、掌握线性表的顺序存储结构的表示和实现方法。

3、掌握顺序表基本操作的算法实现。

二、实验内容:

1.建立顺序表。

2.在顺序表上实现插入、删除和查找等操作。

三、实验要求:

编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:

⑴初始化整型顺序表L

⑵建立顺序表L,如(a,b,c,d,c);

⑶输出顺序表L的长度;

⑷输出顺序表L的第i个元素,如第3个元素;

⑸输出给定元素的位置,如输出元素a的位置;

⑹在第i个元素前插入给定元素,如在第4个元素前插入元素f

⑺删除顺序表L的第i个元素,如删除顺序表L的第3个元素。

代码如下:(注:必须执行功能a之后再执行其他功能)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define maxsize 1024
typedef int elemtype;
typedef struct sequlist
{
    elemtype data[maxsize];   //定义顺序表为一维数组
    int last;   //last为最后一个数据元素的下标位置
}SequenList;

//1 初始化字符型顺序表L
SequenList * lnit_SequenList()
{
    SequenList *L;//定义顺序表指针变量
    L = (SequenList *)malloc(sizeof(SequenList));/*申请分配内存空间*/
    if (L != NULL)         /*申请分配内存空间成功*/
    {
        L->last = -1;      /*设置顺序表的长度last为-1;表示顺序表为空*/
        printf("初始化成功!\n");
    }
    else
    {
        printf("申请顺序表内存空间失败,程序结束!\n");
        return 0;
    }
    return L;       //返回顺序表的首地址
}

/*2 建立顺序表L */
SequenList *indata_SeqList(SequenList *L)
{
    elemtype x;
    printf("请输入元素(终止输入请输入0即可):");
    scanf("%d", &x);
    while (x != 0)
    {
        L->last += 1;
        L->data[L->last] = x;
        scanf("%d", &x);
    }
    printf("顺序表建立成功!\n");
    return L;
}

/*3 输出顺序表L的长度*/
int SequenList_Length(SequenList *L)
{
    printf("顺序表的长度为:%d\n", L->last + 1);
    return 0;
}

/* 4 输出顺序表L的第i个元素*/
int input_SequenList(SequenList *L)
{
    int i,j=0;
    int key;
    printf("要输出的元素为第几个?\n");
    scanf("%d", &key);
    if ((key - 1) <= L->last&&(key-1)>=0)
    {
        for (i = 0; i <= L->last; i++)
        {
            if (i == (key-1))
            {
                printf("%d\n", L->data[i]);
                j = 1;
                break;
            }
        }
    }
    else
    {
        printf("你所输入的元素位置不合法!\n");
    }
    return 0;
}
/* 5 输出给定元素的位置  */
int Search_SequenList(SequenList *L)
{
    int i,j=0;
    int key;
    printf("请输入元素:");
    scanf("%d", &key);
    for (i = 0; i <= L->last; i++)
    {
        if (L->data[i] == key)
        {
            printf("元素位置为:%d\n", i + 1);
            j = 1;
            //return (i + 1);
        }
        /*else
        {
            printf("查找失败");
        }*/
    }
    if (j == 0)
    {
        printf("查找失败");
    }
    return 0;
}

/* 6 在第i个元素前插入给定元素*/
int lnsert_SequenList(SequenList *L)
/*在顺序表L中第i个数据元素之前插入一个元素x,插入前表长n=L->last+1,
i的合法取值范围是 1<=i<=L->last+2*/
{
    int j;
    int i, x;
    printf("在在第几个元素前插入元素?\n");
    scanf("%d", &i);
    printf("插入的元素为:");
    scanf("%d", &x);
    if (L->last >= maxsize - 1)
    {
        printf("表已满无法插入!\n");
        return 0;
    }
    if ((i<1) || (i>L->last + 2))
    {
        printf("插入位置i值不合法!\n");
        return -1;
    }
    /*为插入元素而移动位置*/
    for (j = L->last; j >= i - 1; j--)
    {
        L->data[j + 1] = L->data[j];
    }
    L->data[i - 1] = x;     /*第i个元素下标为i-1*/
    L->last = L->last + 1;
    printf("插入成功!\n");
    return 0;
}

/*7 删除顺序表的第i个元素*/
int Delete_SequenList(SequenList *L)
/*在顺序表中删除第i个元素,并用指针参数e返回其值,
i的合法取值范围为1<=i<=L.last+1*/
{
    int k;
    int i;
    printf("要删除第几个元素?");
    scanf("%d", &i);
    if ((i<1) || (i>L->last + 1))
    {
        printf("删除位置不合法");
    }
    else
    {
        for (k = i; k <= L->last; k++)
        {
            L->data[k - 1] = L->data[k];//结点前移
        }
        L->last--;//表长减一
        printf("删除成功!\n");
    }
    return 0;
}
void show(SequenList *L)
{
    for (int i = 0; i <= L->last; i++)
    {
        printf("%d\n", L->data[i]);
    }

}
//菜单
void menu()
{
    system("cls");
    printf("\n");
    printf("\t\t---------------欢迎使用顺序表的基本操作------------------\n");
    printf("\t\t|\t\t a 初始化顺序表               \t\t|\n");
    printf("\t\t|\t\t b 建立顺序表                 \t\t|\n");
    printf("\t\t|\t\t c 输出顺序表的长度           \t\t|\n");
    printf("\t\t|\t\t d 输出顺序表第i个元素        \t\t|\n");
    printf("\t\t|\t\t e 输出给定元素的位置         \t\t|\n");
    printf("\t\t|\t\t f 在第i个元素前插入给定的元素\t\t|\n");
    printf("\t\t|\t\t g 删除顺序表第i个元素        \t\t|\n");
    printf("\t\t|\t\t h 输出顺序表各个元素         \t\t|\n");
    printf("\t\t|\t\t i 退出系统                   \t\t|\n");
    printf("\t\t---------------------------------------------------------\n");
    printf("\t\t请选择(a-g):");
}

int main()
{
    SequenList *L;
    int  quit = 0;
    elemtype *e = 0;
    char select;
    while (1)
    {
        menu();            //调用子函数
        scanf("%c", &select);
        switch (select)
        {
            case 'a': L=lnit_SequenList(); break;
            case 'b': *indata_SeqList(L); break;
            case 'c': SequenList_Length(L); break;
            case 'd': input_SequenList(L); break;
            case 'e': Search_SequenList(L); break;
            case 'f': lnsert_SequenList(L); break;
            case 'g': Delete_SequenList(L); break;
            case 'h': show(L); break;
            case 'i': quit = 1; break;
            default:printf("请输入a~i之间的数字\n"); break;
        }
        if (quit == 1)
        {
            break;
        }
        printf("按任意键返回主菜单!\n");
        getchar();                //提取到缓冲区中的回车键
        getchar();                //起到暂停的作用
        printf("程序结束!\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值