2016-08-17 78 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

哦,即时对不起,我错过了一个}在这里...我已经在我的原始程序} – Ali

+0

你的算法是一个不稳定的sele变体ction排序。它的时间复杂度是** 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

通过指出SRC记忆点在你的情况STR没有指向任何内存位置内存中的内容;

strcpy(str, x->name)

因为STR指向什么,有错误这种说法endup因为strcpy的无法复制为str的

代替char* str; 使用char str[SIZE_MAX];

+0

恐怕'char str [SIZE_MAX];'不是选项,因为'size_t'类型的最大值'SIZE_MAX'太大了,可能比可用内存大,而且绝对自动变量太多了。 – chqrlie