下面的代码从输入文件中读取元素,并使用动态数组对其进行快速排序。
输入文件:
4
3
6
2
1
5
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int num;
}Element;
typedef Element* List;
typedef int Location;
Location doPartition(List list,Location start,Location end){
srand(time(NULL));
int p,size=sizeof(Element),temp,r=rand()%(end-start+1);
Location i,j;
r = r + start;
temp = (list+r)->num;
(list+r)->num = (list+end)->num;
(list+end)->num = temp;
i=start-1;
j=end+1;
p=(list+end)->num;
while(1){
while(j>=start){
j--;
if((list+j)->num <= p)
break;
}
while(i<=end){
i++;
if((list+i)->num >= p)
break;
}
if(i<j){
temp = (list+i)->num;
(list+i)->num = (list+j)->num;
(list+j)->num = temp;
}
else
return j;
}
}
void quickSort(List list,int s,int e){
Location p;
if(s<e){
p=doPartition(list,s,e);
quickSort(list,s,p);
quickSort(list,p+1,e);
}
}
void Sort(List list,int list_size){
quickSort(list,0,list_size-1);
}
int main(){
FILE *fp = fopen("C:/Users/Johny/Desktop/input.txt","r");
int n,f,num,i=0,size=sizeof(Element);
List list=NULL;
while((f=fscanf(fp,"%d",&num))!=EOF){
i++;
list=(List)realloc(list,i*size);
(list+i-1)->num = num;
}
n=i;
Sort(list,n);
for(i=0;i<n;i++)
printf("%d ",(list+i)->num);
fclose(fp);
return 0;
}
我面临的问题是,当我反复运行程序时,会在随机运行中出现分段错误。为什么会发生这种情况?
答案 0 :(得分:1)
while(j>=start){
j--;
if((list+j)->num <= p)
break;
}
你对循环的测试是错误的。假设j==start
。然后循环将继续并递减j
,然后是start-1
。然后,该数组的元素可能超出范围。访问超出范围的元素会导致未定义的行为,这可能表现为分段错误。
你在这里做同样的事情:
while(i<=end){
i++;
if((list+i)->num >= p)
break;
}
答案 1 :(得分:0)
看起来很可疑
i=start-1;
j=end+1;
你可能在第一次调用dopartition时访问list -1和list + 1,导致seg fault。
答案 2 :(得分:0)
在你的文件指针中,为什么不把文件放在c文件所在的位置,这样就不必放置路径了。我觉得这可能会导致问题。