www.pudn.com > 外壳示例3.rar > 80bao.h
/*------------双向循环链表的基本操作实现-----------------*/ #include#include /*----------------定义元素--------------------------------*/ typedef char ElementType; /*---------------------定义节点----------------------------*/ typedef struct Node{ ElementType data; struct Node *prior; struct Node *next; }ChainNode; /*---------------------定义游标------------------------------*/ typedef struct Cursor{ ChainNode *cp; int number; }ListCursor; /*--------------------定义结构-------------------------------*/ typedef struct List{ ChainNode *head; ListCursor cursor; }LinearList; /* ************* 函数的申明 ************************ */ LinearList * CreateList(void); /*【创建】ok */ void DestroyList(LinearList *); /*【销毁】* / int ClearList(LinearList *); /*【清空】ok */ ChainNode *GetAddr(LinearList *,int ); /*取节点的地址ok */ int MoveTo(LinearList *,int); /*【移动游标】ok */ int MoveNext(LinearList *); /*【后移游标】ok */ int MovePrior(LinearList *); /*【前移游标】ok */ int MoveBegin(LinearList *); /*【设游标至第一个节点】ok */ int MoveEnd(LinearList *); /*【设游标至最后一个节点】ok */ int ListInsert(LinearList *,int ,ElementType );/* 插入元素 ok*/ int ListDelete(LinearList *,int); /* 删除元素 ok*/ int ListInsertCurrent(LinearList *,ElementType);/*ok*/ /* 在当前位置插入元素(在游标指向元素前插入元素,插入后游标指针项不变,号码项++)*/ int ListDeleteCurrent(LinearList *);/* ok*/ /*删除当前位置的元素(删除游标所指向的元素,删除后游标号码项不变,指针项后移)*/ int ListAppend(LinearList *,ElementType);/* 追加元素ok */ int FindElement(LinearList *,int (*)(ElementType,ElementType),ElementType,int); /*找元素 ok */ int ListTraverse(LinearList *,int (*)(ElementType *),int); /*遍历ok*/ int GetLength(LinearList *); /*测长度ok*/ /*----------------------申明的结束----------------------*/ /*------------------子函数-------------------------*/ LinearList * CreateList(void) /*【创建】 */ { LinearList *p=0; /*定义一个指向新建链表的指针*/ p=(LinearList *) malloc( sizeof ( LinearList ) ) ; if(!p) return 0 ; /*申请链表存储空间*/ p->head=(ChainNode *)malloc(sizeof(ChainNode)); if(!(p->head)) { free(p); return 0;/*申请头节点存储空间*/ } p->head->next=p->head; /*初始化头节点*/ p->head->prior=p->head; p->head->data=0; /*双向的链表*/ p->cursor.number=0; /*初始化游标*/ p->cursor.cp=p->head; return p ; /*返回新建链表指针*/ } int ClearList(LinearList *lp) /*【清空】 */ { while( ListDelete(lp,1) ); /*删除第一个节点直到失败为止*/ return 1; } void DestroyList(LinearList *lp) /*【销毁】*/ { ClearList(lp); /* 清空线性表*/ free(lp->head); /* 释放链表存储空间 */ free(lp); /* 释放链节点 */ } ChainNode * GetAddr(LinearList *lp,int i) /*取节点的地址*/ { ChainNode *p=lp->cursor.cp ; /* 定义节点型指针p 初始化为游标指针项 */ int j=lp->cursor.number; /* 定义整型变量j 初始化为游标号码项 */ if(i<1)return 0 ; /* 如果i<1返回空 */ if(i==lp->cursor.number)return p ; /* 如果i=游标号码项,返回p (游标指针项) */ if(i>j) /* 如果i>游标号码项,从游标开始向后移动p,直到目的地址,返回p */ { while(i>j) { j++; p=p->next; if(p==lp->head) return 0; } return p; } if(i prior; if(p==lp->head) return 0; } return p; } } /* 注:游标在头节点时:p=lp->cursor.cp=lp->head;*/ int MoveTo(LinearList *lp,int i) /*【移动游标】*/ { ChainNode *p=GetAddr(lp,i); if(!p)return 0; lp->cursor.cp=p; lp->cursor.number=i; return 1; } int MoveNext(LinearList *lp) /*【后移游标】*/ { if(lp->cursor.cp->next==lp->head) return 0; lp->cursor.number++; lp->cursor.cp=lp->cursor.cp->next; return 1; } int MovePrior(LinearList *lp) /*【前移游标】*/ { if(lp->cursor.cp->prior==lp->head) return 0; lp->cursor.number--; lp->cursor.cp=lp->cursor.cp->prior; return 1; } int MoveBegin(LinearList *lp) /*【设游标至第一个节点】*/ { if(lp->head->next==lp->head) return 0; lp->cursor.cp=lp->head->next; lp->cursor.number=1; return 1; } int MoveEnd(LinearList *lp) /*【设游标至最后一个节点】*/ { if(lp->head->prior==lp->head) return 0; lp->cursor.cp=lp->head->prior;/*--头结点的前一个就是最后一个结点--*/ lp->cursor.number=GetLength(lp); /*长度*/ return 1; } int GetLength(LinearList *lp) { int i; ChainNode *p; p=lp->head; for(i=0;p->next!=lp->head;i++) p=p->next; return i; } int ListInsert(LinearList *lp,int i,ElementType e)/* 插入元素*/ { ChainNode *p,*newp; if(!MoveTo(lp,i)) return 0; p=lp->cursor.cp; newp=( ChainNode * )malloc( sizeof ( ChainNode ) ); if(!newp) return 0; newp->data=e; p->prior->next=newp; newp->prior=p->prior; newp->next=p; p->prior=newp; lp->cursor.number=i+1; return 1; } int ListDelete(LinearList *lp,int i) /* 删除元素*/ { ChainNode *p; if(!MoveTo(lp,i)) return 0; p=lp->cursor.cp; if(p==lp->head) return 0; lp->cursor.cp=lp->cursor.cp->next; p->prior->next=p->next; p->next->prior=p->prior; free(p); return 1; } int ListInsertCurrent(LinearList *lp,ElementType e) /* 在当前位置插入元素(在游标指向元素前插入元素,插入后游标指针项不变,号码项++)*/ { ChainNode *p,*newp; p=lp->cursor.cp; newp=( ChainNode * )malloc( sizeof ( ChainNode ) ); if(!newp) return 0; newp->data=e; p->prior->next=newp; newp->prior=p->prior; newp->next=p; p->prior=newp; /* bu bian */ lp->cursor.number++; return 1; } int ListDeleteCurrent(LinearList *lp) /*删除当前位置的元素(删除游标所指向的元素,删除后游标号码项不变,指针项后移)*/ { ChainNode *p; p=lp->cursor.cp; lp->cursor.cp=lp->cursor.cp->next; /* shu bu bian */ p->prior->next=p->next; p->next->prior=p->prior; free(p); return 1; } int ListAppend(LinearList *lp,ElementType e)/* 追加元素 */ { ChainNode *newp; newp=( ChainNode * )malloc( sizeof ( ChainNode ) ); if(!newp) return 0; newp->data=e; lp->head->prior->next=newp; newp->prior=lp->head->prior; newp->next=lp->head; lp->head->prior=newp; return 1; } int FindElement(LinearList *lp,int (*v)(ElementType e0,ElementType e1),ElementType e,int f) /*查找(增加一个参数,对查找方式进行选择,0表示从游标向后找,1表示从游标向前找 2表示从头到尾)*/ { ChainNode *p=lp->cursor.cp; int i=0; if(f==0) { do{ p=p->next; i++; }while( p!=lp->head && !(*v)(e,p->data)); } else if(f==1) { do{ p=p->prior; i++; }while(p!=lp->head && !(*v)(e,p->data)); } else if(f==2) { p=lp->head; do{ p=p->next; i++; }while( (p!=lp->head) && !(*v)(e,p->data)); } else return 0; return i; } 对应 int print (ElementType *ep) int ListTraverse(LinearList *lp,int (*v) (ElementType * e),int f) /* 遍历(增加一个参数,对遍历方式进行选择,0表示从游标向后遍历,1表示从游标向前 遍历,2表示从头遍历)*/ { ChainNode *p; int i=1; p=lp->cursor.cp; if(f==0) { do{ p=p->next; i++; }while((p!=lp->head) && ( (*v) (&(p->data)) ) ); } else if(f==1) { do{ p=p->prior; i++; }while((p!=lp->head) && ( (*v)(&(p->data)) ) ); } else if(f==2) { p=lp->head; do{ p=p->next; i++; }while((p!=lp->head)&&(*v)(&p->data)); } else return 0; return i; } /*--------------------------子函数结束-------------------------*/