【问题标题】:C Linked list inserting element in a sorted wayC链表以排序方式插入元素
【发布时间】:2014-12-04 22:18:27
【问题描述】:

嘿,我需要以排序的方式将一个元素插入到链表中。每个元素都有 isbn ,我需要对链表进行排序。它之所以有效,是因为它在头部插入了最小的元素,但就是这样,其余的似乎是以随机方式排序的。 这是我的代码

void insertABook(linkedlist *root, linkedlist *newbook)
{ 
    if ((root==NULL) && (root->ptr==NULL))
    {
        root->ptr=newbook;
    }
    else
    {
        linkedlist *next = root;
        while((next->ptr != NULL) && (next->isbn < newbook->isbn))
        {
            next = next->ptr;
        }
        newbook->ptr=next->ptr;
        next->ptr=newbook;
    }
}

root 参数是虚拟节点(NULL),newbook 参数是要插入的新元素。我用这个方法一个一个的添加元素。

【问题讨论】:

  • (next-&gt;isbn &lt; newbook-&gt;isbn) 中,您不是比较 ISBN,而是比较字符串指针。使用(strcmp(next-&gt;isbn, newbook-&gt;isbn) &lt; 0)。我知道 ISBN 是字符串而不是数字,因为最后一个字符可以是 X。
  • 没关系我找到了解决方案,问题是我正在比较 next->isbn 编号而不是 next->ptr->isbn
  • if ((root==NULL) &amp;&amp; (root-&gt;ptr==NULL)) --> if ((root!=NULL) &amp;&amp; (root-&gt;ptr==NULL)) ??

标签: c sorting insert linked-list


【解决方案1】:

参数根是一个值,它是存储在根中的地址。
我猜你的代码。

    linkedlist *root = NULL, *newbook;
    while (...) {   // or for( , , )
        newbook = malloc(sizeof(linkedlist));
        // edit newbook
        insertABook(root, newbook);
              :
              :

至少有 3 种方式。
1. insertABook() return linkedlist* 存放根目录。

        root = insertABook(root, newbook);

2。将根更改为链表**。我想这就是你想要的答案。

void insertABook(linkedlist **root, linkedlist *newbook) {
    if (*root==NULL) {
        *root=newbook;
    }
    else {  // insert or append
        linkedlist  *next = *root;
            :
            :

调用者

        insertABook(&root, newbook);

&root 是根的地址。

  1. root 在源文件中是全局的。

    static linkedlist   *root = NULL;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多