顺序表基本操作(数据结构)()

请定义一个顺序表,可以对顺序表进行如下操作:

  1. 在某个元素之前插入一些元素
  2. 删除某个位置的元素
  3. 查找某元素
  4. 获取某个位置的元素
  5. 修改某个位置元素的值
  6. 遍历输出所有元素
    键盘输入一些命令,可以执行上述操作。本题中,顺序表元素为整数,顺序表的第一个元素位置为 1,顺序表的最大长度为 20。
    各个命令以及相关数据的输入格式如下:

在某个位置之前插入操作的命令:I,接下来的一行是插入的组数 n,下面是n行数据,每行数据有两个值,分别代表插入位置与插入的元素值。

查找某个元素:S x,x是要查找的元素值。
当输入的命令为S时,请输出要查找元素的位置,如果没找到,请输出None 。

获取元素值:当输入的命令为 G 时,请输出获取的元素值,如果输入的元素位置不正确,输出“位置不正确(position error)” 。

遍历元素值:当输入的命令为 V 时,遍历输出所有的元素;

删除元素值:当输入的命令是 D 时,请输出被删除的那个元素值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”

当输入命令是 I 时,如果表满,输出“上溢”,如果输入的位置不正确,输出“位置不正确”

当输入的命令是 C 时,请输出被修改位置原来的值和修改后的值,如果表空,输出“下溢”,如果输入的位置不正确,输出“位置不正确”

注意,所有的元素均占一行!
测试输入:

I
2
1 1
2 2
S 2
D 1
I
2
1 3
2 4
G 2
C 2 9
V
E
预期输出:

2
1
4
4
9
3
9
2
请补全如下代码

#include<stdio.h> 
#include<stdlib.h>
#define MAX_SIZE 20
typedef struct SeqList {
    int data[MAX_SIZE];
    int length;
} SeqList;
void init(SeqList *list) {
    list->length = 0;
}
void get(SeqList *list, int t) {
/*该函数输出位置为t的元素的值*/
/***********Begin***********/


/************End************/
    
}

void locate(SeqList *list, int x) {
    int count = 0;
/*该函数为查找x在顺序表中的位置,若查找成功输出该元素位置,查找失败输出"None"*/
/***********Begin***********/


/************End************/
}

void insert(SeqList *list, int t, int x) {
/*在顺序表位置t之前插入元素x*/
/***********Begin***********/



/************End************/   
}

void Delete(SeqList *list, int t) {
/*删除顺序表位置为t的元素*/
/***********Begin***********/



/************End************/
}

void update(SeqList *list, int t, int x) {
/*修改位置为t的元素为x,输出原来该位置的元素和x*/
/***********Begin***********/




/************End************/     
}

//输出顺序表中的元素
void printList(SeqList *list) {
    for (int t = 0; t < list->length; t++) {
        printf("%d\n", list->data[t]);
    }
}
int main() {
    char n;
    int t, x, m;
    SeqList d;
    init(&d);
    for (;;)
     {
        scanf(" %c", &n);
        if (n == 'I') {
            scanf("%d", &m);
            for (int j = 0; j < m; j++) {
                scanf("%d %d", &t, &x);
                insert(&d, t, x);
            }
        } else if (n == 'S') {
            scanf("%d", &x);
            locate(&d, x);
        } else if (n == 'G') {
            scanf("%d", &t);
            get(&d, t);
        } else if (n == 'D') {
            scanf("%d", &t);
            Delete(&d, t);
        } else if (n == 'C') {
            scanf("%d %d", &t, &x);
            update(&d, t, x);
        } else if (n == 'V') {
            printList(&d);
        } else {
            break;
        }
    }
    return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 
#include<stdlib.h>
#define MAX_SIZE 20
typedef struct SeqList {
    int data[MAX_SIZE];
    int length;
} SeqList;
void init(SeqList* list) {
    list->length = 0;
}
void get(SeqList* list, int t) {
    /*该函数输出位置为t的元素的值*/
    /***********Begin***********/
    if (t<1 || t > list->length)
        printf("位置不正确\n");
    else
        printf("%d\n", list->data[t - 1]);


    /************End************/

}

void locate(SeqList* list, int x) {
    int count = 0;
    /*该函数为查找x在顺序表中的位置,若查找成功输出该元素位置,查找失败输出"None"*/
    /***********Begin***********/
    for (; count < list->length; count++)
    {
        if (list->data[count] == x)
        {
            printf("%d\n", count + 1);
            return;
        }
    }
    printf("None\n");

    /************End************/
}

void insert(SeqList* list, int t, int x) {
    /*在顺序表位置t之前插入元素x*/
    /***********Begin***********/
    int i, j;
    if (list->length == MAX_SIZE)
    {
        printf("上溢\n");
        return;
    }
    if (t<1 || t>list->length+1)
    {
        printf("插入位置错误\n");
        return;
    }
    
    for (i = list->length; i >= t; i--)
        list->data[i] = list->data[i - 1];

    list->data[t - 1] = x;
    list->length += 1;

    /************End************/
}

void Delete(SeqList* list, int t) {
    /*删除顺序表位置为t的元素*/
    /***********Begin***********/
    int i;
    if (list->length <= 0)
    {
        printf("下溢\n");
        return;
    }
    if (t<1 || t> list->length)
    {
        printf("删除位置错误\n");
        return;
    }
    printf("%d\n", list->data[t - 1]);
    for (i = t - 1; i < list->length - 1; i++)
        list->data[i] = list->data[i + 1];

    list->length -= 1;
    /************End************/
}

void update(SeqList* list, int t, int x) {
    /*修改位置为t的元素为x,输出原来该位置的元素和x*/
    /***********Begin***********/
    if (list->length == 0)
    {
        printf("下溢\n");
        return;
    }
    if (t<1 || t> list->length)
    {
        printf("位置不正确\n");
        return;
    }
    printf("%d\n%d\n", list->data[t - 1], x);
    list->data[t - 1] = x;


    /************End************/
}

//输出顺序表中的元素
void printList(SeqList* list) {
    for (int t = 0; t < list->length; t++) {
        printf("%d\n", list->data[t]);
    }
}
int main() {
    char n;
    int t, x, m;
    SeqList d;
    init(&d);
    for (;;)
    {
        scanf(" %c", &n);
        if (n == 'I') {
            scanf("%d", &m);
            for (int j = 0; j < m; j++) {
                scanf("%d %d", &t, &x);
                insert(&d, t, x);
            }
        }
        else if (n == 'S') {
            scanf("%d", &x);
            locate(&d, x);
        }
        else if (n == 'G') {
            scanf("%d", &t);
            get(&d, t);
        }
        else if (n == 'D') {
            scanf("%d", &t);
            Delete(&d, t);
        }
        else if (n == 'C') {
            scanf("%d %d", &t, &x);
            update(&d, t, x);
        }
        else if (n == 'V') {
            printList(&d);
        }
        else {
            break;
        }
    }
    return 0;
}


引用 皆我百晓生 小程序回复内容作答:

#include<stdio.h> 
#include<stdlib.h>
#define MAX_SIZE 20
typedef struct SeqList {
    int data[MAX_SIZE];
    int length;
} SeqList;
void init(SeqList *list) {
    list->length = 0;
}
void get(SeqList *list, int t) {
    /*该函数输出位置为t的元素的值*/
    if (t >= 1 && t <= list->length) {
        printf("%d\n", list->data[t-1]);
    } else {
        printf("位置不正确(position error)\n");
    }
}
 
void locate(SeqList *list, int x) {
    int count = 0;
    /*该函数为查找x在顺序表中的位置,若查找成功输出该元素位置,查找失败输出"None"*/
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == x) {
            printf("%d\n", i+1);
            count++;
            break;
        }
    }
    if (count == 0) {
        printf("None\n");
    }
}
 
void insert(SeqList *list, int t, int x) {
    /*在顺序表位置t之前插入元素x*/
    if (list->length == MAX_SIZE) {
        printf("上溢\n");
    } else if (t < 1 || t > list->length+1) {
        printf("位置不正确\n");
    } else {
        for (int i = list->length-1; i >= t-1; i--) {
            list->data[i+1] = list->data[i];
        }
        list->data[t-1] = x;
        list->length++;
    }
}
 
void Delete(SeqList *list, int t) {
    /*删除顺序表位置为t的元素*/
    if (list->length == 0) {
        printf("下溢\n");
    } else if (t < 1 || t > list->length) {
        printf("位置不正确\n");
    } else {
        int x = list->data[t-1];
        for (int i = t-1; i < list->length-1; i++) {
            list->data[i] = list->data[i+1];
        }
        list->length--;
        printf("%d\n", x);
    }
}
 
void update(SeqList *list, int t, int x) {
    /*修改位置为t的元素为x,输出原来该位置的元素和x*/
    if (list->length == 0) {
        printf("下溢\n");
    } else if (t < 1 || t > list->length) {
        printf("位置不正确\n");
    } else {
        int original = list->data[t-1];
        list->data[t-1] = x;
        printf("%d %d\n", original, x);
    }
}
 
//输出顺序表中的元素
void printList(SeqList *list) {
    for (int t = 0; t < list->length; t++) {
        printf("%d\n", list->data[t]);
    }
}
int main() {
    char n;
    int t, x, m;
    SeqList d;
    init(&d);
    for (;;)
     {
        scanf(" %c", &n);
        if (n == 'I') {
            scanf("%d", &m);
            for (int j = 0; j < m; j++) {
                scanf("%d %d", &t, &x);
                insert(&d, t, x);
            }
        } else if (n == 'S') {
            scanf("%d", &x);
            locate(&d, x);
        } else if (n == 'G') {
            scanf("%d", &t);
            get(&d, t);
        } else if (n == 'D') {
            scanf("%d", &t);
            Delete(&d, t);
        } else if (n == 'C') {
            scanf("%d %d", &t, &x);
            update(&d, t, x);
        } else if (n == 'V') {
            printList(&d);
        } else {
            break;
        }
    }
    return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【相关推荐】



  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7616007
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    算法思想


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^