[英]Bubble Sort C - Linked List
所以這是我的小氣泡排序功能遇到的問題。 我能夠對值進行排序,但是在3個節點之后我總是會截斷。 一個例子是:
排序以下內容:
3 2 54 5 4
我總是得到(從最小的頭):
2 3 4
就是這樣,僅此而已。
void sortByLine (struct lnode** head) {
int count = 1;
while(count){
struct lnode *temp =*head;
count = 0;
while(temp != NULL){
struct lnode *next = nodeGetNext(temp);
if(next != NULL){
if((lineCmp(temp,next)) > 0 ){
swap(head, next,temp);
count = 1;
}
}
temp = nodeGetNext(temp);
}
}
}
線路Cmp功能:
int lineCmp (struct lnode* n1, struct lnode* n2) {
int node1 = nodeGetLine(n1);
int node2 = nodeGetLine(n2);
if(node1 == node2){
return 0;
}
else if(node1 > node2){
return 1;
}
else
return -1;
}
交換功能:
void swap (struct lnode** head, struct lnode* n1, struct lnode* n2) {
struct lnode *prevn1 = nodeGetPrev(*head, n1);
struct lnode *prevn2 = nodeGetPrev(*head, n2);
struct lnode *nextn1 = nodeGetNext(n1);
struct lnode *nextn2 = nodeGetNext(n2);
if(prevn2 == n1 && prevn1 == NULL){
evictNode(head, n2);
pushNode(head, n2);
}
else if(prevn1 == n2 && prevn2 == NULL){
evictNode(head, n1);
pushNode(head, n1);
}
else if(prevn1 == n2 && nextn1 == NULL){
evictNode(head, n1);
insertNode(head, prevn2 , n1);
}
else if(prevn2 == n1 && nextn2 == NULL){
evictNode(head, n2);
insertNode(head, prevn1, n2);
}
else{
evictNode(head, n1);
evictNode(head, n2);
insertNode(head, prevn2 , n1);
insertNode(head, prevn1 , n2);
}
}
您的問題出在交換功能中:刪除節點會使先前計算出的節點無效
void swap (struct lnode** head, struct lnode* n1, struct lnode* n2) {
struct lnode *prevn1 = nodeGetPrev(*head, n1);
struct lnode *prevn2 = nodeGetPrev(*head, n2);
struct lnode *nextn1 = nodeGetNext(n1);
struct lnode *nextn2 = nodeGetNext(n2);
if(prevn2 == n1 && prevn1 == NULL){
evictNode(head, n2);
pushNode(head, n2);
}
else if(prevn1 == n2 && prevn2 == NULL){
evictNode(head, n1);
pushNode(head, n1);
}
else if(prevn1 == n2 && nextn1 == NULL){
evictNode(head, n1);
insertNode(head, prevn2 , n1);
}
else if(prevn2 == n1 && nextn2 == NULL){
evictNode(head, n2);
insertNode(head, prevn1, n2);
}
else if (n1==prevn2)
{
evictNode (head, n1);
insertNode(head, n2, n1);
}
else if (n2==prevn1)
{
evictNode (head, n2);
insertNode(head, n1, n2);
}
else {
evictNode(head, n1);
evictNode(head, n2);
insertNode(head, prevn1, n2);
insertNode(head, prevn2, n1);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.