trurlib

Wojtek Bojdol wojboj w lp.net.pl
Wto, 25 Maj 1999, 12:19:01 CEST



On Tue, 25 May 1999, Jarek Woloszyn wrote:

> 
> Zdecydowa?em si? pisa? pkgssela od razu pod trurlib i tak zupe?nie przez
> przypadek wysz?o par? bug?w :))
:))
ja go wczoraj przegladalem to tez pare znalazlem..:))

zalaczam 3 patche
patch nr 1 poprawia pare niedorobek...
patch nr 2 dodaje jedna funkcje, ktora bedzie chyba przydatna (ps. lepiej
int nth zastapic unsigned long nth bo bedzie bardziej uniwersalne i nie
trzeba robic checku na <0 chyba, ze <0 uzywamy do list dwustronnych)

patch nr 3 to poczatek (nie skonczylem bo sie pozno robilo a wtedy wole
nie pracowac) sortowanej listy...

dodatkowo pytanko....
lista dwustronna jako opcja...przeciez wtedy bedzie inny element
struktury...i jako opcji tego raczej sie nie da...
mozna zawsze robic dwustronna...bo to w sumie duzej roznicy nie ma...
ew. w strukturze dac pointer zawsze a przypisywac do niego tylko przy
wybranej opcji

> 
> Pierwszy, to co? nie tak z nlist push i pop. push chyba dzia?a, ale z
> popem mia?em czasem sigsegv. Nie wiem czy to moja wina, czy nie, ale ten
> sam kod tylko po zmianie na narray zaczal normalnie dzialac.
e...prawdopodobnie przez to, ze l->head nie byl dobrze ustawiany przy
zdejmowaniu last elementu..:)
-------------- następna część ---------
--- trurlib-22.05.99/nlist.cold	Mon May 24 20:18:02 1999
+++ trurlib-22.05.99/nlist.c	Mon May 24 20:23:21 1999
@@ -153,7 +153,7 @@
     data = tail_node->data;
     free(tail_node);
 
+    if (l->head==node) l->head=node=NULL; /* when only 1 element */
     l->tail = node;
     
     return data;
 }
@@ -172,7 +172,7 @@
     }
     
     
-    node = l->head;
+    if ((node = l->head)==l->tail) l->tail=l->head->next;
     l->head = l->head->next;
     
     data = node->data;
-------------- następna część ---------
--- trurlib-22.05.99/nlist.c~	Mon May 24 20:23:21 1999
+++ trurlib-22.05.99/nlist.c	Mon May 24 20:46:30 1999
@@ -327,6 +327,37 @@
 }
 
 
+void *n_list_nth_pop(tn_list *l, unsigned long nth) 
+{
+    register struct list_node *node, *last_node=NULL;
+    void *data;
+    unsigned long n=0;
+   
+
+    if(l->head == NULL) {
+        trurl_die("n_list_pop: pop from empty list\n");
+        return NULL;
+    }
+
+    if (l->items<nth)
+    	return NULL;
+
+    for(node = l->head; n!=nth; last_node=node,node = last_node->next,n++)
+        ;
+    
+    l->items--;
+    
+    if (last_node!=NULL) last_node->next=node->next;
+    data = node->data;
+    if (l->head == node) l->head=NULL;
+    if (l->tail == node) l->tail=last_node;
+    free(node);
+    
+    return data;
+}
+
+
+
 void n_list_iterator_start(const tn_list *l) 
 {
     register tn_list *list = (tn_list*)l;
-------------- następna część ---------
--- trurlib-22.05.99/nlist.c~	Mon May 24 20:49:57 1999
+++ trurlib-22.05.99/nlist.c	Mon May 24 21:04:17 1999
@@ -110,6 +110,11 @@
             return NULL;
     }
     
+    if((l->flags & TN_LIST_SORTED) && (l->cmp_fn == NULL)) {
+        trurl_die("n_list_push: compare function is NULL");
+        return -1;
+    }
+        
     if((node = malloc(sizeof(*node))) == NULL) 
         return NULL;
     
@@ -117,14 +122,36 @@
     node->data = data;
     node->next = NULL;
     
-    if(l->flags & TN_LIST_SORT)
     if(l->head == NULL) {         /* empty list */
-        l->head = l->tail = node;
-
-    } else {
-        l->tail->next = node;
-        l->tail = node;
-    }
+      	l->head = l->tail = node;
+    	} else {
+    	if(l->flags & TN_LIST_SORTED) {
+    		struct list_node *next, *last;
+    	
+    		last=next=l->head;
+    		while((next!=NULL)&&(l->cmp_fn(node->data,next->data)>0))
+    			{
+    			last=next;
+    			next=last->next;
+    			}
+    		if (next==NULL) {
+    			l->tail->next=node;
+    			l->tail=node;
+    			} else {
+    			if (last==l->head) {
+	/* TODOO: przypadek, gdy next==l->tail */
+    				node->next=l->head;
+    				l->head=node;
+    				} else {
+    				node->next=last->next;
+    				last->next=node;
+    				}
+    			}
+    		} else { /* non-sorted */
+        	l->tail->next = node;
+        	l->tail = node;
+    		}
+    	}
     
     l->items++;
 


Więcej informacji o liście dyskusyjnej pld-installer