1-5 线性表元素的区间删除 (20 分)
生活随笔
收集整理的這篇文章主要介紹了
1-5 线性表元素的区间删除 (20 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
給定一個順序存儲的線性表,請設計一個函數刪除所有值大于min而且小于max的元素。刪除后表中剩余元素保持順序存儲,并且相對位置不能改變。
函數接口定義:
List Delete( List L, ElementType minD, ElementType maxD );其中List結構定義如下:
typedef int Position; typedef struct LNode *List; struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存線性表中最后一個元素的位置 */ };L是用戶傳入的一個線性表,其中ElementType元素可以通過>、==、<進行比較;minD和maxD分別為待刪除元素的值域的下、上界。函數Delete應將Data[]中所有值大于minD而且小于maxD的元素刪除,同時保證表中剩余元素保持順序存儲,并且相對位置不變,最后返回刪除后的表。
裁判測試程序樣例:
#include <stdio.h>#define MAXSIZE 20 typedef int ElementType;typedef int Position; typedef struct LNode *List; struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存線性表中最后一個元素的位置 */ };List ReadInput(); /* 裁判實現,細節不表。元素從下標0開始存儲 */ void PrintList( List L ); /* 裁判實現,細節不表 */ List Delete( List L, ElementType minD, ElementType maxD );int main() {List L;ElementType minD, maxD;int i;L = ReadInput();scanf("%d %d", &minD, &maxD);L = Delete( L, minD, maxD );PrintList( L );return 0; }/* 你的代碼將被嵌在這里 */輸入樣例:
10
4 -8 2 12 1 5 9 3 3 10
0 4
輸出樣例:
4 -8 12 5 9 10
先上錯誤代碼
List Delete( List L, ElementType minD, ElementType maxD ) {int i,k,h=MAXSIZE;for(i=0;i<h;i++){if(L->Data[i]>minD&&L->Data[i]<maxD){for(k=i;k<h;k++){L->Data[k]=L->Data[k+1]; }h--;}}L->Last=L->Data+h-1;return L; }跟之前的那個題一樣也是向前移動,還不知道具體錯因。
1-4 數組元素的區間刪除 (20 分)
https://blog.csdn.net/BQDQSZ/article/details/100164636
這個結構體包含了一個int數組和一個整數;
typedef struct LNode *List; List L;這兩句又表明這道題中是想讓你用結構體指針L來訪問結構體成員:int數組。
1-4 數組元素的區間刪除 ,借助了一個新數組。這里就直接用一個新的結構體,然后返回他的地址給L即可。
但是改完后還是不對,費解。
List Delete( List L, ElementType minD, ElementType maxD ) {struct LNode b;int k=0 ;for(int i=0;i< MAXSIZE;i++){if(L->Data[i]<=minD||L->Data[i]>=maxD){b.Data[k]=L->Data[i];k++; }}b.Last=k-1;return (&b);//錯誤,函數調用完成后,&b所指的那塊存儲空間已經物是人非了!!!!!!!! }我找到錯因了,和之前的某道題一樣:忘了局部變量在函數調用完成后就不存在了,所以返回的地址不是指向結構體的。應該使用動態分配。
修改后(20分):
List Delete( List L, ElementType minD, ElementType maxD ) {struct LNode *B;B=(struct LNode *)malloc(sizeof(struct LNode ));//!!!!!!!!!int i,k=0 ;for( i=0;i<=L->Last;i++){if(L->Data[i]<=minD||L->Data[i]>=maxD){B->Data[k]=L->Data[i];k++; }}B->Last=k-1;return (B); }還有這種思路我想不到(正確答案):
List Delete( List L, ElementType minD, ElementType maxD ) {int i,count=0;for(i=0;i<=L->Last;i++){if(L->Data[i]<maxD&&L->Data[i]>minD)//若當前元素在區間內,count+1 count++;elseL->Data[i-count]=L->Data[i];/*若當前元素不在區間內,把當前元素向前移動count單位,并替換Data[i-count]*/ }L->Last=L->Last-count;return L; }總結
以上是生活随笔為你收集整理的1-5 线性表元素的区间删除 (20 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring中Bean的概念
- 下一篇: 【板栗糖GIS】arcmap—如何通过影