2010-03-28 56 views
1

對於這個任務我必須創建我自己的字符串類。我最初編寫compareto方法來比較兩個字符串,但返回的是較大者。我想要做的是比較並返回哪個字母大,即比較兩個字符串,例如:smith和htims。用我設計compareto方法的方式是,結果是它們是平等的。我想要做的是告訴我哪個字母是按字母順序排列的,因此對於我的例子來說,受害者會先來。我知道如何在Java或甚至C語言中使用<string.h>庫來實現這一點,我只是對自己如何做到這一點感到困惑。比較字符串和用戶創建的字符串類

編輯:我只是想指出,我不是在尋找代碼的答案,而是在我應該如何寫代碼微調。

int compareto(void * S1, void * S2){ 
    String s1 = (String S1); 
    String s2 = (String S2); 
    int i, cs1 = 0, cs2 = 0; //cs1 is count of s1, cs2 is count of s2 

    while(s1->c[i] != '\0'){ //basically, while there is a word 
     if(s1->c[i] < s2->c[i]) // if string 1 char is less than string 2 char 
      cs2++; //add to string 2 count 
     else (s1->c[i] > s2->c[i]) //vice versa 
      cs1++; 
     i++; 
    } 

//for my return I basically have 

     if(cs1>cs2){ 
     return 1; 
    } 
    else if(cs2 > cs1){ 
     return 2; 
    } 
    return 0; 

這裏是mystring.h

typedef struct mystring { 
    char * c; 
    int length; 

    int (*sLength)(void * s); 
    char (*charAt)(void * s, int i); 
    int (*compareTo)(void * s1, void * s2); 
    struct mystring * (*concat)(void * s1, void * s2); 
    struct mystring * (*subString)(void * s, int begin, int end); 
    void (*printS)(void * s); 

} string_t; 
typedef string_t * String; 

任何建議,我所有的谷歌搜索涉及使用<string.h>庫,所以我有沒有運氣。

我使用它來遍歷鏈表,並刪除姓的名字與用戶試圖刪除的人相匹配的人。
這裏是我的測試代碼,以幫助澄清我的問題(注意的compareTo是在刪除功能):

int main() { 
    Node startnode, currentnode, newnode; 
    int ans, success; 
    String who; 
    who = newString2(); 

    startnode = (Node) malloc(sizeof(pq_t)); 
    startnode->next = NULL; 
    currentnode = startnode; 
    ans = menu(); 
    while (ans != 0) { 
     switch (ans) { 
     case add: 
      newnode = getStudent(); 
      startnode = insert(newnode, startnode); 
      break; 
     case remove: 
      printf("Enter the last name of the person you want to delete : \n"); 
      scanf("%s", &who->c); 
      startnode = removeStudent(startnode, who, &success); 
      if (success == 0) 
       printf("UNFOUND\n"); 
      else 
       printf("permanently DELETED\n"); 
      break; 

     case view: 
      printf("Now displaying the list : \n"); 
      displaylist(startnode); 
      break; 
     } 
     ans = menu(); 
    } 
} 

Node removeStudent(Node head, String who, int * success) { 
    Node p, l; //p = pointer node, l = previous node 
    Student current; //Im using generics, so I have to case the current node->obj as a student. 
    String ln, cln; //the last name of the person I want to remove, and the last name of the current node 

    p = head; 
    l = p; 
//there can be three cases, p->first node, p->last node, p->some node in between 
    if (head->obj == NULL) { 
     printf("The list is empty\n"); //when the list is empty 
     *success = 0; 
     return NULL; 
    } 
    while (p != NULL) { 
     current = (Student) p->obj; 
     cln = current->ln; 
     if (ln->compareTo(who, cln) == 0) { 
      if (head == p) { //when there is only one node 
       head = head->next; 
       free(p); 
       *success = 1; 
       return head; 
      } else if (p->next == NULL) { //last node 
       l->next = NULL; 
       free(p); 
       *success = 1; 
       return head; 
      } else { 
       l->next = p->next; //middle 
       free(p); 
       *success = 1; 
       return head; 
      } 
     } 
     l = p; 
     p = p->next; 
    } 
    *success = 0; 
    return head;//couldnt find the node 
} 
+0

在搜索列表時,您不想要什麼順序。你想要按字母順序排列的ASCII-betical(http://catb.org/jargon/html/A/ASCIIbetical-order.html)還是其他的東西?你想改變你的'compareto'函數,還是定義另一個?另外,爲什麼你將'void *'傳遞給函數,而不是'String *',這將使它們類型安全?你把函數指針放在'string_t'中來實現繼承還是封裝?你的海明距離比較算法的推理是什麼? – outis 2010-03-29 00:08:07

+0

我的目標是按字母順序排序。我使用這個功能的目的是通過姓氏從鏈表中刪除一個人。 void *的原因是因爲我們必須使用泛型來完成這項任務,以瞭解它們的工作原理。 – meepz 2010-03-29 00:24:30

+0

通過幾個例子,你的問題將會大大地解釋**。如果你以單元測試的形式編寫例子,你甚至可以看到你的代碼是否適合這些例子。 – 2010-03-29 01:46:27

回答

1

嘗試比較以下字符串對:

「ABC」與「DEF」

「ADF」 與 「BBB」

「ABC」 與 「CBA」

你會得到什麼樣的結果?更重要的是,爲什麼?這些結果與你想要得到的結果相比如何?

(你應該先解決它在你的頭上。鍛鍊身體的C1和C2的值進行比較循環的每個步驟。)

+0

我得到的結果是:2,1,2. 這些結果只是告訴我哪個字符串累積地比我想要得到的字符串更大(或按順序)。我知道如何在java中編寫這個代碼,並且使用,我只是困惑於如何自己編寫代碼。我會繼續嘗試去思考它 – meepz 2010-03-29 01:30:56

+0

問問你自己,你知道哪一個字符串是第一個:「ABC」或「ACB」。然後,「AABC」與「AACC」。你這樣做就像你想要電腦一樣,所以慢一點,弄清楚你在做什麼。將其轉化爲代碼應該相當簡單。 – CWF 2010-03-29 02:46:52

0

首先,ln沒有正確的樣品removeStudent()在初始化,因此調用ln->compareTo可能會導致段錯誤。希望ln已在您的實際代碼中正確初始化。

要定義字符串排序,您可以首先定義數據庫圈中已知的「排序規則」:字符排序。您可以將排序規則實現爲函數(稱爲chrcmp),也可以內聯在字符串比較函數中。重要的是要定義它。

一般而言,某種類型的排序會在該類型的序列上產生lexicographic order:比較兩個序列,找到它們不同的第一個地方;較小的序列是在該位置具有較小元素的序列。

更正式地,假設序列索引從0開始。讓一個b基類型長度米分別Ñ,的是序列。詞典順序一個≤b爲:

  • 一個< b其中a R B 並用於所有0≤Ĵ<我
  • 一個< B A Ĵ =米Ĵ如果A是b的前綴
  • A = b如果m = n和一個 = b 對於所有0≤我<米

其中, 「A是B的前綴」 是指米< n和一個 = B 對於所有0≤我<米。

這種方法的優點是你可以編寫一個比較函數,它可以與任何homogeneous序列類型一起工作:字符串,字符串列表,整數數組,什麼是你。如果您專門針對以空字符結尾的字符串比較函數,則不需要擔心前綴的情況;只需將'\ 0'作爲整理中的最小字符。

從一般比較功能(稱爲比如說,lexiCompare),你可以定義

lexicCompareString (a, b): 
    return lexicCompare(a, b, chrcmp) 

和字符串的compareTo成員設置爲lexicCompareString