做一个豁达而努力的自己。
双向链表的定义:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
线性表的双向链表的存储结构:
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode, *DulLinkList;
代码:
#include <iostream> #include <cstdlib> using namespace std; //双向链表的存储结构 typedef struct DulNode { int data; //节点的数据域 DulNode *prior; //指向前继节点 DulNode *next; //指向后继节点 }DulNode, *DulLinkList; //双向链表的初始化 bool InitList(DulLinkList &L) { L = new DulNode; if(!L) return false; L->prior = NULL; L->next = NULL; return true; } //头插法创建双向链表 void CreateList_H(DulLinkList &L) { int n; DulLinkList s; cout << "输入创建的元素个数:"; cin >> n; while(n--) { s = new DulNode; cout << "输入数据:"; cin >> s->data; if(L->next) L->next->prior = s; s->prior = L; s->next = L->next; L->next = s; } } //双向链表的尾插法 void CreateList_T(DulLinkList &L) { int n; DulLinkList s, r; r = L; cout << "输入创建元素的个数:"; cin >> n; while(n--) { s = new DulNode; cout << "输入数据:"; cin >> s->data; s->next = NULL; s->prior = r; r->next = s; r = s; } } //双向链表的查找 bool GetList(DulLinkList L, int i, int &e) { DulLinkList p; p = L->next; int j = 1; while(p && j < i) { p = p->next; j++; } if(!p || j > i) return false; e = p->data; return true; } //双向链表的插入 bool InsertList(DulLinkList &L, int i, int e) { DulLinkList p, s; int j = 1; p = L; while(p && j < i) { p = p->next; j++; } if(!p || j > i) return false; s = new DulNode; s->data = e; s->next = p->next; s->prior = p; p->next = s; return true; } //双向链表的删除 bool DeleteList(DulLinkList &L, int i) { DulLinkList p, q; int j = 1; p = L; while(p->next && j < i) { p = p->next; j++; } if(!p->next || j > i) return false; if(p->next->next == NULL) { q = p->next; p->next = NULL; delete q; } else { q = p->next; p->next = q->next; q->next->prior = p; delete q; } return true; } //双向链表的清除 void ClearList(DulLinkList &L) { DulLinkList p, q; p = L->next; while(p) { q = p; p = p->next; delete q; } L->next = NULL; } //双向链表的输出 void PutList(DulLinkList L) { DulLinkList p; p = L->next; while(p) { cout << p->data << endl; p = p->next; } } //菜单 void menu() { cout << "1.双向链表的初始化" << endl; cout << "2.双向链表的头插发创建" << endl; cout << "3.双向链表的尾插法创建" << endl; cout << "4.双向链表的查找" << endl; cout << "5.双向链表的插入" << endl; cout << "6.双向链表的删除" << endl; cout << "7.双向链表的清除" << endl; cout << "8.双向链表的输出" << endl; cout << "0.退出双向链表" << endl; } int main() { DulLinkList L; int e, i; bool n; int num; while(num != 0) { system("cls"); menu(); cout << "请选选项:"; cin >> num; switch(num) { case 1: n = InitList(L); if(n == 0) cout << "初始化失败" << endl; else cout << "初始化成功" << endl; break; case 2: CreateList_H(L); cout << "头插法创建成功" << endl; break; case 3: CreateList_T(L); cout << "尾指针创建成功" << endl; break; case 4: cout << "请输入要查找的位置:"; cin >> i; n = GetList(L, i, e); if(n == 0) cout << "查找失败" << endl; else { cout << "查找结果:"; cout << e << endl; } break; case 5: cout << "请输入要插入的位置:"; cin >> i; cout << "请输入int型数据:"; cin >> e; n = InsertList(L, i, e); if(n == 0) cout << "插入失败" << endl; else cout << "插入成功" << endl; break; case 6: cout << "请输入删除位置:"; cin >> i; n = DeleteList(L, i); if(n == 0) cout << "删除失败" << endl; else cout << "删除成功" << endl; break; case 7: ClearList(L); break; case 8: PutList(L); break; case 0: break; default : "没有输入选项"; } system("pause"); } return 0; }