回 帖 发 新 帖 刷新版面

主题:[原创]自己写的静态双向循环链表(ANSI C)

作为练习,做了个静态双向循环链表的头文件。欢迎大家拍砖,多提意见

我在dev-cpp上按照标准C的格式写的,并且简单的调试通过。

参考书是老严那本和Weiss那本《数据结构算法分析-C语言描述》
/*--------------------------------------------------------------------------------
使用前要定义LElemType ,如:
typedef int LElemType;
#include "staticlist.h"

创建链表之前应先对链表空间初始化,只需初始化一次,如:
InitListSpace();         //初始化链表空间
List list1=CreateList(); //创建链表1
List list2=CreateList(); //创建链表2

void InitListSpace()          //初始化
List CreateList(void)         //建立链表
void ClearList(List L)        //清空链表
void ReverseList(List L)      //反转链表
int IsListEmpty(List L)       //判表空
int GetListLen(List L)        //求表长
Position GetFirstPos(List L)       //求表首
Position GetLastPos(List L)        //求表尾
Position GetPriorPos(List L,Position P) //求前驱
Position GetNextPos(List L,Position P)  //求后继
Position LocList(List L,int n)               //定位第n个元素
Position OppLocList(List L,int n)            //逆向定位第n元
Position FindLElem(List L,LElemType e)       //查找e在表中的首个位置
Position OppFindLElem(List L,LElemType e)    //逆向查找
Position SrchLElem(List L,int(* judge)(LElemType))    //条件搜索
Position OppSrchLElem(List L,int(* judge)(LElemType)) //逆向条件搜索
LElemType ReadLElem(Position P)         //读结点元素值
void WriteLElem(Position P,LElemType e) //写结点元素值
void InsLElem(List L,Position P,LElemType e) //在P位置插入元素
void InsFirstLElem(List L,LElemType e)       //在表首插入元素
void InsLastLElem(List L,LElemType e)        //在表尾插入元素
void DelLElem(List L,Position P)             //删除结点
int TraList(List L,int (* visit)(LElemType))      //正向遍历
int OppTraList(List L,int (* visit)(LElemType))   //逆向遍历

作者  bpt
-------------------------------------------------------------------------------*/

#ifndef _staticlist_h
#define _staticlist_h

#define LIST_SPACE ( 1000 ) //链表空间大小
#define TRUE    ( 1 )
#define FALSE   ( 0 )

typedef int Position;
typedef Position List;
struct _Static_Double_List
{
     LElemType data;
     Position prior;
     Position next;
} ListSpace[LIST_SPACE];

Position CursorAlloc(void);
void CursorFree(Position P);

void InitListSpace()
{
     int i;

     for( i=0; i<LIST_SPACE-1; ++i )
     {
          ListSpace[i].next = i + 1;
     }
     ListSpace[i].next = 0;
}

List CreateList(void)
{
     Position P;

     P = CursorAlloc();
     ListSpace[P].next = P;
     ListSpace[P].prior = P;
     return P;
}

void ClearList(List L)
{
     Position P,Tmp;

     P = ListSpace[L].next;
     while( P!=L )
     {
          Tmp = P;
          P = ListSpace[P].next;
          CursorFree(Tmp);
     }
     ListSpace[L].next = ListSpace[L].prior = L;
     return;
}

void ReverseList(List L)
{
     Position cur,P;

     cur = L;
     while( (P=ListSpace[L].next)!=L )
     {
          ListSpace[L].next = ListSpace[P].next;
          ListSpace[cur].prior = P;
          ListSpace[P].next = cur;
          cur = P;
     }
     ListSpace[L].next = cur;
     return;
}

int IsListEmpty(List L)
{
     return ListSpace[L].next == L;
}

int GetListLen(List L)
{
     int i;
     Position P;

     P = L;
     i = 0;
     while(ListSpace[P].next!=L )
     {
          ++i;
          P = ListSpace[P].next;
     }
     return i;
}

Position GetFirstPos(List L)
{
     return ListSpace[L].next;
}

Position GetLastPos(List L)
{
     return ListSpace[L].prior;
}

Position GetPriorPos(List L,Position P)
{
     return ListSpace[P].prior;
}

Position GetNextPos(List L,Position P)
{
     return ListSpace[P].next;
}

Position LocList(List L,int n)
{
     int i;
     Position cur;

     cur = L;
     for(i=0; i<n && ListSpace[cur].next!=L; ++i)
     {
          cur = ListSpace[cur].next;
     }
     return cur;
}

Position OppLocList(List L,int n)
{
     int i;
     Position cur;

     cur = L;
     for(i=0; i<n && ListSpace[cur].prior!=L; ++i)
     {
          cur = ListSpace[cur].prior;
     }
     return cur;
}

Position FindLElem(List L,LElemType e)
{
     Position cur;

     cur = ListSpace[L].next;
     while( cur!=L && ListSpace[cur].data!=e )
     {
          cur = ListSpace[cur].next;
     }
     return cur;
}
Position OppFindLElem(List L,LElemType e)
{
     Position cur;

     cur = ListSpace[L].prior;
     while( cur!=L && ListSpace[cur].data!=e )
     {
          cur = ListSpace[cur].prior;
     }
     return cur;
}

Position SrchLElem(List L,int(* judge)(LElemType))
{
     Position cur;

     cur = ListSpace[L].next;
     while( cur!=L && !(* judge)(ListSpace[cur].data) )
     {
          cur = ListSpace[cur].next;
     }
     return cur;
}

Position OppSrchLElem(List L,int(* judge)(LElemType))
{
     Position cur;

     cur = ListSpace[L].prior;
     while( cur!=L && !(* judge)(ListSpace[cur].data) )
     {
          cur = ListSpace[cur].prior;
     }
     return cur;
}

LElemType ReadLElem(Position P)
{
     return ListSpace[P].data;
}

void WriteLElem(Position P,LElemType e)
{
     ListSpace[P].data = e;
     return;
}

void InsLElem(List L,Position P,LElemType e)
{
     Position Tmp;

     Tmp = CursorAlloc();
     ListSpace[Tmp].data = e;
     ListSpace[ListSpace[P].prior].next = Tmp;
     ListSpace[Tmp].prior = ListSpace[P].prior;
     ListSpace[P].prior = Tmp;
     ListSpace[Tmp].next = P;
     return;
}

void InsFirstLElem(List L,LElemType e)
{
     Position Tmp;

     Tmp = CursorAlloc();
     ListSpace[Tmp].data = e;
     ListSpace[ListSpace[L].next].prior = Tmp;
     ListSpace[Tmp].next = ListSpace[L].next;
     ListSpace[L].next = Tmp;
     ListSpace[Tmp].prior = L;
     return;
}

void InsLastLElem(List L,LElemType e)
{
     Position Tmp;

     Tmp = CursorAlloc();
     ListSpace[Tmp].data = e;
     ListSpace[ListSpace[L].prior].next = Tmp;
     ListSpace[Tmp].prior = ListSpace[L].prior;
     ListSpace[L].prior = Tmp;
     ListSpace[Tmp].next = L;
     return;
}

void DelLElem(List L,Position P)
{
     ListSpace[ListSpace[P].prior].next = ListSpace[P].next;
     ListSpace[ListSpace[P].next].prior = ListSpace[P].prior;
     CursorFree(P);
     return;
}

int TraList(List L,int (* visit)(LElemType))
{
     Position cur;

     cur = ListSpace[L].next;
     while( cur!=L )
     {
          if( !(* visit)(ListSpace[cur].data) )
          {
               return FALSE;
          }
          cur = ListSpace[cur].next;
     }
     return TRUE;
}

int OppTraList(List L,int (* visit)(LElemType))
{
     Position cur;

     cur = ListSpace[L].prior;
     while( cur!=L )
     {
          if( !(* visit)(ListSpace[cur].data) )
          {
               return FALSE;
          }
          cur = ListSpace[cur].prior;
     }
     return TRUE;
}

Position CursorAlloc(void)
{
     Position P;

     P = ListSpace[0].next;
     ListSpace[0].next = ListSpace[P].next;
     return P;
}

void CursorFree(Position P)
{
     ListSpace[P].next = ListSpace[0].next;
     ListSpace[0].next = P;
     return ;
}

#endif

回复列表 (共4个回复)

沙发

奖状
此帖被授予[口头鼓励奖],加精还稍欠新意. 望楼主继续努力,发扬我版艰苦朴素,求实奋进的精神. 坚决团结在以rickone同志为代表的...

板凳

呵呵 谢谢老欧了 奖不奖状的不要紧 就是写出来让大家指点一下 免得做了井底之蛙让大家笑话

3 楼

是不是应该出台一个加精的条款原则,有一些帖子想加又不知够不够加,像这样一些程序太长的,只怕不能加,要有大量注释,最好像小论文样的~
不过还是要鼓励LZ~

4 楼

注释挤在一起
看代码的时候就忘记注释了

我来回复

您尚未登录,请登录后再回复。点此登录或注册