#include<iostream>
using namespace std;
typedef int ElementType;//定义类型
typedef struct DuLNode {
ElementType data;
struct DuLNode * prior;//前继
struct DuLNode * next;//后继
}DuLNode,* DuLinkList;
//1.初始化
bool InitList(DuLinkList L) {
L = new DuLNode;
L->prior = L;
L->next = L;
return true;
}
//2.创建列表 有表头结点
bool CreateList(DuLinkList & L) {
cout << "How many number you wanna input?" << endl;
int number=0,Data=0; cin >> number;
DuLinkList p = L;
if (number <= 0) return false;
while (number--) {
DuLinkList q = new DuLNode;
cout << "input the data of this number" << endl; cin >> Data;
q->data = Data;
p->next = q;
q->prior = p;
q->next = L;
L->prior = q;
p = q;
}
return true;
}
//3.展示
void TraverseList(DuLinkList L) {
DuLinkList p,q;
p = new DuLNode;
q = new DuLNode;
p = L->next ;//首元结点
if (p==L) { //只有一个头结点
cout << "List Null" << endl;
}
else {
cout << "The data is" << endl;
while (p!=L) {
cout << p->data << endl;
p = p->next;
}
}
}
//10.确定第e个元素位置
DuLinkList LocateElem(DuLinkList &L, int e) {//第e个元素的位置指针
DuLinkList p = L->next;
int i = 1;
while ( p!=L && i<e) {
p = p->next;
}
return p;
}
//4.确定元素位置
DuLinkList LocateElem_value(DuLinkList L,int e) {//根据值确定对应位置
DuLinkList p = L->next;
int i = 1;
while (p != L && p->data!=e) {
p = p->next;
}
if(p->data==e)
return p;
else
return NULL;
}
//5.插入链表
bool ListInsert(DuLinkList & L, int i, ElementType e) {
DuLinkList p,s;
if (!(p = LocateElem(L, i))) {
return false;
}
s = new DuLNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return true;
}
//6.链表的删除
bool DeleteList(DuLinkList &L, int i) {
DuLinkList p = L->next;
if (!(p = LocateElem(L, i))) return false;
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
p = NULL;
return true;
}
//7.取值
bool GetElem(DuLinkList L, int i,ElementType & e) {
DuLinkList p = new DuLNode;
p = L->next;
int j = 1;
while (p!=L && j < i) {
p = p->next;
++j;//次数增加
}
if (p==L || j > i)
return false;
else
e = p->data;
return true;
}
//8.销毁
void DestroyList(DuLinkList &L) {
if (L->next=L) {
cout << "List NULL" << endl;
}
else {
DuLinkList p = L;//头结点
delete p;
p = NULL;
cout << "destroy OK" << endl;
}
}
//9.清空 只留下头
void ClearList(DuLinkList &L) {
if (L->next==L) {
cout << "List NULL" << endl;
}
else {
DuLinkList p, q;
p = new DuLNode;
p = L->next;
while (p !=L) {
q = p->next;
delete p;
p = q;
}
L->next = L;
L->prior = L;
cout << "clear OK" << endl;
}
}
合并重点思想:合并2各线性表仅需要将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。
//10.合并2个循环列表
void MergeList(DuLinkList &L1, DuLinkList &L2) {
if (InitList(L1))
cout << "顺序表初始化成功" << endl;
else cout << "顺序表初始化不成功" << endl;
if (CreateList(L1)) cout << "顺序表创建成功" << endl;
else cout << "顺序表创建不成功" << endl;
TraverseList(L1);
if (InitList(L2))
cout << "顺序表初始化成功" << endl;
else cout << "顺序表初始化不成功" << endl;
if (CreateList(L2)) cout << "顺序表创建成功" << endl;
else cout << "顺序表创建不成功" << endl;
TraverseList(L2);
DuLinkList A=L1->prior, B = L2->prior,p;//A,B都是尾指针
p = B->next->next;//L2的首元结点
delete B->next;//释放第二个表的头结点
//第二个表的尾指针指向第一个表的头结点
B->next = A->next;
A->next->prior = B;
//第一个表的尾指针指向第二个表的第一个结点
A->next = p;
p->prior = A;
cout << "结果是" << endl;
TraverseList(L1);
}
int main() {
DuLinkList myList = new DuLNode;
DuLinkList myList2 = new DuLNode;
int i; ElementType e, x;
cout << "1.初始化\n";
cout << "2.创建\n";
cout << "3.展示" << endl;
cout << "4.确定元素位置\n";
cout << "5.插入链表\n";
cout << "6.链表的删除\n";
cout << "7.取值\n8.销毁\n9.清空 只留下头\n10.合并2个循环列表\n0.退出\n";
int choice = -1;
while (choice != 0) {
cout << "\nchoice=" << endl;
cin >> choice;
switch (choice) {
case 1: //初始化
if (InitList(myList))
cout << "顺序表初始化成功" << endl;
else cout << "顺序表初始化不成功" << endl;
break;
case 2://创建
if (CreateList(myList)) {
cout << "顺序表创建成功" << endl;
break;
}
else
cout << "顺序表创建不成功" << endl;
break;
case 3://展示
TraverseList(myList);break;
case 4://4.确定元素位置
cout << "查找的数字:" << endl;
cin >> x;
if (LocateElem(myList, x)==NULL) {
cout << "查无此数字" << endl;
}
else
cout << "查找成功,要找的数字结点的位置是" << LocateElem_value(myList, x) << endl;
break;
case 5://5.插入链表
cout << "要插入的位置和值分别是:" << endl;
cin >> i >> e;
if (ListInsert(myList, i, e)) {
cout << "插入成功" << endl;
}
else
cout << "插入失败" << endl;
break;
case 6://6.链表的删除
cout << "要删除的位置分别是:" << endl; cin >> i;
if (DeleteList(myList, i)) {
cout << "删除成功" << endl;
}
else
cout << "删除失败" << endl;
break;
case 7://7.取值
cout << "输入第i(整数)个元素" << endl;
cin >> i;
if (GetElem(myList, i, e) ) {
cout << "第" << i << "个元素是" << e << endl;
}
else if (!GetElem(myList, i, e))
cout << "顺序表取值失败,overflow" << endl;
break;
case 8://8.销毁
DestroyList(myList);
break;
case 9://9.清空
ClearList(myList);
break;
case 10:MergeList(myList,myList2 );
break;
}
}
}
拓展:常规的循环链表的合并案例:
在循环链表中设立尾指针而不设立头指针,可以使得操作简单,合并2各线性表仅需要将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。对于循环链表只需要改变2个指针值就可以了
/*
设置尾指针的循环链表的合并只需要改变两个指向表尾的指针即可。
*/
void Combine(LinkListLast L1,LinkListLast L2){
struct LNode *p;
p=L2.rear->next->next;
L2.rear->next=L1.rear->next;
L1.rear->next=p;
}