Сравнение строк с созданным пользователем классом строк - PullRequest
1 голос
/ 29 марта 2010

Для этого задания мне пришлось создать свой собственный класс строки. Первоначально я написал метод сравнения для сравнения двух строк, но возвращаю в зависимости от того, что больше. То, что я хочу сделать, это сравнить и вернуть ту, которая в алфавитном порядке больше, то есть сравнивать две строки, например: smith и htims. Благодаря тому, как я разработал метод сравнения, результат будет равным. Что я хочу сделать, так это сказать мне, какой из них идет первым в алфавитном порядке, поэтому для моего примера на первом месте будет htims. Я понимаю, как сделать это в 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;

Любые предложения, все мои поиски в Google связаны с использованием библиотеки <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
}

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Попробуйте сравнить следующие пары строк:

"ABC" против "DEF"

"ADF" против "BBB"

"ABC" против "CBA"

Какие результаты вы получаете? Что более важно, почему? Как эти результаты сравниваются с тем, что вы хотите получить?

(Сначала вы должны решить это в своей голове. Определите значения c1 и c2 для каждого шага цикла сравнения.)

0 голосов
/ 29 марта 2010

Во-первых, ln неправильно инициализирован в образце removeStudent(), поэтому вызов ln->compareTo, вероятно, вызовет ошибку сегмента. Надеюсь, ln правильно инициализируется в вашем фактическом коде.

Чтобы определить порядок строк, вы можете сначала определить то, что известно в кругах базы данных как «сопоставление»: порядок символов. Вы можете реализовать сопоставление как функцию (называемую, скажем, chrcmp) или встроенную в вашей функции сравнения строк. Важно определить это.

Вообще говоря, упорядочение по типу вызывает лексикографический порядок по последовательностям этого типа: для сравнения двух последовательностей найдите первое место, где они различаются; меньшая последовательность - та, у которой меньший элемент находится в этой позиции.

Более формально: предположим, что последовательности индексируются начиная с 0. Пусть a и b будут последовательностями базового типа длины m и n соответственно. Лексикографический порядок a ≤ b:

  • a i R b i и a j = m j для всех 0 ≤ j a a = b, если m = n и a i = b i для всех 0 ≤ i

Где "a является префиксом b" означает m i = b i для всех 0 ≤ i

Преимущество этого подхода состоит в том, что вы можете написать функцию сравнения, которая будет работать с любым однородным типом последовательности: строки, списки строк, массивы целых чисел, что-у-вас. Если вы специализируете функцию сравнения для строк с нулевым символом в конце, вам не нужно беспокоиться о случаях префиксов; просто '\ 0' будет наименее символом в сопоставлении.

Из общей функции сравнения (называемой, скажем, lexiCompare) вы можете определить

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

и присвойте элементу String compareTo значение lexicCompareString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...