2012-04-26 56 views
2

我在使用指針算法而不是使用常規索引表示法執行選擇排序時遇到了問題。我必須這樣做的原因是課堂作業。整個過程是學習如何使用沒有「騙子索引」(pointer + i)的指針算術,其中i就是這樣的索引:array[i]使用指向數組元素的指針進行選擇排序

在我調用我的排序函數之前,我分配了1000個結構的數組。 typedef如下:

typedef struct 
{ 
    char* name; 
    char* art; 
    int rating; 
} ENTRY; 

這個想法是,我讀了一個包含ASCII藝術的文件。每件藝術品都被扔進自己的結構中。下面是文本文件中的一個「入口」:

Jean Pajerek 
    |\_____/| 
    |[o] [o]| 
    | V | 
    |  | 
-ooo---ooo- 
# 4 

這是一隻貓頭鷹!但我需要做的是將名稱,藝術和評分存儲在結構的相應字段中。我的閱讀功能完美運作。我分配1000個結構的數組,然後只是將文本文件讀入它。它只包含18張圖片,所以不用擔心。

現在讓我們來談談我的選擇排序功能。我首先看看使用索引符號的整數數組的選擇排序算法,然後嘗試使其適應我的要求。

  1. 使用指針運算
  2. 周圍的結構,而不是整數

所以搬到這裏來的代碼:

void sort(ENTRY* aryptr, int* counter) 
{ 
    ENTRY* slow; 
    ENTRY* fast; 
    ENTRY* lastmin; 
    ENTRY min; 
    ENTRY temp; 
    int i; 
    int j; 

    printf("\n\n...SORTING\n\n\n"); 

    slow = aryptr; 

    for (i=0; i < *counter - 2; i++) 
    { 
     min = *slow;   

     fast = slow + 1; 
     for (j = i + 1; j < *counter-1; j++) 
     { 
      if (strcmp(fast->name, min.name) < 0) 
      { 
       min = *fast; 
       lastmin = fast; 
      } 
      fast++;   
     } 

     temp = *slow; 
     *slow = min; 
     *lastmin = temp; 

    slow++;  

    } 
} 

我使用ij作爲計數器,因爲我覺得測試對於像walker->name != NULL這樣的東西是不安全的。 (我是否應該嘗試使用NULL測試呢?它對我來說看起來更符合邏輯「如果我能保證最後一個元素後面的東西,實際上是NULL ......)不管我用什麼來跟蹤我的緩慢和快速指針的位置,我有這樣的問題。

問題是這樣的:我有這個art.txt文件與一堆不同的藝術作品。一些藝術作品是由同一個人。

VOLDEMORT 
(art is hippogryph) 
# 1 
EDDARD STARK 
(art is turtle) 
# 4 
EDDARD STARK 
(art is owl) 
# 3 
TONY STARK 
(art is blob) 
#1 
EDDARD STARK 
(art is dragon) 
#5 

當我完成排序後,同一作者的作品將在數組中相鄰。我不關心同一個人的藝術秩序。假設我用我的代碼排序:我得到了這樣的東西。

EDDARD STARK 
(art is turtle) 
# 4 
EDDARD STARK 
(art is owl) 
# 3  
EDDARD STARK 
(art is dragon) 
#5 
EDDARD STARK 
(art is turtle) 
# 4 
TONY STARK 
(art is blob) 
#1 
VOLDEMORT 
(art is hippogryph) 
# 1 

EDDARD STARK所分類的藝術品將在該塊的END中擁有該藝術品的第一部分的副本。我查看了我的邏輯,打印了各種要調試的內容,但我仍然無法弄清楚問題所在。我想我不能看到它,因爲我已經看了我自己該死的代碼這麼久了。有任何想法嗎?

+1

我喜歡貓頭鷹。 – st0le 2012-04-26 06:26:50

回答

1
void sort(ENTRY* aryptr, int* counter) 
{ 
    ENTRY* slow; 
    ENTRY* fast; 
    ENTRY* lastmin; 
    ENTRY min; 
    ENTRY temp; 
    int i; 
    int j; 

    printf("\n\n...SORTING\n\n\n"); 

    slow = aryptr; 

    for (i=0; i < *counter - 2; i++) 
    { 
     min = *slow;   

     fast = slow + 1; 
     for (j = i + 1; j < *counter-1; j++) 
     { 
      if (strcmp(fast->name, min.name) < 0)//comparison 
      { 
       min = *fast;//save data to min 
       lastmin = fast;//save position to last min 
      } 
      fast++;//increment index 
     } 

     //problematic, always swapping. need if statement. Lastmin 
     //May go unassigned, then "slow" will be duplicated to "lastmin" 
     temp = *slow; 
     *slow = min; 
     *lastmin = temp;//at first run through 

    slow++;  //increment index 

    } 
} 
+0

我花了一段時間才明白自己需要什麼條件,但現在就按照需要使用它了!不敢相信我沒有看到如此明顯的事物。 謝謝! – GrinReaper 2012-04-26 08:13:19

相關問題