程序不打印我需要打印的内容

时间:2016-11-04 15:31:10

标签: c linked-list

我想创建一个已排序的链表,因此每次插入一个元素时,都应该对它进行排序(按升序排序)。现在我已经制作了一个排序链表。该计划工作正常,但有一个问题。它不会在已排序的链表中打印中间和最后插入的元素,即使它已被插入。

我的代码是

 //Libraries
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>


struct Node{

    int val;
    struct Node  *next;
};

struct LLADT{

    struct Node *head;
};


// Initializing Linked List
void init(struct LLADT *LL){
    LL->head = 0;
}

// Sorted Inserted Linked List Function
void sortInsert(struct LLADT *LL, int num){
    struct Node *temp;
    struct Node *temp2;
    temp = (struct Node*)malloc(sizeof(struct Node));



// If list is Empty
    if(LL->head == 0){
        temp-> val = num;
        temp->next = NULL;
        LL->head = temp;
        return;
    }

// When list is not empty and key is smallest

    if(num < LL->head->val){
        temp-> val = num;
        temp->next = LL->head;
        LL->head = temp;
        return;

    }
// When list is not empty and we have to insert in middle
    temp2 = LL->head;
    temp-> val = num;
    temp->next = NULL;
    while(temp2->next !=0){
        if(num > temp2->next->val){
            temp2 = temp2->next;
        }
        else{

            temp2->next = temp->next;
            temp->next = temp2;
            return;
        }

    }


// When list is not empty and we have to insert at the end
    if(num > temp->val){

        temp->val = num;
        temp->next = NULL;
        temp2->next = temp;
        return;


    }
}

//Printing Linked List
void print_list(struct LLADT *LL){
    struct Node *temp;
    temp = LL-> head;
    while(temp !=0){
        printf("%d\n", temp->val);
        temp = temp -> next;
    }
}

// Main Function
int main(){

    struct LLADT LL;
    init(&LL);

    // inserting
    sortInsert(&LL,17);
    sortInsert(&LL,3);
    sortInsert(&LL,5);
    sortInsert(&LL,2);
    sortInsert(&LL,1);
    sortInsert(&LL,20);

    //Printing
    print_list(&LL);
    getch();
    return 0;
}

该计划的输出是:

1
2
3

我正在使用Visual Studio 2012 Ultimate。

2 个答案:

答案 0 :(得分:1)

插入列表中间时的逻辑错误:

temp2->next = temp->next;
temp->next = temp2;

此时,您希望在temp之后立即插入新节点temp2。但相反,您有temp2后跟temp->next的初始值,即NULL,然后您temp后跟temp2(与 ---------------- temp --> | num | NULL | ---------------- ---------------- ---------------- temp2 --> | v1 | . --|---> | v2 | . --|--> ... ---------------- ---------------- 相反你想要的。

所以你有这个:

                                temp --|
                                       v
           ----------------     ----------------    ----------------
temp2 -->  | v1   |   . --|---> | num   |   . --|--> | v2   |   . --|--> ...
           ----------------     ----------------    ----------------

你想要这个:

temp->next = temp2->next;
temp2->next = temp;

所以你这样做:

NULL

另外,在分配或检查NULL指针时,始终使用0而不是{{1}}。在大多数情况下,它们是相同的,但标准并没有说它们必须是。

答案 1 :(得分:1)

这是一个简化版本。它检查新节点是否属于列表的开头,作为开头的特殊情况。它循环遍历列表,直到找到正确的位置或列表的末尾。

// Sorted Inserted Linked List Function
void sortInsert(struct LLADT *LL, int num)
{
    struct Node *newNode;
    struct Node *currentNode;
    struct Node *previousNode;

    // Initialise a new node for the new value.
    newNode = malloc(sizeof(struct Node));
    newNode->val = num;

    // If list is Empty or the new node is first in the list.
    if((NULL == LL->head) || (num < LL->head->val))
    {
        newNode->next = LL->head;
        LL->head = newNode;
        return;
    }

    // Iterate until last element or found position
    currentNode = LL->head;
    while((NULL != currentNode)&&(num >= currentNode->val))
    {
        // Move on to the next element
        previousNode = currentNode;
        currentNode = currentNode->next;
    }

    // Insert the new element between the previous and current
    previousNode->next = newNode;
    newNode->next = currentNode;
}