//*******************************双向链表************************ #include <stdio.h> #include <stdlib.h> //============状态量======== #define OK 1 #define ERROR 0 //==================ADT 双链表结构说明=================== typedef int ElemType; typedef struct DNode{ ElemType data; struct DNode *prior; struct DNode *next; }DListNode; typedef DListNode *DLinkList; //节点 //=========================模块定义============= /* 内置函数 定义 */ static DLinkList newNode(){ DLinkList pNew = (DLinkList)malloc(sizeof(DListNode)); if(pNew != NULL){ pNew->next = pNew->prior = NULL; } return pNew; } /* 初始化 */ void InitList(DLinkList *L){ (*L) = newNode(); if(*L == NULL){ printf("初始化失败!\n"); exit(EXIT_FAILURE); } } /* 销毁表 */ void DestroyList(DLinkList L){ DLinkList p = L; DLinkList q = p->next; while(q != NULL){ free(p); p = q; q = p->next; } free(p); } /* 判断表空 */ int ListEmpty(DLinkList L){ return (L->next == NULL); } /* 求表长 */ int ListLength(DLinkList L){ DLinkList p = L; int i = 0; for(;p->next != NULL;p = p->next) i++; return i; } /* 输出表 */ void DispList(DLinkList L){ DLinkList p = L->next; while(p != NULL){ printf("%d ", p->data); p = p->next; } printf("\n"); } /* 获取元素 */ int GetElem(DLinkList L, int i, ElemType *e){ int j = 0; DLinkList p = L; while(j < i && p != NULL){ j++; p = p->next; } if(p == NULL) return ERROR; else{ *e = p->data; return OK; } } /* 求元素位置 */ int LocateElem(DLinkList L, ElemType e){ int i = 1; DLinkList p = L->next; while(p != NULL && p->data != e){ i++; p = p->next; } if(p == NULL) return ERROR; else return i; } /* 插入元素 */ int InsertList(DLinkList L, int i, ElemType e){ int j = 0; DLinkList p = L; DLinkList pNew = NULL; while(j < i - 1 && p != NULL){ j++; p = p->next; } if(p == NULL) return ERROR; else{ pNew = newNode(); pNew->data = e; pNew->next = p->next; //先连后面 if(p->next != NULL) //p如果是尾节点 p->next->prior = pNew; p->next = pNew; pNew->prior = p; return OK; } } /* 删除指定位置元素,并返回其值 */ int DeleteList(DLinkList L, int i, ElemType *e){ int j = 0; DLinkList p = L; DLinkList q = NULL; while(j < i - 1 && p != NULL){ //查找前驱节点 j++; p = p->next; } if(p == NULL) return ERROR; else{ q = p->next; //被删除节点 if(q == NULL) //如果不存在 return ERROR; *e = q->data; p->next = q->next; if(q->next != NULL) //如果不是删除最后一个节点 q->next->prior = p; free(q); return OK; } }
欢迎参考,