双向链表的节点结构及部分函数的实现
1.节点结构以及成员的意义
typedef int ElemType; typedef struct DNode { ElemType data; struct DNode* next;//指向前一个节点 struct DNode* prior;//指向后一个节点 }DNode,*DLinkList;
2.需要实现的部分函数的声明
void InitDLinkList(DLinkList dlist); //增 bool InsertDLinkListPos(DLinkList dlist,ElemType value,int pos); bool InsertDLinkListhead(DLinkList dlist, ElemType value); bool InsertDLinkListRear(DLinkList dlist, ElemType value); bool DEmpty(DLinkList dlist);//判空 int DLength(DLinkList dlist);//求长度
//删 bool DeleteDLinkListPos(DLinkList dlist, int pos); bool DeleteDLinkListhead(DLinkList dlist); bool DeleteDLinkListRear(DLinkList dlist); bool DeleteDLinkListValue(DLinkList dlist, ElemType value); //查找第一个值是key的节点,找到的话返回这个节点,没找到的话返回NULL DLinkList Search(DLinkList plist, ElemType key); //清空, 直接调用销毁 void Clear(DLinkList dlist); //销毁 void Destory(DLinkList dlist); //打印 void Show(DLinkList dlist);
3.函数的具体实现
static DLinkList Buy_DNode(DLinkList head, ElemType value)//购买节点 { DLinkList new_node = (DLinkList)malloc(sizeof(DNode)); if (new_node == nullptr) return nullptr; new_node->data = value; new_node->next = head->next; if(head->next != nullptr) { head->next->prior = new_node; } new_node->prior = head; return new_node; } void InitDLinkList(DLinkList dlist) { assert(dlist != nullptr); dlist->next = nullptr; dlist->prior = nullptr; } //增删改查 bool InsertDLinkListPos(DLinkList dlist, ElemType value, int pos) { assert(dlist != nullptr && pos >= 0 && pos <= DLength(dlist)); DLinkList p = dlist; while (pos > 0) { p = p->next; pos--; } DLinkList new_node = Buy_DNode(p,value); if (nullptr == new_node) return false; p->next = new_node; return true; } bool InsertDLinkListhead(DLinkList dlist, ElemType value) { assert(dlist != nullptr); DLinkList new_node = Buy_DNode(dlist, value); if (nullptr == new_node) return false; dlist->next = new_node; return true; } bool InsertDLinkListRear(DLinkList dlist, ElemType value) { assert(dlist != nullptr); DLinkList p = dlist; while (p->next != nullptr) { p = p->next; } DLinkList new_node = Buy_DNode(p, value); if (new_node == nullptr) return false; p->next = new_node; return true; } bool DEmpty(DLinkList dlist) { assert(dlist != nullptr); return dlist->next == nullptr; } int DLength(DLinkList dlist) { assert(dlist != nullptr); int count = 0; DLinkList p = dlist->next; while (p != nullptr) { p = p->next; count++; } return count; } bool DeleteDLinkListPos(DLinkList dlist, int pos) { assert(dlist != nullptr && pos >= 0 && pos < DLength(dlist)); if (DEmpty(dlist)) return false; DLinkList p = dlist; while (pos > 0) { p = p->next; pos--; } DLinkList q = p->next; p->next = q->next; q->next->prior = q; free(q); return true; } bool DeleteDLinkListhead(DLinkList dlist) { assert(dlist != nullptr); if (dlist->next == nullptr)return false; DLinkList p = dlist; p = dlist->next; dlist->next = p->next; p->next->prior = dlist; free(p); return true; } bool DeleteDLinkListRear(DLinkList dlist) { assert(dlist != nullptr); DLinkList p = dlist->next; while (p->next != nullptr) { p = p->next; } p->prior->next = nullptr; free(p); return true; } bool DeleteDLinkListValue(DLinkList dlist, ElemType value) { assert(dlist != nullptr); DLinkList p = Search(dlist, value); if (p == nullptr) return false; p->prior->next = p->next; p->next->prior = p->prior; free(p); return true; } //查找第一个值是key的节点,找到的话返回这个节点,没找到的话返回NULL DLinkList Search(DLinkList dlist, ElemType key) { assert(dlist != nullptr); DLinkList p = dlist->next; while (p != nullptr) { if (p->data == key) { return p; } p = p->next; } return nullptr; } //清空, 直接调用销毁 void Clear(DLinkList dlist) { Destory(dlist); } //销毁 void Destory(DLinkList dlist) { assert(dlist != nullptr); DLinkList p = nullptr; p = dlist->next; while (p != nullptr) { p = dlist->next; dlist->next = p->next; free(p); } } //打印 void Show(DLinkList dlist) { assert(dlist != nullptr); DLinkList p = dlist->next; while (p != nullptr) { printf("%d ", p->data); p = p->next; } printf("\n"); }
ps:代码可以直接复制执行,若发现错误,请务必留言告知,谢谢.