双链表的操作
/*
实现双链表的构建、初始化、数据添加(在指定位置添加)、数据删除(删除指定元素,并返回该元素的位置)的算法设计;
*/
#include<iostream>
#include<Windows.h>
using namespace std;
typedef struct _DoubleLink {
int data;
struct _DoubleLink *pre; //指向上一节点的指针域
struct _DoubleLink *next; //指向下一节点的指针域
}DbLinkList, DbLinkNode;
//初始化双链表
bool InitList(DbLinkList* &l) {
l = new DbLinkList;
if (!l) return false;
l->pre = NULL;
l->next = NULL;
return true;
}
//前插法添加双向链表元素
bool addLinkFront(DbLinkList* &l, DbLinkNode* s) {
if (!l || !s) return false;
if (l->next==NULL) { //只有头结点
l->next = s;
s->pre = l;
s->next = NULL;
} else {
s->next = l->next;
l->next->pre = s;
l->next = s;
s->pre = l;
}
return true;
}
//尾插法添加双向链表元素
bool (addLinkLasr(DbLinkList* &l,DbLinkNode* s)) {
if (!l || !s) return false;
DbLinkList *last = l;
while (last->next) last = last->next; //差找到尾结点;
s->next = NULL;
last->next = s;
s->pre = last;
return true;
}
//打印输出双向链表
void PrintLinkst(DbLinkList* & l) {
if (!l) return ;
DbLinkList *p = l;
while (p->next) {
cout << p->next->data << " ";
p = p->next;
}
return;
}
//在双向链表中插入指定元素
bool insert(DbLinkList* & l, int i, int x) {
if (!l) return false;
DbLinkList *p, *q;
p = l;
q = new DbLinkList;
q->data = x;
int index = 0;
while (p->next) {
if (index < i) { //找到要插入节点的前一个节点
index++;
p = p->next;
} else {
p->next->pre = q;
q->next = p->next;
p->next = q;
q->pre = p;
return true;
}
}
return false;
}
//在双向链表中删除指定元素
bool DeleteList(DbLinkList* &l, int Element, int &index) {
if (!l||!l->next) return false;
DbLinkList *p = l;
while (p->next&&p->next->next) {
if (p->next->data==Element) {
p = p->next;
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
return true;
}else{
p = p->next;
index++;
}
}
if (p->next->data == Element) {
p->next = NULL;
return true;
}
return false;
}
int main(void) {
DbLinkList *l = NULL;
DbLinkNode *s = NULL;
if (InitList(l)) {
cout << "双向链表初始化成功! " << endl;
} else {
cout << "双向链表初始化失败! " << endl;
}
int chose; //由用户选择是用前插法还是尾插法插入数据!
//由用户选择是用前插法还是尾插法
cout << "请选择使用前插法插入数据还是使用尾插法插入数据!" << endl;
cout << "若要使用前插法插入数据请输入: 1" << endl;
cout << "若要使用尾插法插入数据请输入: 2" << endl;
cin >> chose;
cout << "请输入要插入的元素个数: " << endl;
int num = 0; //用户要插入的元素个数
cin >> num;
//由用户选择何种方插入元素
switch (chose) {
case 1:
while (num > 0) {
cout << "请输入你想要插入的元素的值: ";
s = new DbLinkNode;
cin >> s->data;
//单链表的数据添加 之 前插法
if (addLinkFront(l, s)) {
cout << "前插入元素!" << s->data << "成功! " << endl;
} else {
cout << "前插入元素失败! " << endl;
}
num--;
}
break;
case 2:
while (num > 0) {
cout << "请输入你想要插入的元素的值: ";
s = new DbLinkNode;
cin >> s->data;
//单链表的数据添加 之 尾插法
if (addLinkLasr(l, s)) {
cout << "尾插入元素!" << s->data << "成功! " << endl;
} else {
cout << "尾插入元素失败! " << endl;
}
num--;
}
break;
default:
cout << "输入不合法!!!!, 请重新输入" << endl;
while (1) {
cout << "请选择使用前插法插入数据还是使用尾插法插入数据!" << endl;
cout << "若要使用前插法插入数据请输入: 1" << endl;
cout << "若要使用尾插法插入数据请输入: 2" << endl;
cin >> chose;
if (chose == 1 || chose == 2)
break;
}
break;
}
PrintLinkst(l);
int i; // 插入的位置
int x;//插入的值
cout << "请输入你想要插入的位置: ";
cin >> i;
cout << "请输入你想要插入的元素: ";
cin >> x;
//实现双链表的构建、数据添加、数据删除的算法设计;
if (insert(l, i, x)) {
cout << "双向链表插入数据 : " << x << "成功,在双向链表的位置是: " << i << endl;
} else {
cout << "双向链表插入元素失败! " << endl;
}
PrintLinkst(l);
// 实现双链表的构建、数据添加、数据删除的算法设计;
int Element; //要删除的元素
int index = 0; //要删除的元素的位置
cout << "请输入要删除的元素的值: ";
cin >> Element;
if (DeleteList(l, Element, index)) {
cout << "双向链表删除数据 : " << Element << "成功,在双向链表的位置是: " << index << endl;
} else {
cout << "双向链表删除元素失败! " << endl;
}
PrintLinkst(l);
system("pause");
return 0;
}
前插法:
尾插法: