2015-03-02 74 views
3

我對我的C語言編程過程中的程序是應該給我們使用鏈表工作經驗。作業的最後部分之一要求我們採用鏈接列表,並使用我們之前在程序中編寫的prepend或append函數以升序排序。以升序排列鏈表用C

struct lnode 
{ 
    int datum; 
    struct lnode *next; 
}; 


struct lnode* 
prepend(struct lnode *list, int x) 
{ 
    struct lnode *node = (struct lnode *)malloc(sizeof(struct lnode)); 
    node -> datum = x; 
    node -> next = list; 
    list = node; 
    return list; 
} 

struct lnode* 
append(struct lnode *list, int x) 
{ 
    if(list==NULL){ 
    list = (struct lnode *)malloc(sizeof(struct lnode)); 
    list -> datum = x; 
    list -> next = NULL; 
    }else{ 
    list -> next = append(list->next,x);li 
    } 
    return list; 
} 

以上是我們在課堂上設計的append和prepend函數。

下面是刪除機能的研究,這是我們在課堂上也做了:

struct lnode* 
delete(struct lnode *list, int x) 
{ 
    struct lnode* tmp; 
    if(list == NULL){ 
    return list; 
    }else if(list-> datum == x){ 
    tmp = list -> next; 
    list -> next = NULL; 
    free(list); 
    list = tmp; 
    return list; 
    }else{ 
    list->next = delete(list->next,x); 
    return list; 
    } 
} 

int 
find_smallest(struct lnode*list) 
{ 
    int smallest; 
    smallest = list->datum; 
    while(list!=NULL){ 
    if(list->datum < smallest){ 
     smallest = list->datum; 
    } 
    list = list->next; 
    } 
    return smallest; 
} 

功能find_smallest需要一個鏈表作爲其輸入,並應在鏈表返回最小的整數值。我已經多次測試過這個函數,它看起來很完美。

最後,排序,這是下面,應該創建一個新的鏈表new_list,應追加在列表中的最小的整數的值,然後從列表中刪除該值,直到列表中不再具有任何價值。

struct lnode* 
sort(struct lnode *list) 
{ 
    struct lnode *new_list; 
    while(list != NULL && list->next != NULL){ 
    new_list = append(new_list, find_smallest(list)); 
    list = delete(list, find_smallest(list)); 
    } 
    return new_list; 
} 

我遇到的問題是,它似乎我得到一個無限循環。 我運行了一個測試用例,在每次運行循環後打印列表中的元素,其中列表最初是5 4 1 2 3,並且打印出來的內容是5 4 2 3,直到我強制程序停止。所以我相信它只能正確運行一次?

+2

你可以發佈你的'delete()'函數嗎? – wimh 2015-03-02 19:18:34

+0

也許你應該張貼在代碼審查或提供有關ideone或任何其他在線編輯器完成代碼的鏈接可能是容易讓別人誤以爲找到這樣 – sashas 2015-03-02 21:00:42

+1

@sasha codereview.stackexchange.com僅供如預期已經是運行的代碼。這是那裏的話題。另請閱讀[向代理推薦Code Review時要小心](http://meta.stackoverflow.com/questions/253975/be-careful-when-recommending-code-review-to-askers) – 2015-03-02 21:40:06

回答

1

可變new_list未在sort功能初始化。 append函數然後錯誤地附加到一個不存在的節點。

變化

struct lnode *new_list; 

struct lnode *new_list = NULL; 

sort功能。