您的位置:首页 > 编程语言 > C语言/C++

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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐