1. 程式人生 > >C 順序列表若干操作

C 順序列表若干操作

順序表我理解解決了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; }