typedef int ElemType;
typedef int boolean;
#define OK 1
#define ERROR -1
typedef struct Node {
ElemType data;
struct Node *next;
}NNode;
typedef NNode *link;
typedef struct {
int length;//存发链表中节点的个数
link prior;//指向头节点
link tail;//指向的是尾节点
}DouLinkList;
void InitDouLinkList (DouLinkList *dll) {
link list;
dll->length = 0;
list = (link)malloc (sizeof(NNode));
list->next = NULL;
dll->prior = dll->tail = list;
}
int DoubLinkListLength (DouLinkList *dll) {
return dll->length;
}
boolean DouLinkListIsEmpty (DouLinkList *dll) {
return (dll->length == 0);
}
int DouLinkListDestroy (DouLinkList *dll) {
link list = dll->prior;
while (list!=NULL) {
dll->prior = list->next;
free (list);
list = dll->prior;
}
dll->length = 0;
dll->prior = dll->tail = NULL;
return OK;
}
int DouLinkListInsert (DouLinkList *dll,ElemType data) {
//插入元素
link newNode = (link)malloc(sizeof (NNode));
if (newNode == NULL) {
return ERROR;
}else {
newNode->data = data;
newNode->next = dll->tail->next;
dll->tail->next = newNode;
dll->tail = newNode;
dll->length++;
}
return OK;
}
link DouLinkListLocate (DouLinkList *dll,ElemType e,boolean (*equal)(ElemType,ElemType)) {
//确定一个元素是否在链表中
link list = dll->prior->next;
while (list != NULL&&equal(list->data,e)!=0) {
list = list->next;
}
if (!list) {
return NULL;
}else {
return list;
}
}
link DouLinkListPrior (DouLinkList *dll,ElemType data,boolean (*equal)(ElemType,ElemType)) {
//返回的节点值等于data的节点的前一个节点
link head = dll->prior;
link list = head->next;
while (list!= NULL&&equal(list->data,data)!=0) {
head = list;
list = list->next;
}
return list == NULL?NULL:head;
}
int DouLinkListDelete (DouLinkList *dll,ElemType data,boolean (*equal)(ElemType,ElemType)) {
//删除元素
link list = DouLinkListPrior(dll,data,equal);
link list2;
if (list) {
list2 = list->next;
list->next = list2->next;
if (list2 == dll->tail) {
dll->tail = list;
}
free (list2);
dll->length--;
return OK;
}
return ERROR;
}
void DouLinkListTraverse (DouLinkList * const dll,void (*visit)(ElemType)) {
link list = dll->prior;
if (list != NULL) {
list = list->next;
while (list!=NULL) {
visit (list->data);
list = list->next;
}
}
}
带有头尾节点的链表
最新推荐文章于 2023-05-05 17:35:05 发布