2016-08-17 2 views
2
void sort(struct node **s2) { 
    struct node *x, *y; 
    x = *s2; 
    char *str; 
    while (x != NULL) { 
     y = x->n; 
     while (y != NULL) { 
      if (strcmp(x->name, y->name) > 0) { 
       strcpy(str, x->name); 
       strcpy(x->name, y->name); 
       strcpy(y->name, str); 
      } 
      y = y->n; 
     } 
     x = x->n; 
    } 
} 

Это показывает ошибку времени выполнения. я не знаю, что случилось я считаю, что сортировка является правильным Этого выделения на сортировке Структура моего узла:Ошибка выполнения сортировки связанного списка строк

struct node { 
    char *name; 
    struct node *n; 
}; 

Это показывает сообщение об ошибке выполнения.

+0

Ваша функция сортировки не компилируется, вам не хватает '}' – Caw

+0

oh им жаль, что я пропустил a} здесь ... у меня есть все} в моей исходной программе – Ali

+0

Ваш алгоритм - это неустойчивый вариант sele сортировка. Его временная сложность равна ** O (N^2) **. Попробуйте реализовать сортировку слияния, гораздо более эффективный алгоритм с наихудшей временной сложностью ** O (N.log (N)) **. – chqrlie

ответ

5

char *str; ... strcpy(str,x->name); копии данных, на который указывает name на где- (это неопределенное поведение) как str является неинициализированным указатель.

Просто поменять указатели.

 if (strcmp(x->name,y->name) > 0) { 
     char *temp = x->name; 
     x->name = y->name; 
     y->name = temp; 
     } 
+0

спасибо, обменивая указатели, но я смущен - что случилось с заменой данных ?. – Ali

+3

Три причины: любая строка может не иметь места для хранения более длинной строки; и вы не выделили какую-либо память на свое пространство для царапин '* str'; и время выполнения. –

+0

получил это. Большое спасибо – Ali

0

char *str; Это заявление только создать указатель. С этим не связано память;

strcpy(char* dest, char* src) просто копирует содержимое в памяти, указываемой ЦСИ к точке памяти, Dest

В вашем случае не StR указывая на любую ячейку памяти;

strcpy(str, x->name)

так ул, указывающей ничего, это утверждение endup с ошибкой, потому что зЬгсру не удается скопировать на ул

вместо char* str; использования char str[SIZE_MAX];

+0

Я боюсь 'char str [SIZE_MAX];' не является опцией, потому что 'SIZE_MAX', максимальное значение типа' size_t', слишком велико, вероятно, больше доступной памяти и определенно слишком много для автоматической переменной. – chqrlie

Смежные вопросы