数据结构
线性表(三)双链表
思维导图
2.1 线性表的链式表示
链式存储线性表时,不需要使用地址连续的存储单元,结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
2.2 双链表
1、定义
比单链表多一个 前驱指针prior
优缺点:
- 可进可退,存储密度比单链表更低一点;
- 双链表不可随机存取;
- 按位查找、按值查找操作都只能用遍历的方式实现。
时间复杂度O(n)
2、基本操作
(1)插入
(2)删除
(3)遍历
👉 遍历方式和单链表一样,可以向前遍历也可以向后遍历
(4)代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include<iostream> #include<stdlib.h> #include<stdio.h> using namespace std;
typedef struct DoubleLinkedList { int data; DoubleLinkedList *prior, *next; }DNode, *DLinkList;
bool InitDLinkList(DLinkList &L) { L = (DNode *)malloc(sizeof(DNode)); if(L == NULL) return false; L->prior = NULL; L->next = NULL; return true; }
bool isEmpty(DLinkList L) { return(L->next == NULL); }
bool InsertNode(DLinkList &L, int e) { DNode *s; DNode *temp = L; while (temp->next != NULL) { temp = temp->next; } s = (DNode *)malloc(sizeof(DNode)); s->data = e; s->next = temp->next; if (temp->next != NULL) { temp->next->prior = s; } s->prior = temp; temp->next = s; cout << "插入成功!" << endl; return true; }
void printNodetoNext(DLinkList L) { cout << "后向遍历" << endl; DNode *p = L->next; while(p != NULL) { cout << p->data << endl; p = p->next; } }
void printNodetoPrior(DLinkList L) { cout << "前向遍历" << endl; DNode *p = L; while (p->prior != NULL) { cout << p->data << endl; p = p->prior; } }
bool DeleteNode(DLinkList &L, int i) { DNode *p = L; int j = 0; while(j < i - 1) { p = p->next; j++; } DNode *q = p->next; p->next = q->next; if(q->next != NULL) { q->next->prior = p; } free(q); cout << "删除成功!" << endl; return true; }
int main() { DLinkList L; InitDLinkList(L); cout << isEmpty(L) << endl; InsertNode(L, 4); InsertNode(L, 2); InsertNode(L, 5); InsertNode(L, 8); printNodetoNext(L); DeleteNode(L, 2); printNodetoNext(L); return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 1 插入成功! 插入成功! 插入成功! 插入成功! 后向遍历 4 2 5 8 删除成功! 后向遍历 4 5 8
|