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