c++实现双向链表的建立,插入,删除,合并,打印
2017-08-16 16:55
746 查看
#include <stdlib.h> #include <iostream> using namespace std; //双向链表的节点结构 typedef struct DuLNode{ int data; struct DuLNode *prior; struct DuLNode *next; }DuLNode, *DuLinkList; //创建双向链表 void Create_DuList(DuLinkList &L, int n) { int i, count = 1, InitLNodeNum; DuLNode *p, *q, *temp; cout << "Create doubly linked list!" << endl << "==========================" << endl; cout << endl << "Please input the Init DuLinkNode Number: <eg. 5> "; cin >> InitLNodeNum; L = (DuLinkList)malloc(sizeof(DuLNode)); //分配1个DuLNode型存储单元,并将这个分配的存储单元的首地址存储到节点变量L中 cout << "Please input the data for DuLinkList Nodes: <eg. 22,86,6,88,99,...>" << endl; cout << "Your inputs: "; L->next = L; L->prior = L; q = L->next; temp = L->next; int j = 0; //循环尾部插入插入节点 for (i = InitLNodeNum; i > 0; --i) { p = (DuLinkList)malloc(sizeof(DuLNode)); cin >> p->data; if (j = 0) { p->next = L->next; p->prior = L; L->next = p; L->prior = p; temp = L->next; } else { p->next = temp->next; p->prior = temp; temp->next = p; temp = p; } j = j + 1; } } //打印双向链表 void printNL(DuLinkList &L) { struct DuLNode *q; q = L->next; cout << endl << "双向链表内容:" << endl << "-------------" << endl; while (q != L) { cout << q->data << ' '; q = q->next; } cout << endl; } //删除第i个节点 void ListDelete(struct DuLNode *L) { int j = 1; int n; cout << "要删除第二个节点:"; cin >> n; struct DuLNode *p; p = L->next; for (j = 1; j < n; ++j) { p = p->next; } p->prior->next = p->next; p->next->prior = p->prior; free(p); } //在第i个位置曾家一个节点 void ListInsert(DuLinkList &L, int i, int e) { struct DuLNode *p, *s; int j = 1; p = L->next; s = (DuLinkList)malloc(sizeof(DuLNode)); cout << "要插入的节点位置i:"; cin >> i; cout << "要插入的data为:"; cin >> e; s->data = e; for (j; j < i - 1; j++) { p = p->next; } s->next = p->next; s->prior = p->next->prior; p->next->prior = s; p->next = s; } //合并两个循环链表 void MergeList(DuLinkList &La, DuLinkList &Lb, DuLinkList &Lc) { struct DuLNode *pa, *pb, *pc; pa = La->next; pb = Lb->next; Lc = pc = La; //用La的头结点作为Lc的头结点 //当La,Lb都没有到尾节点时,比较data,将小的节点插入Lc的尾部 while (pa != La && pb != Lb) { if (pa->data <= pb->data) { pa->prior = pc; pc->next = pa; //此时pa为Lc的尾节点 pa = pa->next; pc = pc->next; } else { pb->prior = pc; pc->next = pb; //此时pb为Lc的尾节点 pb = pb->next; pc = pc->next; } } if (pa != La) //Lb的所有节点已经插到Lc,将La的剩余节点插入Lc的尾部 { while (pa != La) { pa->prior = pc; pc->next = pa; pc = pc->next; pa = pa->next; } } else //La的所有节点都已插到Lc,将Lb的剩余节点插入Lc的尾部 { while (pb != Lb) { pb->prior = pc; pc->next = pb; pc = pc->next; pb = pb->next; } } pc->next = Lc; //将尾节点的next指向头结点 Lc->prior = pc;//将头结点的prior指向尾节点 free(Lb); } void main() { int n = 0, i = 0, e = 0; DuLinkList La, Lb, Lc; //创建双向链表 Create_DuList(La, n); //打印双向链表 printNL(La); Create_DuList(Lb, n); //打印双向链表 printNL(Lb); MergeList(La, Lb, Lc); printNL(Lc); //删除第i个节点 //ListDelete(L); //printNL(L); //在第i位置添加一个节点 //cout << endl; //ListInsert(L, i, e); //printNL(L); system("pause"); }
相关文章推荐
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 双向链表的功能实现:初始化,插入,按位置插入,按位置删除,按值删除,遍历打印等
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- C++实现双向链表的创建,插入,修改,删除
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- c++ 实现双向链表构造函数,拷贝构造函数,析构函数,输出操作符重载,赋值操作符重载,头插尾插,头删尾删,任意位置插入,任意位置删除,查找等
- 单链表的建立,查找,插入,删除,测长,打印,逆置操作实现
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果