#include<stdio.h> #include<stdlib.h> //单链表存储结构(一个节点的结构)
typedef int elemtype; typedef enum { OK, //0
TRUE, //1
FALSE, //2
ERROR, //3
OVERFLOW//4
}Status;
typedef struct LNode { elemtype data; struct LNode *next; }LinkList,*pLinkList;
/*带头节点的单链表初始化*/ void InitList(pLinkList L) { L=(pLinkList)malloc(sizeof(elemtype)); if(!L) exit(OVERFLOW); L->next = NULL; }
/*销毁带头节点的单链表*/ void DestroyList(pLinkList L) { pLinkList q; while(L)//直到L=NULL
{ q = L->next; free(L); L = q; } }
/*将带头结点的单链表重置为空表,只留一个头结点*/ void ClearList(pLinkList L) { pLinkList p = L->next; L->next = NULL; DestroyList(p); }
/*判断带头结点的单链表是否为空表,是返回TRUE,否返回FALSE*/ Status ListEmpty(pLinkList L) { if(L->next) return FALSE; else return TRUE; }
/*返回带头节点单链表中数据元素的个数*/ int ListLength(pLinkList L) { int i=0; pLinkList p; p = L->next; while(p) { i++; p = p->next; } return i; }
/*当第i个元素存在时,从带头结点的单链表中返回第i个元素到e中,并返回ok,否则返回error*/ Status GetElem(pLinkList L,int i,elemtype *e) { int j = 1; pLinkList p = L->next; while(p && i>j)//P指向第i个元素的位置
{ j++; p = p->next; } if(!p || j>i)//i大于表长或i<1;
return ERROR; *e = p->data; return OK; }
/*在带头结点的单链表中的第i个位置之前插入元素e*/ Status ListInsert(pLinkList L,int i,elemtype e) { int j = 0;//计数器
pLinkList s,p = L;//p指向表头
while(p && j<i-1)//由于是单向链表,必须先寻找到i-1个位置
{ j++; p = p->next; } if(!p || j>i-1)//i大于(表长+1)或小于1
return ERROR; s = (pLinkList)malloc(sizeof(LinkList)); s->data = e; s->next = p->next; p->next = s; return OK; }
/*从带头节点的单链表中,删除第i个元素,并由e返回其值*/ Status ListDelete(pLinkList L,int i,elemtype *e) { int j = 0; pLinkList s,p = L; while(p->next && j<i-1) //p指向第i-1个位置
{ j++; p = p->next; } if(!(p->next) || j>i-1) return ERROR; s = p->next; p->next = s->next; *e = s->data; free(s); return OK; }
/*若cur_e是带头结点单链表内的数据元素,且不是第一个,则用pre_e返回它的前驱*/ Status PriorElem(pLinkList L,elemtype cur_e,elemtype *pre_e) { pLinkList q,p=L->next; while(p->next) { q = p->next; if(q->data == cur_e) { *pre_e = p->data; return OK; } p = q; } return OK; }
/*若cur_e是带头结点单链表内的数据元素,且不是最后一个,则用next_e返回他的后继*/ Status NextElem(pLinkList L,elemtype cur_e,elemtype *next_e) { pLinkList p=L->next; while(p->next) { if(p->data == cur_e) { *next_e = p->next->data; return OK; } p = p->next; } return ERROR; }
/*返回带头结点的单链表内第一个与e满足compare()关系的数据元素的的为序*/ int LocateElem(pLinkList L,elemtype e,Status(*compare)(elemtype,elemtype)) { int i=0; pLinkList p = L->next; while(p) { i++; if(compare(p->data,e)) return i; p = p->next; } return -1; }
/*依次对带头结点单链表中的每一个元素数据调用visit()函数*/ void ListTraverse(pLinkList L,void(*visit)(elemtype *)) { pLinkList p = L->next; while(p) { visit(&(p->data)); p = p->next; } }
|