日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1-5 线性表元素的区间删除 (20 分)

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存線性表中最后一個元素的位置 */ };

這個結構體包含了一個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 分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。