Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速排序C-分段错误_C_Pointers_Segmentation Fault_Quicksort - Fatal编程技术网

快速排序C-分段错误

快速排序C-分段错误,c,pointers,segmentation-fault,quicksort,C,Pointers,Segmentation Fault,Quicksort,我制作了一个单链表。现在我想做一个快速排序,但我遇到了分段错误,无法找到问题所在 Invalid read of size 8 at 0x400659: quicksort (liiista.c:23) by 0x4008FE: main (liiista.c:117) Address 0x0 is not stack'd, malloc'd or (recently) free'd 第23行如下: while( (strcmp(arr[left]->ele,ar

我制作了一个单链表。现在我想做一个快速排序,但我遇到了分段错误,无法找到问题所在

Invalid read of size 8
   at 0x400659: quicksort (liiista.c:23)   
   by 0x4008FE: main (liiista.c:117)
   Address 0x0 is not stack'd, malloc'd or (recently) free'd
第23行如下:

while( (strcmp(arr[left]->ele,arr[pivot]->ele) <= 0) && left < end)
while((strcmp(arr[left]->ele,arr[pivot]->ele)ele,arr[pivot]->ele)ele,arr[pivot]->ele,arr[pivot]->ele)>0)){
对--;
}
if(leftele;
arr[left]->ele=arr[right]->ele;
arr[右]->电气=温度;
}                       
}
温度=arr[枢轴]->ele;
arr[pivot]->ele=arr[right]->ele;
arr[右]->电气=温度;
快速排序(&(*arr),开始,右-1);
快速排序(&(*arr),左+1,结束);
} 
}
无效插入(tList*myList,char*ele){
tList节点=(tList)malloc(sizeof(struct celda));
节点->ele=ele;
节点->下一步=*myList;
*myList=节点;
}
int main(){
tList myList=NULL;
插入(&myList,“a”);
插入(&myList,“b”);
插入(&myList,“c”);
插入(&myList,“d”);
插入(&myList,“e”);
快速排序(&myList,0,4);
返回1;
}
我试图找出错误,但找不到。
提前感谢!

在您的
快速排序
函数中,它预期会被传递一个指向
struct celda
的指针数组,但是您正在传递链接列表中第一个节点的地址。您不能这样混淆数据结构。

这将是学习如何使用de运行程序的好时机bugger。这会让你准确地看到程序崩溃的地方,并检查相关的变量值,这将有助于查明问题。@JimLewis抱歉,我忘了放终端显示的内容。我编辑了帖子。
tLista
tList
之间有什么区别?@Wimmel抱歉,我输入错了。我翻译了西班牙语单词我将指针传递给指向列表第一个节点的指针。然后我使用数组索引获取列表中的元素。我的意思是:
tList*p=&myList;
Then
p[0]->ele
myList->ele
相同,但它不是这样工作的。创建链接列表时,列表中的下一个节点可以位于内存中的任何位置。元素不是按顺序排列的,因此必须通过
next
指针遍历列表。
typedef struct celda{
  char* ele;
  struct celda *next;
}*tList;


void quicksort(tLista *arr, int begin, int end){
  char* temp;
  int left, right, pivot;

  if(begin < end){

    pivot = begin;
    left = begin;
    right = end;


    while(left < right){
        while( (strcmp(arr[left]->ele,arr[pivot]->ele) <= 0) && left < end) {
            left++;
        }   
        while( (strcmp( arr[right]->ele, arr[pivot]->ele) > 0)){
            right--;        
        }
        if(left<right){
            temp = arr[left]->ele;
            arr[left]->ele = arr[right]->ele;
            arr[right]->ele = temp;
        }                       
    }

    temp = arr[pivot]->ele;
    arr[pivot]->ele = arr[right]->ele;
    arr[right]->ele = temp;

    quicksort(&(*arr),begin,right-1);
    quicksort(&(*arr),left+1, end);

  } 
}

void insert(tList *myList, char* ele){

  tList node = (tList)malloc(sizeof(struct celda));
  node->ele = ele;
  node->next = *myList;
  *myList = node;

}


int main(){

  tList myList = NULL;
  insert(&myList,"a");
  insert(&myList,"b");
  insert(&myList,"c");
  insert(&myList,"d");
  insert(&myList,"e");

  quicksort(&myList,0,4);

  return 1;
}