版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}