链接列表输出未正确显示

时间:2017-01-25 14:47:47

标签: c linked-list

我无法弄清楚我的代码中的问题在哪里:

typedef struct list List;

struct list {
   int data;
   List* next;
};

void insert_sorted(List** head, int value);

int main() {
    List* head = NULL;

    /*
    insert_sorted(&head, 20);
    insert_sorted(&head, 10);
    insert_sorted(&head, 5);
    */

    insert_sorted(&head, 3);
    insert_sorted(&head, 2);
    insert_sorted(&head, 40);
    insert_sorted(&head, 10);
    //insert_sorted(&head, 40);

    List* temp = head;

    while (temp != NULL) {
        printf("%d\t", temp->data);
        temp = temp->next;
    }

    printf("\n\n");

    return 0;
}

void insert_sorted(List** head, int value) {
    List* temp = NULL;
    List* node = (List*)malloc(sizeof(List));

    node->data = value;
    node->next = NULL;

    if (*head == NULL || (*head)->data >= value) {
        node->next = *head;
        *head = node;
    } else {
        temp = *head;
        while (temp->next != NULL) {
            if (temp->data < value && (temp->next)->data > value) {
                node->next = temp->next;
                temp->next = node;
            } else
                temp = temp->next;
        }
        temp->next = node;
    }
}

1

运行代码并查看结果。 (运行和运行...)排序数据后,它会永远重复一些值。

2

转到

  //insert_sorted(&head, 40); 

此行删除注释符号。 运行代码并标记结果。(超出时间限制)

第3: 找到这个并删除评论:

   /*
insert_sorted(&head, 20);

insert_sorted(&head, 10);

insert_sorted(&head, 5);

*/

运行并查看结果; (再一些问题)

最后: 删除所有注释符号并运行它,这次它没有任何错误但没有按预期工作(列表没有正确排序);

但为什么会这样呢?任何帮助将不胜感激,我不是在家,而是学习者。

3 个答案:

答案 0 :(得分:1)

问题可以修复如下。如果节点插入中间,则函数可以返回,不需要在末尾附加值。

void insert_sorted(List** head, int value) {
    List* temp = NULL;
    List* node = (List*)malloc(sizeof(List));

    node->data = value;
    node->next = NULL;

    if (*head == NULL || (*head)->data >= value) { // <-- fix
        node->next = *head;
        *head = node;
    }
    else {
        temp = *head;
        while (temp->next != NULL) {
            if ( (temp->next)->data > value ) {
                node->next = temp->next;
                temp->next = node;
                return; // <-- fix
            }
            else
                temp = temp->next;
        }
        temp->next = node;
    }
}

答案 1 :(得分:1)

您的void insert_sorted(List** head, int value)功能正在做太多工作。

void insert_sorted(List** head, int value) {

    List* node = malloc(sizeof *node);
    node->data = value;

    for( ; *head ; head = &(*head)->next) {
          if ((*head)->data > value) break; // we should insert before *head
    }

    // When we get here *head points to the pointer that needs to get node's value
    // This can either be the original head (as supplied as argument tothe function)
    // or some of the -> next pointers, or even the last ->next pointer.
node->next = *head;
*head = node;
}

答案 2 :(得分:0)

您的代码有时会插入两次值(当值未放在列表末尾时)。这应该可以解决问题:

while(temp->next != NULL)
{
    if(temp->data < value && (temp->next)->data > value)
    {
        node->next = temp->next;
        temp->next = node;
        break;
    }
    else
        temp = temp->next;
}

if(temp->next == NULL)
    temp->next = node;