【问题标题】:Inserting into a linked list alphabetically in C [closed]在C中按字母顺序插入链表[关闭]
【发布时间】:2013-09-17 10:03:41
【问题描述】:

谁能提供一个简短的示例,说明如何使用 strcmp() 函数根据指针结构中的第一项按字母顺序将新节点插入到链表中。不是真的在寻找答案,而只是用一个模棱两可的例子来解释,无法真正找到直接的答案,所以我希望有人能帮助我。提前致谢。

【问题讨论】:

  • 展示你以前的一些作品!你的清单是什么样的?你如何遍历它? ...
  • strcmp 会告诉您您要比较的东西是在不同的东西之前还是之后.. 这样您就知道您是否在列表中走得太远了。很可能你会一直走到它说你走得太远,然后把它放在那个前面。
  • 我有一种非常强烈的冲动,想用作业来标记这个问题。看起来像一个家庭作业问题
  • @darnir 我被告知不再使用作业标签。但我同意,这看起来确实像家庭作业。对于它的价值,我会选择 xaxxon 的方法。
  • 看看这个问题的答案:stackoverflow.com/q/15960040/1025391(使用 strcmp 比较节点值)

标签: c linked-list


【解决方案1】:

你去(这个使用指向函数的指针)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct llist {
    char *value;
    struct llist *next;
};

int compare (struct llist *one , struct llist *two)
{
return strcmp(one->value, two->value);
}

void add(struct llist **pp, char *value, int (*cmp)(struct llist *l, struct llist *r)) {

    struct llist *new;
    new = malloc(sizeof(*new));
    new->value = value;

    for ( ; *pp != NULL; pp = &(*pp)->next) {
        if (cmp(*pp, new) > 0 ) break;
        }

    new->next = *pp;
    *pp = new;
}

void display(struct llist *ptr) {

    for (; ptr != NULL; ptr = ptr->next) {
        printf("%s\n", ptr->value);
    }
}

int main(void) {
    struct llist *root = NULL;

    add(&root, "item1", compare);
    add(&root, "item2", compare);
    add(&root, "item4", compare);
    add(&root, "item3", compare);

    display(root);

    return 0;
}

【讨论】:

  • 不做别人的家庭作业的哪一部分你真的不明白?此外,他说他不是在寻找答案。
  • but more just a explanation with a ambiguous example 在我看来更像是一个 un 模棱两可的例子。顺便说一句:请参阅我在 OQ 下的评论。如果他能向老师解释,他会学到很多东西。如果他不能,他无论如何都注定要失败。
【解决方案2】:

假设您的链表节点如下所示:

typedef struct node {
    char* str;
    struct node* next;
} NODE;

如果要将新节点插入到按字母排序的链表中,有四种情况需要考虑:

  1. 列表为空,因此要插入的节点是第一个/唯一的节点
  2. 要插入的节点按字母顺序在列表中的第一个节点之前
  3. 节点要插入中间
  4. 节点将被插入到列表的末尾。

但是,假设:

  1. 空列表正确设置为NULL,并且
  2. 要插入的节点的next 正确设置为NULL

您可以通过组合前两种情况和后两种情况来处理插入,这样您就只有一个逻辑选择:您将插入新节点作为第一个节点,或者作为列表中的其他节点。

这是一个处理这两种情况的简单算法。

algorithm insert

receives: list, pointer to linked list
    toInsert, pointer to new node for insertion

returns: pointer to updated list with new node inserted. 

1. if (list is null OR toInsert->value is less than list->value)  
    1.1 set toInsert->next to list
    1.2 set list to toInsert
2. else
    2.1 set pPre to list
    2.2 set pWalk to list->next
    2.3 loop while (pWalk is not null AND toInsert->value is greater than pPre->value)
        2.3.1 set pPre to pWalk;
        2.3.2 set pWalk to pWalk->next;
    2.4 set pPre->next to toInsert;    
    2.5 set toInsert->next to pWalk;
3. return

要实现这一点,您必须在ifwhile 条件中都使用strcmp()

请记住,strcmp() 按 ASCII 顺序比较字符串,而不是“按字母顺序”。就strcmp() 而言,'B''A' 之后,但在'a' 之前。如果您需要不区分大小写的严格字母排序,则必须编写自己的忽略大小写的strcmp() 版本,并在insert() 中使用函数指针。

【讨论】:

    【解决方案3】:

    如果链表已经按字母顺序排序,那么您必须迭代到应该在新节点之后的第一个节点并在它之前插入新节点。您需要记住迭代中当前节点之前的节点,因为最后一个节点的next 指针现在应该指向新节点。您可能必须以独特的方式处理某些情况,例如列表大小为零或在边界处插入。

    注意字母排序和 ascii 排序之间的区别。这不一样。 (字母:11 > 9,ascii:11

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2012-10-21
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2018-08-01
      • 2020-04-07
      • 2015-12-08
      • 1970-01-01
      相关资源
      最近更新 更多