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