繁体   English   中英

程序没有打印我需要打印的内容

[英]Program is not printing what i need to print

我想创建一个排序的链表,所以每次插入一个元素时,都应该对其进行排序(以升序排列)。 现在,我做了一个排序的链表。 该程序运行正常,但是有一个问题。 即使已插入,也不会在排序的链表中打印中间插入的元素和最后插入的元素。

我的代码是

 //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。

插入列表中间时,您的逻辑有误:

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

此时,您想在temp2之后插入新节点temp 但是,相反,您有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 在大多数情况下,它们是相同的,但是标准并没有说必须如此。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM