[英]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.