链表并按字母顺序排序

时间:2019-01-17 21:11:10

标签: c sorting linked-list alphabetical

我正在使用链接列表来存储结构。每个节点都有一个称为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);
}

给出此列表:

  1. 列表项
  2. S7Edge 1500.00
  3. iPhone7 1000.00
  4. iOS10 0
  5. Android 0

按名称排序时,我期望得到以下结果:

  1. Android 0
  2. iOS 0
  3. iPhone7 1000.00
  4. iPhone8 2000.00
  5. S7Edge 1500.00

但是我得到了:

  1. Android 0
  2. S7Edge 1500.00
  3. iOS 0
  4. iPhone7 1000.00
  5. iPhone8 2000.00 然后,我又添加了一个以Z开头的项目,以了解其含义:

    • Android 0
    • iOS 0
    • iPhone7 1000.00
    • iPhone8 2000.00
    • S7Edge 1500.00
    • Zoidberg 0

然后我得到了

  • Android 0
  • S7Edge 1500.00
  • Zoidberg 0
  • iOS 0
  • iPhone7 1000.00
  • iPhone8 2000.00

编辑:我很确定'i'!='I',而且'Z'>'i'。合理的解决方案是将所有内容都转换为小写或大写,然后再进行strcmp,但是我该如何还原所做的更改,以使“ IPHONE”成为“ iPhone”?

1 个答案:

答案 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;
            }