C 顺序列表若干操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010095372/article/details/83211856

顺序表我理解解决了c中的数组不可变长度问题,在其他语言数组都是随时增加的,不会这样子

//
//  main.c
//  C顺序表
//
//  Created by 赫凯 on 2018/10/20.
//  Copyright © 2018年 赫凯. All rights reserved.
//

#include <stdio.h>

typedef struct Seqlist{
    int * arra;
    int arra_length;
}Seqlist;

//删除顺序表
void removeElement(Seqlist *q, int i, int *a) {
    if(i > 0 && i <= q->arra_length){
        //将删除的元素先记录
        *a = q->arra[i-1];
        //从i以后的所有的元素往前排
        for (; i < q->arra_length; i++) {
            q->arra[i-1] = q->arra[i];
        }
        q->arra_length--;
    }
}

//输出顺序表
void output(Seqlist *q) {
    int i;
    for (i = 0; i < q->arra_length; i++) {
        printf(" %d", q->arra[i]);
    }
    printf("\n");
}

//将在第i个元素钱插入e
void insertElement(Seqlist *q, int i, int e) {
    int index;
    if(i > 0 && i <= q->arra_length){
        //那我就保证,在从第i个元素都往后排列一位,空出带插入的位置
        for (index = q->arra_length; index > i-1; index--) {
            q->arra[index] = q->arra[index-1];
        }
        //插入给定的值即可
        q->arra[i-1] = e;
        q->arra_length++;
    }
}

//删除最小的,空出的位置由最后一个元素补存
void deleteMinElement(Seqlist *q) {
    int i, minelement = INT32_MAX, index = 0;
    //找到最小的元素
    for (i = 0; i < q->arra_length; i++) {
        if(q->arra[i] < minelement){
            minelement = q->arra[i];
            index = i;
        }
    }
    //最后一个来y替换
    q->arra[index] = q->arra[q->arra_length-1];
    q->arra_length--;
}

//在有序自然数排列顺序表中删除在s和t之间的所有元素
void deleteElementOrder(Seqlist *q, int s, int e){
    int distance = e - s - 1;
    for (; s < q->arra_length; s++) {
        q->arra[s] = q->arra[s+distance];
    }
    q->arra_length -= distance;
}

//在有无顺序表中删除在s和t之间的所有元素
void deleteElementDisorder(Seqlist *q, int s, int e){
    int i, t, l = q->arra_length;
    for (i = 0; i < l; i++) {
        if(q->arra[i] > s && q->arra[i] < e){
            //删除完毕元素后,下标停滞
            removeElement(q, i+1, &t);
            i--;
        }
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    int arra[20] = {1,2,3,4,5,6,7,8,9,10}, index, i, k;
    
    //顺序表简单的初始化
    Seqlist seqlist, *q;
    seqlist.arra = arra;
    seqlist.arra_length = 10;
    q = &seqlist;
    
    while (1) {
        printf("1、删除,\n2、插入,\n3、删除最小的,空出的位置又最后一个元素补存\n4、在有序自然数排列顺序表中删除在s和t之间的所有元素\n5、在无序顺序表中删除在s和t之间的所有元素\n");
        scanf("%d", &index);
        if(index > 5 || index < 1){
            printf("重新来过\n");
            scanf("%d", &index);
        }else{
            switch (index) {
                case 1:
                    printf("\n删除第几个:");
                    scanf("%d", &i);
                    removeElement(q, i, &k);
                    printf("删除的是%d\n", k);
                    break;
                case 2:
                    printf("\n在第几个前面插入什么值:");
                    scanf("%d %d", &i, &k);
                    insertElement(q, i, k);
                    break;
                case 3:
                    printf("\n删除最小的,空出的位置又最后一个元素补存");
                    deleteMinElement(q);
                    break;
                case 4:
                    printf("\n在有序自然数排列顺序表中删除在s和t之间的所有元素");
                    scanf("%d %d", &i, &k);
                    deleteElementOrder(q, i, k);
                    break;
                case 5:
                    printf("\n在无序顺序表中删除在s和t之间的所有元素");
                    scanf("%d %d", &i, &k);
                    deleteElementDisorder(q, i, k);
                    break;
                default:
                    break;
                    
            }
            output(q);
        }
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u010095372/article/details/83211856