c++实现双向链表的建立,插入,删除,合并,打印

来源:互联网 发布:js reverse方法 编辑:程序博客网 时间:2024/06/11 05:20
#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");}

阅读全文
0 0