在C中按字母顺序插入链表

时间:2013-09-12 20:50:02

标签: c linked-list

任何人都可以提供一个简短的示例,说明如何使用strcmp()函数根据指针结构中的第一项按字母顺序将新节点插入到链表中。不是真的在寻找答案,但更多只是一个含糊不清的例子的解释并不能真正找到答案,所以我希望有人可以帮助我。提前谢谢。

3 个答案:

答案 0 :(得分:3)

你去(这个使用指向功能的指针)

#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;
}

答案 1 :(得分:1)

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

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

如果要将新节点插入按字母顺序排序的链接列表,则需要考虑四种情况:

  1. 列表为空,因此要插入的节点是第一个/唯一的节点
  2. 要插入的节点按字母顺序排在列表中的第一个节点
  3. 之前
  4. 将节点插入中间
  5. 该节点将插入列表的末尾。
  6. 但是,假设:

    1. 空列表已正确设置为NULL
    2. 要插入的节点已将next正确设置为NULL
    3. 您可以通过组合前两种情况和后两种情况来处理插入,这样您只有一个逻辑选择:您将新节点作为第一个节点插入,或者作为列表中的某个其他节点插入。

      这是一个解决这两种情况的直接算法。

      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
      

      要实现此目的,您必须在strcmp()if条件下使用while

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

答案 2 :(得分:0)

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

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