2015-02-10 59 views
0

当我开始交换这段代码的一部分时,我一直有这个问题,所以这段代码做的是输入一个数组并使用冒泡排序方法对它进行排序。读取此文本文件有10个数字和名称。像这样:Bubble Sort in C array swapping

约翰1
标记2
马修2
路3
伊萨克4
凯恩5
瑞恩7
阿贝尔2
亚当9
伊芙10

然而当它打印出来时,它会显示:

约翰1
标记2
马修2
阿贝尔2
阿贝尔3
阿贝尔4
阿贝尔5
阿贝尔7
亚当9
伊芙10
对不起,问题是为什么它重复阿贝尔,我能做些什么来解决它?

void bubbleSort (Word q){ 
    int last = 9; 
    int Swapped = 1; 
    int i = 0; 
    int m = 0; 
    char* temp = "Hello"; 
    printf("Temp is: %s \n", temp); 
    int tempA; 
    while (Swapped == 1){ 
     Swapped = 0; 
     i = 1; 
     while (i < last){ 
      printf("%d \n", i); 
      if (q.data[i] > q.data[i+1]) { 
       printf("Hello: %d \n", i); 
       //Copy Name of Element 
       temp = q.name[i]; 
       strcpy(q.name[i], q.name[i+1]); 
       strcpy(q.name[i+1] , temp); 

       //Copy Data of corresponding element 
       tempA = q.data[i]; 
       q.data[i] = q.data[i+1]; 
       q.data[i+1] = tempA; 
       Swapped = 1; 

      } 
      i = i + 1; 
     } 
     last = last - 1; 
    } 
    last = 9; 
    while (m <= last){ 
     printf("Name: %s, Data: %d \n", q.name[m], q.data[m]); 
     m++; 
    } 
} 
+0

要排序依据的'结构data'部件上。所以,你的输出是基于该成员进行排序的。你的问题是什么? – askmish 2015-02-10 07:54:23

+1

@askmish:卢克3似乎从输出中缺失,但我同意这个问题不是很清楚。 – 2015-02-10 07:56:28

回答

0

取而代之的是:

char* temp = "Hello"; 

你应该这样做无论是这样的:

char *temp = malloc(MAX_NAME_LEN*sizeof(char)); 
//check if allocation of memory was successful or handle exceptions 

或者,这样的:

char temp[MAX_NAME_LEN]; 

然后

strcpy(temp, "Hello"); 

您需要将字符串存储到一个临时变量,指向一个实际的内存,使用它在串交换操作,在代码的后面部分。

,而不是这一点,:

//Copy Name of Element 
    temp = q.name[i];//HERE you are storing a pointer to the address, not the actual string. Both q.name[i] and temp point to the same memory 
    strcpy(q.name[i], q.name[i+1]);//Both q.name[i] and the temp pointer, with the string at q.name[i+1]. the original string in q.name[i] is lost. 
    strcpy(q.name[i+1] , temp);//You are copying the same content as in q.name[i+1]. You are not copying the original content of q.name[i] 

做到这一点:

//Copy Name of Element 
strcpy(temp, q.name[i]);//HERE you are storing the actual string 
strcpy(q.name[i], q.name[i+1]);//q.name[i] and temp contain distinct strings 
strcpy(q.name[i+1], temp);//HERE you are copying the orginal string of q.name[i]