コード例 #1
0
ファイル: kadai77.c プロジェクト: rnrnuraln/Lecture
Vertex vertex_delete(String key, Vertex t)
{
  if (vertex_isempty(t))
    return t;
  else if (strcmp(key, t->name) < 0){
    if (vertex_isempty(t->left))
      return t;
    else{
      t->left = vertex_delete(key, t->left);
      return t;
    }}
    else if (strcmp(key, t->name) > 0){
      if (vertex_isempty(t->right))
	return t;
      else{
	t->right = vertex_delete(key, t->right);
	return t;
      }}
    else if ((vertex_isempty(t->right)) && (vertex_isempty(t->left)))
	return vertex_empty();
    else if (vertex_isempty(t->left))
	return t->right;
    else if (vertex_isempty(t->right))
	return t->left;
      else{
        t->name = min_name(t->right);
	t->right = deletemin(t->right);
	return t;
      }
}
コード例 #2
0
ファイル: avltree.cpp プロジェクト: kshav/My_codes
// Deleting a node
void bstree::del(int x,nodeptr &p)
{
	nodeptr d;
	if (p==NULL)
		cout<<"\nElement not found";
	else if ( x < p->element)
		del(x,p->left);
	else if (x > p->element)
		del(x,p->right);
	else if ((p->left == NULL) && (p->right == NULL))
	{
		d=p;
		free(d);
		p=NULL;
		cout<<"\nElement deleted !";
	}
	else if (p->left == NULL)
	{
		d=p;
		free(d);
		p=p->right;
		cout<<"\nElement deleted !";
	}
	else if (p->right == NULL)
	{
		d=p;
		p=p->left;
		free(d);
		cout<<"\nElement deleted !";
	}
	else
		p->element = deletemin(p->right);
}
コード例 #3
0
ファイル: avltree.c プロジェクト: dex4er/deb-z88dk
void 
deletemin (avltree ** n, void **dataptr)
{
  avltree *temp;
  short dif;

  if ((*n)->left != NULL)	/* keep going for leftmost node */
    deletemin (&(*n)->left, dataptr);
  else
    {				/* leftmost node found */
      *dataptr = (*n)->data;	/* get pointer to data */
      temp = *n;
      *n = (*n)->right;		/* return pointer to right subtree */
      free (temp);		/* of leftmost node                */
    }

  if (*n != NULL)
    {
      fixheight (*n);
      dif = difference (*n);
      if (dif > 1)		/* deletion caused left subtree to be too high */
	balanceleft (n, -1);
      else if (dif < -1)	/* deletion caused right subtree to be too high */
	balanceright (n, -1);
    }
}
コード例 #4
0
template<typename T, typename KEY> void RBTree<T, KEY>::deletemin()
{
    if (pRoot) // check if the tree is empty.
    {
        if (!isRed(pRoot->pLeft))   // Root contains only one node. Both its left and right child are black.
            pRoot->color = RED;
        pRoot = deletemin(pRoot);
        if (pRoot)
            pRoot->color = BLACK;
    }
}
コード例 #5
0
ファイル: kadai77.c プロジェクト: rnrnuraln/Lecture
Vertex deletemin(Vertex t){
  if (vertex_isempty(t->left))
    if (vertex_isempty(t->right))
      return vertex_empty();
    else
      return t->right;
  else{
    t->left = deletemin(t->left);
    return t;
  }
}
コード例 #6
0
ファイル: kadai76.c プロジェクト: rnrnuraln/Lecture
Btree deletemin(Btree t){
  if (btree_isempty(t->left))
    if (btree_isempty(t->right))
      return btree_empty();
    else
      return t->right;
  else{
    t->left = deletemin(t->left);
    return t;
  }
}
コード例 #7
0
int IntervallTree_bed::deletemin(Leaf * &p) {
	int c;
	std::cout << "inside deltemin\n" << std::endl;
	if (p->left == NULL) {
		//c = p->get_value();
		p = p->right;
		return c;
	} else {
		c = deletemin(p->left);
		return c;
	}
}
コード例 #8
0
ファイル: kadai76.c プロジェクト: rnrnuraln/Lecture
Btree btree_delete(String key, Btree t)
{
  if (btree_isempty(t))
    return t;
  else if (strcmp(key, t->key) < 0){
    if (btree_isempty(t->left))
      return t;
    else{
      t->left = btree_delete(key, t->left);
      return t;
    }}
    else if (strcmp(key, t->key) > 0){
      if (btree_isempty(t->right))
	return t;
      else{
	t->right = btree_delete(key, t->right);
	return t;
      }}
    else if ((btree_isempty(t->right)) && (btree_isempty(t->left))){
      free(t->key);
      free(t->value);
      free(t);
	return btree_empty();
    }
    else if (btree_isempty(t->left)){
      Btree p = t->right;
      free(t->key);
      free(t->value);
      free(t);
	return p;
    }
    else if (btree_isempty(t->right)){
      Btree p = t->left;
      free(t->key);
      free(t->value);
      free(t);
	return p;
    }
      else{
	Btree p;
        p->key = min_key(t->right);
	p->value = min_val(t->right);
	p->right = deletemin(t->right);
	free(t->key);
	free(t->value);
	free(t);
	return p;
      }
}
コード例 #9
0
template<typename T, typename KEY> RBTNode<T, KEY> *RBTree<T, KEY>::deletemin(RBTNode<T, KEY> *h)
{
    if (h->pLeft == NULL)
    {
        // be careful here hasn't check if the h is empty.
        //std::cout << "Delete min " << h->key << std::endl;
        delete h;
        return NULL;
    }
    if (!isRed(h->pLeft) && !isRed(h->pLeft->pLeft))
        h = MoveRedLeft(h);
    h->pLeft = deletemin(h->pLeft);
    if (isRed(h->pRight))
        h = RotateLeft(h);
    return h;
}
コード例 #10
0
ファイル: avltree.cpp プロジェクト: kshav/My_codes
int bstree::deletemin(nodeptr &p)
{
	int c;
	cout<<"inside deltemin";
	if (p->left == NULL)
	{
		c=p->element;
		p=p->right;
		return c;
	}
	else
	{
		c=deletemin(p->left);
		return c;
	}
}
コード例 #11
0
template<typename T, typename KEY> RBTNode<T, KEY> *RBTree<T, KEY>::deleteone(RBTNode<T, KEY> *h, KEY Key)
{
    // Delete a node.
    // However will be not sure Key exists in the tree. Check if the Key exists before deleting.
    if (Key < h->key)
    {
        if (!isRed(h->pLeft) && !isRed(h->pLeft->pLeft))
            h = MoveRedLeft(h);
        h->pLeft = deleteone(h->pLeft, Key);
    }
    else{
        if (isRed(h->pLeft))
            h = RotateRight(h);
        if ((Key == h->key) && !(h->pRight) )
        {
            //std::cout << "Delete one specified node: " << h->key << ", value: " << h->value << std::endl;
            delete h;
            return NULL;
        }
        if (!isRed(h->pRight) && !isRed(h->pRight->pLeft))
            h = MoveRedRight(h);
        if (Key == h->key)
        {
            //std::cout << "To delete " << h->key << ", delete subtree's min node" << std::endl;
            RBTNode<T, KEY> *temp = getmin(h->pRight);
            h->value = temp->value;
            h->key = temp->key;
            h->pRight = deletemin(h->pRight);
        }
        else
            h->pRight = deleteone(h->pRight, Key);
    }
    if (isRed(h->pRight))
        h = RotateLeft(h);
    return h;
}
コード例 #12
0
ファイル: test.c プロジェクト: macdavid313/SprayList
void* test(void *data) {
  int unext, last = -1; 
  val_t val = 0;
  pval_t pval = 0;

  thread_data_t *d = (thread_data_t *)data;

  /* Create transaction */
  TM_THREAD_ENTER(d->id);
  set_cpu(the_cores[d->id]);
  /* Wait on barrier */
  ssalloc_init();
  PF_CORRECTION;

  seeds = seed_rand();

#ifdef PIN
  int id = d->id;
  int cpu = 40*(id/40) + 4*(id%10) + (id%40)/10;
  // printf("Pinning %d to %d\n",id,cpu);
  pin(pthread_self(), cpu);
  //  pin(pthread_self(), id);
#endif

 #ifdef PAPI
    if (PAPI_OK != PAPI_start_counters(g_events, G_EVENT_COUNT))
  {
    printf("Problem starting counters 1.");
  }
 #endif


  barrier_cross(d->barrier);

  /* Is the first op an update? */
  unext = (rand_range_re(&d->seed, 100) - 1 < d->update);

#ifdef DISTRIBUTION_EXPERIMENT
  while (1)
#else
  while (*running)
#endif
    {		
      if (d->es) { // event simulator experiment
        if (d->lin) {
          if (!empty(d->linden_set)) {
            d->nb_remove++;
            pval_t pval = deletemin(d->linden_set, d);
            d->nb_removed++;

  //           printf("%d %d\n", pval, deps[pval][0]);

            int i = 0;
            val_t dep;
            while ((dep = deps[pval][i]) != -1 && i < MAX_DEPS) {
              d->nb_add++;
              if (insert(d->linden_set, dep, dep)) {
                d->nb_added++;
              }
              i++;
            }
          }
        } else {
          if (d->set->head->next[0]->next[0] != NULL) {// set not empty
            d->nb_remove++;
            if (d->sl) { // spray list
              if (spray_delete_min(d->set, &val, d)) {
                d->nb_removed++;
              } else {
                continue;
              }
            } else if (d->pq) { // lotan_shavit pq
              if (lotan_shavit_delete_min(d->set, &val, d)) {
                d->nb_removed++;
                //         continue; // TODO: maybe try remove this to simulate task handling (dependency checks still occur)
              } else {
                continue;
              }
            }

            //         struct timespec ten_usec;
            //         ten_usec.tv_sec = 0;
            //         ten_usec.tv_nsec = 10000;
            //         nanosleep(&ten_usec, NULL);

            // dependency handling
            int i = 0;
            val_t dep;
            while ((dep = deps[val][i]) != -1 && i < MAX_DEPS) {
              if (!sl_contains(d->set, dep, TRANSACTIONAL)) { // dependent has been removed, need to add it again
                if (sl_add(d->set, dep, TRANSACTIONAL)) { // check if insert actually succeeded (otherwise someone else did it first)
                  d->nb_added++;
                }
                d->nb_add++;
              }
              i++;
            }
          }
        }
      } else { // not event simulator
        if (unext) { // update

          if (last < 0) { // add
            val = rand_range_re(&d->seed, d->range);
            if (d->lin) {
              pval = val;
              insert(d->linden_set, pval, pval);
              d->nb_added++;
              last = pval;
            } else { // not linden
              if (sl_add(d->set, val, TRANSACTIONAL)) {
                d->nb_added++;
                last = val;
              } 				
            }
            d->nb_add++;

          } else { // remove

            if (d->pq) {
              if (lotan_shavit_delete_min(d->set, &val, d)) {
                d->nb_removed++;
                if (d->first_remove == -1) {
                  d->first_remove = val;
                }
              }
                last = -1;
            }
            else if (d->sl) {
              if (spray_delete_min(d->set, &val, d)) {
                d->nb_removed++;
                if (d->first_remove == -1) {
                  d->first_remove = val;
                }
                last = -1;
              }
            }
            else if (d->lin) {
              if ((pval = deletemin(d->linden_set, d))) {
                d->nb_removed++;
                if (d->first_remove == -1) {
                  d->first_remove = pval;
                }
                last = -1;
              }
            }
            else if (d->alternate) { // alternate mode (default)
              if (sl_remove(d->set, last, TRANSACTIONAL)) {
                d->nb_removed++;
                if (d->first_remove == -1) {
                  d->first_remove = val;
                }
              } 
              last = -1;
            } else {
              /* Random computation only in non-alternated cases */
              val = rand_range_re(&d->seed, d->range);
              /* Remove one random value */
              if (sl_remove_succ(d->set, val, TRANSACTIONAL)) {
                d->nb_removed++;
                if (d->first_remove == -1) {
                  d->first_remove = val;
                }
                /* Repeat until successful, to avoid size variations */
                last = -1;
              } 
            }
            d->nb_remove++;
          }

        } else { // read

          if (d->alternate) {
            if (d->update == 0) {
              if (last < 0) {
                val = d->first;
                last = val;
              } else { // last >= 0
                val = rand_range_re(&d->seed, d->range);
                last = -1;
              }
            } else { // update != 0
              if (last < 0) {
                val = rand_range_re(&d->seed, d->range);
                //last = val;
              } else {
                val = last;
              }
            }
          }	else val = rand_range_re(&d->seed, d->range);

          PF_START(2);
          if (sl_contains(d->set, val, TRANSACTIONAL)) 
            d->nb_found++;
          PF_STOP(2);	
          d->nb_contains++;
        }

        /* Is the next op an update? */
        if (d->effective) { // a failed remove/add is a read-only tx
          unext = ((100 * (d->nb_added + d->nb_removed))
              < (d->update * (d->nb_add + d->nb_remove + d->nb_contains)));
        } else { // remove/add (even failed) is considered as an update
          unext = (rand_range_re(&d->seed, 100) - 1 < d->update);
        }
      }

#ifdef DISTRIBUTION_EXPERIMENT
      if (d->first_remove != -1) {
        break; //only one run
      }
#endif

    }
#ifdef PAPI
  if (PAPI_OK != PAPI_read_counters(g_values[d->id], G_EVENT_COUNT))
  {
    printf("Problem reading counters 2.");
  }
#endif

  /* Free transaction */
  TM_THREAD_EXIT();

  PF_PRINT;

  return NULL;
}
コード例 #13
0
ファイル: legal.c プロジェクト: AaronCritchley/golegal
int main(int argc, char *argv[])
{
    int incpus,ncpus,cpuid,modidx,width,y,x,nextx,tsizelen;
    uint64_t msize,modulus,nin;
    char c,*tsizearg,inbase[64];
    uint64_t skipunder, nnewillcnt, newstates[3];
    int i,nnew,noutfiles;
    statebuf *mb;
    statecnt sn;
    jtset *jts;
    goin *gin;
    goout *go;

    assert(sizeof(uint64_t)==8);
    if (argc!=9 && argc!=10) {
        printf("usage: %s width modulo_index y x incpus ncpus cpuid maxtreesize[kKmMgG] [lastfile]\n",argv[0]);
        exit(1);
    }
    setwidth(width = atoi(argv[1]));
    modidx = atoi(argv[2]);
    if (modidx < 0 || modidx >= NMODULI) {
        printf ("modulo_index %d not in range [0,%d)\n", modidx, NMODULI);
        exit(1);
    }
    modulus = -(uint64_t)modulusdeltas[modidx];
    y = atoi(argv[3]);
    x = atoi(argv[4]);
    nextx = (x+1) % width;
    incpus = atoi(argv[5]);
    ncpus = atoi(argv[6]);
    if (ncpus < 1 || ncpus > MAXCPUS) {
        printf ("#cpus %d not in range [0,%d]\n", ncpus, MAXCPUS);
        exit(1);
    }
    cpuid = atoi(argv[7]);
    if (cpuid < 0 || cpuid >= ncpus) {
        printf("cpuid %d not in range [0,%d]\n", ncpus, ncpus-1);
        exit(1);
    }
    tsizelen = strlen(tsizearg = argv[8]);
    if (!isdigit(c = tsizearg[tsizelen-1]))
        tsizearg[tsizelen-1] = '\0';
    msize = atol(tsizearg);
    if (c == 'k' || c == 'K')
        msize *= 1000LL;
    if (c == 'm' || c == 'M')
        msize *= 1000000LL;
    if (c == 'g' || c == 'G')
        msize *= 1000000000LL;
    if (msize < 1000000LL) {
        printf("memsize %jd too small for comfort.\n", (intmax_t)msize);
        exit(1);
    }
    if (argc > 9) {
        assert(sscanf(argv[9],"%d.%lo", &noutfiles, &skipunder) == 2);
        noutfiles++;
        printf("skipping %d output files and states up to %jo\n", noutfiles, (uintmax_t)skipunder);
        skipunder++;
    } else {
        noutfiles = 0;
        skipunder = 0L;
    }

    sprintf(inbase,"%d.%d/yx.%02d.%02d",width,modidx,y,x);
    gin = openstreams(inbase, incpus, ncpus, cpuid, modulus, skipunder);
    go = goinit(width, modidx, modulus, y+!nextx, nextx, ncpus, cpuid);

    nnewillcnt = nin = 0LL;
    jts = jtalloc(msize, modulus, LOCBITS);
    if (nstreams(gin)) {
        for (; (mb = minstream(gin))->state != FINALSTATE; nin++,deletemin(gin)) {
            sn.cnt = mb->cnt;
            // printf("expanding %jo\n", (uintmax_t)mb->state);
            nnew = expandstate(mb->state, x, newstates);
            for (i=0; i<nnew; i++) {
                sn.state = newstates[i];
                //printf("inserting %jo\n", (uintmax_t)sn.state);
                jtinsert(jts, &sn);
            }
            if (nnew < 3) // nnew == 2
                modadd(modulus, &nnewillcnt, mb->cnt);
            if (jtfull(jts))
                dumpstates(go, jts, noutfiles++, mb->state);
        }
    }
    dumpstates(go, jts, noutfiles++, FINALSTATE);
    jtfree(jts);

    printf("(%d,%d) size %ju xsize %ju mod ",y,x,(uintmax_t)nin,(uintmax_t)totalread(gin));
    if (modulus)
        printf("%ju",(uintmax_t)modulus);
    else printf("18446744073709551616");

    printf("\nnewillegal %ju ", (uintmax_t)nnewillcnt);
    printf(       "needy %ju ", (uintmax_t)needywritten(go));
    printf(       "legal %ju ", (uintmax_t)legalwritten(go));
    printf("at (%d,%d)\n",y+(nextx==0),nextx);

    assert(cpuid != 0 || skipunder != 0L || nin > 0); // crash if cpu0 processes no states

    return 0;
}