我想创建一个已排序的链表,因此每次插入一个元素时,都应该对它进行排序(按升序排序)。现在我已经制作了一个排序链表。该计划工作正常,但有一个问题。它不会在已排序的链表中打印中间和最后插入的元素,即使它已被插入。
我的代码是
//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。
答案 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;
}