链表的基本操作-双向链表
2012-11-09 18:57
375 查看
双向链表一般也由头指针唯一确定
双向链表首尾相接可以构成双向循环链表
/* 链表的基本操作~~ 开发环境:vs2010 win32 console application. */ #include "stdafx.h" #include <iostream> using namespace std; struct node { int data; node * next; // 指向后续节点 node * pre; // 指向前驱节点 }; node * createBidirList (int n); void outputBidirList(node * head); node * insertData(int n, node * head); node * deleteData(int n, node * head); int main() { int n; node * listHead = NULL; cout << "Please enter the number of nodes: "; cin >> n; // 可以输入5 (1 2 3 4 5) if(n > 0) listHead = createBidirList(n); outputBidirList(listHead); insertData(7, listHead); outputBidirList(listHead); insertData(6, listHead); deleteData(2, listHead); outputBidirList(listHead); return 0; }
// 按数据输入的顺序建立双向链表 node * createBidirList (int n) { node * temp, *tail = NULL, *head = NULL; int num; cin >> num; head = new node; //为新节点动态分配内存 if(head == NULL) { cout << "No memory available!"; return NULL; } else { head->data = num; head->next = NULL; head->pre = NULL; tail = head; } for(int i = 0; i < n - 1; i++) { cin >> num; temp = new node; //为新节点动态分配内存 if(temp == NULL) { cout << "No memory availabe"; return head; } else { temp->data = num; temp->next = NULL; temp->pre = tail; tail->next = temp; tail = temp; } } return head; }
// 输出双向链表中各节点的data成员的值 void outputBidirList(node * head) { cout << "List: "; node * curNode = head; while(curNode) { if(curNode->pre) cout << " <- "; cout << curNode->data; if(curNode->next) cout << " -> "; curNode = curNode->next; } cout << endl; return; }
// 将整数n插入到一个已排序的双向链表中(从小到大) node * insertData(int n, node * head) { node * curNode = head; // 指向插入点的后节点 node * preNode = NULL; // 指向插入点的前节点 node * newNode = NULL; // 指向新建节点 // 寻找插入位置 while((curNode != NULL) && (curNode->data < n)) { preNode = curNode; curNode = curNode->next; } newNode = new node; // 为新节点动态分配内存 if(newNode == NULL) { // 内存分配不成功 cout << "Not memory available!"; return head; } newNode->data = n; if(preNode == NULL) { // 链头 newNode->next = curNode; newNode->pre = NULL; if(curNode != NULL) curNode->pre = newNode; head = newNode; return head; } if(curNode == NULL) { // 链尾 newNode->pre = preNode; preNode->next = newNode; newNode->next = NULL; return head; } else { // 链中 preNode->next = newNode; newNode->next = curNode; newNode->pre = preNode; curNode->pre = newNode; return head; } }
// 在双向链表中查找并删除指定 node * deleteData(int n, node * head) { node * curNode = head; // 指向当前节点 while(curNode && curNode->data != n) curNode = curNode->next; if(curNode == NULL) { cout << "Can't find " << n << endl; return head; } if(curNode->pre == NULL) { head = head->next; head->pre = NULL; } else { curNode->pre->next = curNode->next; if(curNode->next != NULL) curNode->next->pre = curNode->pre; } delete curNode; return head; // 返回链首指针 }
相关文章推荐
- 双向链表的基本操作
- 【C++/数据结构】双向链表的基本操作
- 双向循环链表基本操作(C语言版)
- C语言单链表,双向链表,循环单链表,循环双链表的基本操作
- 双向链表的C语言实现与基本操作(二)
- c语言描述的双向链表的基本操作
- 双向链表的基本操作
- 算法(05):基本链表的操作及双向链表
- 带头节点、带环的双向链表的一些基本操作
- 双向链表的基本操作
- 双向循环链表基本操作(C语言)
- 带头结点带环的双向链表的基本操作
- 双向链表的基本操作
- C++模拟双向链表的基本操作
- 双向链表的基本操作
- 双向循环链表的基本操作
- 双向链表的基本操作
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 双向循环链表的基本操作
- C语言(数据结构) - 双向链表的基本操作