⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sllist.ccp

📁 早期freebsd实现
💻 CCP
字号:
// This may look like C code, but it is really -*- C++ -*-// WARNING: This file is obsolete.  Use ../SLList.cc, if you can./* Copyright (C) 1988 Free Software Foundation    written by Doug Lea (dl@rocky.oswego.edu)This file is part of the GNU C++ Library.  This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version.  This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE.  See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*/#ifdef __GNUG__#pragma implementation#endif#include <values.h>#include <stream.h>#include <builtin.h>#include "<T>.SLList.h"void <T>SLList::error(const char* msg){  (*lib_error_handler)("SLList", msg);}int <T>SLList::length(){  int l = 0;  <T>SLListNode* t = last;  if (t != 0) do { ++l; t = t->tl; } while (t != last);  return l;}<T>SLList::<T>SLList(const <T>SLList& a){  if (a.last == 0)    last = 0;  else  {    <T>SLListNode* p = a.last->tl;    <T>SLListNode* h = new <T>SLListNode(p->hd);    last = h;    for (;;)    {      if (p == a.last)      {        last->tl = h;        return;      }      p = p->tl;      <T>SLListNode* n = new <T>SLListNode(p->hd);      last->tl = n;      last = n;    }  }}<T>SLList& <T>SLList::operator = (const <T>SLList& a){  if (last != a.last)  {    clear();    if (a.last != 0)    {      <T>SLListNode* p = a.last->tl;      <T>SLListNode* h = new <T>SLListNode(p->hd);      last = h;      for (;;)      {        if (p == a.last)        {          last->tl = h;          break;        }        p = p->tl;        <T>SLListNode* n = new <T>SLListNode(p->hd);        last->tl = n;        last = n;      }    }  }  return *this;}void <T>SLList::clear(){  if (last == 0)    return;  <T>SLListNode* p = last->tl;  last->tl = 0;  last = 0;  while (p != 0)  {    <T>SLListNode* nxt = p->tl;    delete(p);    p = nxt;  }}Pix <T>SLList::prepend(<T&> item){  <T>SLListNode* t = new <T>SLListNode(item);  if (last == 0)    t->tl = last = t;  else  {    t->tl = last->tl;    last->tl = t;  }  return Pix(t);}Pix <T>SLList::prepend(<T>SLListNode* t){  if (t == 0) return 0;  if (last == 0)    t->tl = last = t;  else  {    t->tl = last->tl;    last->tl = t;  }  return Pix(t);}Pix <T>SLList::append(<T&> item){  <T>SLListNode* t = new <T>SLListNode(item);  if (last == 0)    t->tl = last = t;  else  {    t->tl = last->tl;    last->tl = t;    last = t;  }  return Pix(t);}Pix <T>SLList::append(<T>SLListNode* t){  if (t == 0) return 0;  if (last == 0)    t->tl = last = t;  else  {    t->tl = last->tl;    last->tl = t;    last = t;  }  return Pix(t);}void <T>SLList::join(<T>SLList& b){  <T>SLListNode* t = b.last;  b.last = 0;  if (last == 0)    last = t;  else if (t != 0)  {    <T>SLListNode* f = last->tl;    last->tl = t->tl;    t->tl = f;    last = t;  }}Pix <T>SLList::ins_after(Pix p, <T&> item){  <T>SLListNode* u = (<T>SLListNode*)p;  <T>SLListNode* t = new <T>SLListNode(item);  if (last == 0)    t->tl = last = t;  else if (u == 0) // ins_after 0 means prepend  {    t->tl = last->tl;    last->tl = t;  }  else  {    t->tl = u->tl;    u->tl = t;    if (u == last)       last = t;  }  return Pix(t);}void <T>SLList::del_after(Pix p){  <T>SLListNode* u = (<T>SLListNode*)p;  if (last == 0 || u == last) error("cannot del_after last");  if (u == 0) u = last; // del_after 0 means delete first  <T>SLListNode* t = u->tl;  if (u == t)    last = 0;  else  {    u->tl = t->tl;    if (last == t)      last = u;  }  delete t;}int <T>SLList::owns(Pix p){  <T>SLListNode* t = last;  if (t != 0 && p != 0)  {    do    {      if (Pix(t) == p) return 1;      t = t->tl;    } while (t != last);  }  return 0;}<T> <T>SLList::remove_front(){  if (last == 0) error("remove_front of empty list");  <T>SLListNode* t = last->tl;  <T> res = t->hd;  if (t == last)    last = 0;  else    last->tl = t->tl;  delete t;  return res;}int <T>SLList::remove_front(<T>& x){  if (last == 0)    return 0;  else  {    <T>SLListNode* t = last->tl;    x = t->hd;    if (t == last)      last = 0;    else      last->tl = t->tl;    delete t;    return 1;  }}void <T>SLList::del_front(){  if (last == 0) error("del_front of empty list");  <T>SLListNode* t = last->tl;  if (t == last)    last = 0;  else    last->tl = t->tl;  delete t;}int <T>SLList::OK(){  int v = 1;  if (last != 0)  {    <T>SLListNode* t = last;    long count = MAXLONG;      // Lots of chances to find last!    do    {      count--;      t = t->tl;    } while (count > 0 && t != last);    v &= count > 0;  }  if (!v) error("invariant failure");  return v;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -