1. 程式人生 > >數據結構——線性表順序表示(5)

數據結構——線性表順序表示(5)

main pau 測試 sca 信息 線性 %d 數據結構 all

題目來源於王道2018數據結構考研復習指導線性表的綜合練習

編譯環境:VS2015

題目:從順序表中刪除其值在給定s與t之間(包含s和t,要求s<t)的所有元素,如果s或t不合理或者順序表為空,則顯示出錯信息並退出運行。

註意:這道題目與上一道有所不同。上一道題目所要求的表是有序表,而這道題則沒要求,因此要考慮亂序的情況。

思路:舉個例子,隨意給一個順序表的元素為{1,5,4,2,3,6},需要刪除的數字區間是閉區間[2,5],計數變量j=0,記錄在閉區間的數的個數

具體流程:

i=0, L.data[i]=1, 不屬於閉區間[2,5], L.data[i-j]=L.data[0]=1;i++

i=1, L.data[i]=5, 屬於閉區間[2,5],刪除,i++,j=1

i=2, L.data[i]=4, 屬於閉區間[2,5],刪除,i++,j=2

i=3, L.data[i]=2, 屬於閉區間[2,5],刪除,i++,j=3

i=4, L.data[i]=6, 不屬於閉區間[2,5], L.data[1]=L.data[i]=6

由此不難得出,當第k個元素不屬於閉區間[s,t]時,需要將它保留,它在線性表中的位置取決於它前面的部分含有幾個在閉區間的元素,將它在原線性表中下表減去它前面需要被刪除的元素的個數,就得到它在新的線性表中的下標。

具體實現:

#include<stdio.h>
#include<stdlib.h>
#define initSize 50

typedef int ElementType;
typedef struct {
    ElementType *data;
    int length;
    int maxSize;
}SeqList;

//初始化線性表
void InitList(SeqList &L) {
    L.data = (ElementType*)malloc(sizeof(ElementType)*initSize);
    L.length 
= 0;//置為空表 L.maxSize = initSize; } //創建順序表 void CreateList(SeqList &L, int n) { L.length = n; for (int i = 0;i < n;i++) { scanf_s("%d", &(L.data[i])); } } bool DeleteST(SeqList &L, int s, int t) { int i, j= 0;//j為計數變量,用來記錄在區間[s,t]的個數 if ((s >= t) || (L.length == 0)) return false; for (i = 0;i < L.length;i++) { if (L.data[i] >= s && L.data[i] <= t) j++; else L.data[i-j] = L.data[i]; } L.length -= j; return true; } //顯示 void ShowList(SeqList L) { for (int i = 0;i < L.length;i++) { printf_s("%3d", L.data[i]); } } int main() { SeqList L; int length, s, t; InitList(L); printf_s("輸入表的長度:"); scanf_s("%d", &length); printf_s("\n輸入初始值:"); CreateList(L, length); printf_s("輸入要刪除的數字範圍區間:"); scanf_s("%d %d", &s, &t); DeleteST(L, s, t); printf_s("\n刪除後的順序表的元素如下:"); ShowList(L); printf_s("\n"); system("pause"); return 0; }

測試結果:

技術分享  

數據結構——線性表順序表示(5)