我正在使用链接列表来存储结构。每个节点都有一个称为item_t的结构。 item_t有一个名为name的字段。我想通过交换节点中的项目(item_t)按字母顺序对名称进行冒泡排序。该算法适用于数字(整数,浮点数等),但给出的字符串结果不正确。
我猜想问题隐藏在对strcmp的错误使用中,但我阅读了所有文档,但看不到。
typedef struct item_t
/*
Definition of the item_t struct
*/
{
char *name;
float price;
}item_t;
/* structure for a node */
typedef struct node_t
{
item_t item;
struct node_t *next;
} node_t;
/* function to swap item of two nodes a and b*/
void swap(node_t *a, node_t *b)
{
item_t temp = a->item;
a->item = b->item;
b->item = temp;
}
void bubbleSortByNameAscending(node_t *start)
{
int swapped = 1;
node_t *ptr1;
node_t *lptr = NULL;
/* Checking for empty list */
if (start == NULL)
return;
while (swapped)
{
swapped = 0;
ptr1 = start;
while (ptr1->next != lptr)
{
if (strcmp(ptr1->item.name, ptr1->next- >item.name) > 0)
{
swap(ptr1, ptr1->next);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
}
}
/* Bubble sort the given linked list */
void bubbleSortByPriceAscending(node_t *start)
/* TESTED */
{
int swapped;
node_t *ptr1;
node_t *lptr = NULL;
/* Checking for empty list */
if (start == NULL)
return;
do
{
swapped = 0;
ptr1 = start;
while (ptr1->next != lptr)
{
if (ptr1->item.price > ptr1->next->item.price)
{
swap(ptr1, ptr1->next);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
}
while (swapped);
}
给出此列表:
按名称排序时,我期望得到以下结果:
但是我得到了:
iPhone8 2000.00 然后,我又添加了一个以Z开头的项目,以了解其含义:
然后我得到了
编辑:我很确定'i'!='I',而且'Z'>'i'。合理的解决方案是将所有内容都转换为小写或大写,然后再进行strcmp,但是我该如何还原所做的更改,以使“ IPHONE”成为“ iPhone”?
答案 0 :(得分:0)
我通过将带有名称的字符串复制到临时变量,strupr()(使字符串大写)临时变量并进行比较来解决了这个问题。然后,我在相应的节点中交换项目,就像一个吊饰一样。
while (swapped)
{
swapped = 0;
ptr1 = start;
while (ptr1->next != lptr)
{
char *temp1 = strdup(ptr1->item.name);
char *temp2 = strdup(ptr1->next->item.name);
strupr(temp1);
strupr(temp2);
if (strcmp(temp1, temp2) > 0)
{
swap(ptr1, ptr1->next);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
}