Post

hw2.顺序表元素划分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream> 
using namespace std;
class SqList{
public:
	int* data;
	int capacity; 
	int length; 
	SqList(int n){ 
		data=new int(n); 
		}; 
	}; 
	
int main(){ 
	//处理第一行输入 
	int k1,k2; 
	cin>>k1>>k2; 
	
	if(k1>k2){ 
		return false; 
	} 
	
	//第二行输入 
	int n; cin>>n; 
	//存储第三行输入 
	SqList list(n); 
	for(int i=0;i<n;i++){ 
	cin>>list.data[i]; 
	} 
	
	int* help=new int(n); //辅助数组
	int j=0; 
	for(int i=0;i<n;i++){ 
		if(list.data[i]<k1){ 
			help[j]=list.data[i]; 
			j++; 
		} 
	} 
	cout<<j; 
	
	for(int i=0;i<n;i++){
	 if(list.data[i]>=k1&&list.data[i]<k2){ 
		 help[j]=list.data[i]; 
		 j++; 
		}
	} 
	cout<<j; 
	
	for(int i=0;i<n;i++){ 
		if(list.data[i]>=k2){ 
			help[j]=list.data[i]; 
			j++; 
		} 
	} 
	
	list.data=help; 
	delete list.data; 
	delete help; 
	
	return 0; 
	} 

结果:出现运行时错误

  • 内存分配错误:在 SqList 构造函数中,你的内存分配代码 data = new int(n); 并不是为 data 分配一个大小为 n 的数组,而是分配了一个单独的整数,值为 n。正确的分配方式应该是==data = new int[n];==,这样才能为 data 分配一个大小为 n 的数组。

  • 内存释放错误:当你释放 datahelp 时,使用了 delete 而不是 delete[]。对于数组,应该使用 delete[] 来正确释放内存,否则会导致未定义行为。

  • 错误的返回类型main 函数应返回整数类型,不应该返回 false。返回 0 代表程序成功结束。

  • delete[] help 错误释放:之前代码里已经把 list.data 指向了 help,因此直接释放 help 会导致程序错误,因为 list.datahelp 指向的是同一块内存。

This post is licensed under CC BY 4.0 by the author.