双链表的操作
雙鏈表的代碼定義
#include <iostream> using namespace std;typedef struct _DLNode {int data; //結(jié)點(diǎn)數(shù)據(jù)域struct _DLNode *next; //指向后繼的指針struct _DLNode *prev; //指向前驅(qū)的指針}DbLinkNode,DbLinkList;雙鏈表的操作
初始化雙鏈表
//初始化雙鏈表 bool initDbLinkList(DbLinkList* &L) {L = new DbLinkNode;//合法性檢查,檢查內(nèi)存是否分配成功if(!L) return false;L->next = NULL;L->prev = NULL;L->data = -1;return true; }插入
前插法
//前插法 bool DbListInsertFront(DbLinkList* &L, DbLinkNode *node) {//合法性檢查if(!L || !node) return false;// if(L->next == NULL) // { // //若只有頭結(jié)點(diǎn),則在頭結(jié)點(diǎn)后面插入一個(gè)結(jié)點(diǎn) // node->next = NULL; // node->prev = L; // L->next = node; // } // else // { // //若有多個(gè)結(jié)點(diǎn),則在頭結(jié)點(diǎn)與其后結(jié)點(diǎn)之間插入 // L->next->prev = node; //令第二結(jié)點(diǎn)指向前驅(qū)的指針指向node // node->next = L->next; // node->prev = L; // L->next = node; // }//優(yōu)化if(L->next) L->next->prev = node;node->next = L->next;node->prev = L;L->next = node;return true; }尾插法
//尾插法 bool DbListInsertBack(DbLinkList* &L, DbLinkNode *node) {//合法性檢查if(!L || !node) return false;DbLinkNode *p = L;//找到尾結(jié)點(diǎn)while(p->next){p = p->next;}node->next = NULL;node->prev = p;p->next = node;return true; }任意位置插入
//任意位置插入 /* 參數(shù): 插入的雙向鏈表, 插入位置, 插入結(jié)點(diǎn)數(shù)據(jù)域的值*/ bool DbListInsert(DbLinkList* &L, int i, int &e) {//若鏈表為空未初始化,返回falseif(!L) return false;//若只有頭結(jié)點(diǎn),但插入位置不等于1,則返回falseif((!L->next && i != 1) || i < 1) return false;int j = 0;DbLinkList *p = L, *s;while(p && j < i){//找查位置為i的結(jié)點(diǎn)p = p->next;j++;}if(!p || j != i){cout << "不存在結(jié)點(diǎn)" << i << endl;return false;}cout << "p: " << p << endl;s = new DbLinkNode; //生成新的結(jié)點(diǎn)s->data = e;s->next = p;s->prev = p->prev;p->prev->next = s;p->prev = s;return true; }雙鏈表的遍歷輸出
//雙向鏈表的遍歷輸出 void printDbList(DbLinkList *L) {//檢查鏈表是否為空if(!L){cout << "鏈表為空" << endl;return;}DbLinkList *p = L;p = p->next;while(p){cout << p->data << endl;p = p->next;}}元素刪除與雙鏈表的銷毀
本部分操作與單鏈表一致,請(qǐng)參考《單鏈表的操作》
總結(jié)
- 上一篇: 顺序表的应用——逆置问题
- 下一篇: 栈的概念及性质