我試圖創建和維護排序的鏈接列表。每個新元素都應該以列表保持排序的方式插入。我已經能夠編寫代碼,但對代碼不太滿意。維護排序的鏈接列表
基本上有4個條件需要滿足根據我和我試圖實現所有他們我認爲我已經使代碼更復雜,它應該是。
只是想知道是否有人更有效地編碼它,如果你能告訴我如何改善插入功能。這是我的工作代碼和評論條件。爲了保持它小的時候沒有貼的功能刪除元素,銷燬清單等
#include <iostream>
using namespace std;
struct node{
int _val;
node* _next;
};
void printList(node **s){
node *t = *s;
while(t){
cout << t->_val << endl;
t = t->_next;
}
}
void insertSortElement(node** s, int val){
node* t = *s;
if(t){
if(t->_next == NULL || (t->_val > val)){
node* p = new node();
p->_val = val;
if(t->_val > val){
//3. More than 1 element in the list but 1st element > val
p->_next = t;
*s = p;
}
else{
//2. Only 1 element in the list and < val
t->_next = p;
}
}
else{
//4. More than 1 element and 1st < val
node* prev = 0;
while(t){
if(t->_val > val)
break;
prev = t;
t = t->_next;
}
node* p = new node();
p->_val = val;
p->_next = t;
prev->_next = p;
}
}
else{
//1. no element in the list
node* p = new node();
p->_val = val;
p->_next = NULL;
*s = p;
}
}
int main(){
struct node* s = 0 ;
insertSortElement(&s,5);
insertSortElement(&s,6);
insertSortElement(&s,4);
insertSortElement(&s,2);
insertSortElement(&s,8);
insertSortElement(&s,1);
printList(&s);
}
編輯:
找到另一種實現方式,比我的要簡單得多,並處理所有案件
void insertSorted(node**s , int val){
node* current = *s;
if(current == NULL || current->_val >= val){
node* p = new node();
p->_val = val;
p->_next = current;
*s = p;
}
else{
while(current->_next != NULL || current->_next->_val < val)
current = current->_next;
node* p = new node();
p->_val = val;
p->_next = current->_next;
current->_next = p;
}
}
對不起,相當延遲的答覆。是的,這看起來很整潔,我還沒有測試過它的所有條件。我發現了另一個實現,但不知道如何在此共享更多代碼。我想我會編輯我的代碼併發布代碼。 – tuco 2010-07-25 23:58:10