线性表——单链表的基本操作
/********************************************************** * 单链表的存储结构定义 ***********************************************************/ typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkList; /********************************************************** * 单链表的基本操作的实现 ***********************************************************/ //创建并初始化为空表 Status InitList(LinkList &L) { L=(LNode*)malloc(sizeof(LNode)); if(L==NULL) return ERROR; L->next=NULL; return OK; } //销毁整个表(从此之后不再可用) Status DestroyList(LinkList &L) { // TODO (#1#): 销毁表 return ERROR; //------------------------------------- } //将表L置空 Status ClearList(LinkList &L) { L->next=NULL; return OK; } //判断表L是否为空表 bool ListEmpty(LinkList L) { if(L->next==NULL) return true; return false; //------------------------------------- } //求表L的长度 int ListLength(LinkList L) { LNode* p=L->next; int j=0; while(p||p!=NULL) {p=p->next; j++; } return j; } //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR Status GetElem(LinkList L, int i, ElemType &e) { LNode* p=L->next; int j=1; while(p||j<i) { p=p->next; j++; } if(!p||j>i) return ERROR; e=p->data; return OK; //------------------------------------- } //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 // compare(a,b) 为比较函数,匹配时返回true,否则返回false int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)) { int j=1; LNode* p = L->next; while(p!=NULL) { if( compare(p->data,e) ) return j; p=p->next; j++; } return 0; } //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR Status ListInsert(LinkList &L, int i, ElemType e) { LNode* p=L; int j=0 ; while(p&&j<i-1) {p=p->next; j++; } if(!p||j>i-1) return ERROR; LNode* s=(LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR Status ListDelete(LinkList &L, int i, ElemType &e) { LNode* p=L->next; int j=1; while(p&&j<i-1) {p=p->next; j++; } if(!p||j>i-1) return ERROR; p->next=p->next->next; free(p); return OK; } //遍历表L,对每个元素调用visit(x). Status ListTraverse(LinkList L, Status (*visit)(ElemType)) { LinkList p = L->next; while ( p ) { if ( visit(p->data)==ERROR ) return ERROR; p = p->next; } return OK; }