线性表操作

题目描述

顺序表是我们数据结构中的基本储存形式,现在给定一个顺序表,有如下操作:
Insert X Y:在顺序表中X位置插入Y元素,遍历输出当前顺序表的所有元素。
Delete X:删除顺序表中的X元素,如果有多个X元素,只删除第一个X,遍历输出当前顺序的所有元素。
Locate X:输出顺序表中X元素的所在的位置,如果有多个X元素,只输出第一个X元素的位置。
GetElem X:输出顺序表中X位置上的元素。

输入描述

多组测试数据。
对于每组测试数据,首先输入的是两个整数n,m(0<m<n<100),分别表示顺序表初始有n个元素,m次操作。
接下来是n个整数,表示顺序表中的n个元素。
然后是m次操作命令,命令是Insert X Y,Delete X,Locate X,GetElem X中的一种,其中的X,Y均为整数。

输出描述

对于每组数据,输出有m行,对应m次操作:如果操作合法,则输出相应的结果。如果操作不合法,则输出"Wrong Input!"

输入样例

5 8
1 3 4 5 6
Insert 4 7
Insert 8 10
Delete 6
Delete 10
Locate 5
Locate 10
GetElem 3
GetElem 9

输出样例

1 3 4 7 5 6
Wrong Input!
1 3 4 7 5
Wrong Input!
5
Wrong Input!
4
Wrong Input!

Code:

#include <stdio.h>

typedef struct
{
    int *date;
    int length;
    int listsize;
}seqlist;//建立数据结构

void InitList(seqlist *L, int n);//创建空线性表
void Insert(seqlist *L, int i, int date);//在线性表第i个位置插入元素date
void Delete(seqlist *L, int _date);//删除线性表已有元素_date
void Locate(seqlist *L, int _date);//输出线性表已有元素_date的位置
void GetElem(seqlist *L, int i);//输出线性表第i个位置上的元素

int main()
{
    int n, m;
    char s[100];
    seqlist *L = (seqlist*)malloc(sizeof(seqlist));
    while (scanf("%d %d", &n, &m) != EOF)
    {
        int v, date;
        InitList(L, n);
        L->length = n;
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &L->date[i]);
        }

        for (int t = 0; t < m; t++)//输入并判断相应操作
        {
            scanf("%s", &s);
            if (s[0] == 'I')
            {
                scanf("%d %d", &v, &date);
                Insert(L, v, date);
            }
            else if (s[0] == 'D')
            {
                scanf("%d", &date);
                Delete(L, date);
            }
            else if (s[0] == 'L')
            {
                scanf("%d", &date);
                Locate(L, date);
            }
            else if (s[0] == 'G')
            {
                scanf("%d", &v);
                GetElem(L, v);
            }
        }

    }
}

void InitList(seqlist *L, int n)
{
    L->date = (int*)malloc(n * sizeof(int));//储存分配
    if (!L->date)
    {
        return 0;
    }
    L->length = 0;
    L->listsize = n;
    return 1;
}

void Insert(seqlist *L, int i, int date)
{
    int *q, *p;
    if (i < 1||i > L->length + 1)//判断i是否存在
    {
        printf("Wrong Input!\n");
        return 0;
    }

    q = &(L->date[i - 1]);
    for (p = (&L->date[L->length-1]); p >= q; --p)
    {
        *(p + 1) = *p;
    }
    *q = date;
    ++L->length;

    for(int x = 0; x < L->length; x++)
    {
        if(x == L->length - 1)
        {
            printf("%d\n", L->date[x]);
        }
        else
        {
            printf("%d ", L->date[x]);
        }
    }
    return 1;

}

void Delete(seqlist *L, int _date)
{
    int q, p;
    int v;

    for (v = 0; v < L->length; v++)
    {
        if (L->date[v] == _date)
        {
            q = v;
            break;
        }
    }

    if (v >= L->length)
    {
        printf("Wrong Input!\n");
        return 0;
    }

    p = q;
    for (; p + 1 < L->length; p++)
    {
        L->date[p] = L->date[p + 1];
    }
    --L->length;

    for (int x = 0; x < L->length; x++)
    {
        if (x == L->length - 1)
        {
            printf("%d\n", L->date[x]);
        }
        else
        {
            printf("%d ", L->date[x]);
        }
    }
    return 1;

}

void Locate(seqlist *L, int _date)
{
    int i;
    int q;
    for (i = 0; i < L->length; i++)
    {
        if (L->date[i] == _date)
        {
            q = i;
            break;
        }
    }

    if (i >= L->length)
    {
        printf("Wrong Input!\n");
        return 0;
    }

    printf("%d\n", q + 1);
}

void GetElem(seqlist *L, int i)
{
    int *q;
    if (i < 1||i > L->length + 1)
    {
        printf("Wrong Input!\n");
        return 0;
    }

    q = &(L->date[i - 1]);
    printf("%d\n", *q);
    return 1;
}
 

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值