C 順序列表若干操作
阿新 • • 發佈:2018-11-01
順序表我理解解決了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;
}