#include<iostream>
#include<string>
#include <fstream>
#include<windows.h>
using namespace std;
struct Node
{//定义节点
int data;
Node*prior, *next;
};
class LinkList
{
public:
LinkList();//无参构造函数
LinkList(int a[], int n);//有参构造函数-头插法建立双链表
LinkList(int a[], int n, int);//有参构造函数-尾插法建立双链表
~LinkList() { }//析构函数
int Length();//求链表长度
int Get(int i, int length);//按位查找
int Locate(int x);//按值查找
void Insert(int i, int x,int length);//插入操作
void Delete(int i, int length);//删除操作
void PrintList();//遍历操作
private:
Node* first;//双链表头指针,仅仅是声明一个node类型指针,并没有分配node空间,不是node节点
};
LinkList::LinkList()
{//无参构造函数
cout << "无参构造" << endl;
first = new Node;//
first->next = NULL;//
first->prior = NULL;//
}
LinkList::LinkList(int a[], int n)
{//有参构造函数-头插法建立双链表
cout << "头插法建立双链表" << endl;
first = new Node;//这句不能丢,定义里面仅仅是声明了一个指针,并没有分配空间
first->next = NULL;
first->prior = NULL;
for (int i = 0; i < n; i++)
{
Node* p=new Node;
p->data = a[i];
p->next = first->next;
p->prior = first;
while (first->next != NULL)
{
first->next->prior = p;
break;//!!!!少了break就会陷入死循环
}
first->next = p;
//cout << p->data << " ";
}
}
LinkList::LinkList(int a[], int n, int)
{//有参构造函数-尾插法建立双链表
first = new Node;//这句不能丢,定义里面仅仅是声明了一个指针,并没有分配空间
Node* r = first;
for (int i = 0; i < n; i++)
{
Node* p = new Node;
p->data = a[i];
r->next = p;
p->prior = r;
r = p;
}
r->next = NULL;
}
//
void LinkList::Insert(int i, int x,int length)//节点号从1开始,i=2时代表插入的节点当作第2个节点
{//插入操作
if (i<1 || i>length + 1)
{
cout << "无法插入数据" << endl;
return;
}
else
{
Node* r = first;
for (int j = 1; j < i; j++)//i=2时,r移动一次指向第一个节点即可
{
r = r->next;
}
Node* p = new Node;
if (r->next != NULL)
{
p->data = x;
p->prior = r;
p->next = r->next;
r->next->prior = p;
r->next = p;
}
else
{
p->data = x;
p->prior = r;
p->next = NULL;
r->next = p;
}
}
}
//没有考虑到链表为空的情况,或者i大于链表节点个数
void LinkList::Delete(int i,int length)
{//删除操作
if (i<1 || i>length)
{
cout << "无法删除数据" << endl;
return;
}
else
{
Node* r = first;
for (int j = 1; j < i; j++)//i=2时,r移动一次指向第一个节点即可
{
r = r->next;
}
if (r->next->next != NULL)
{
Node* temp = r->next;
r->next = r->next->next;
r->next->prior = r;
delete temp;
}
else
{
Node* temp = r->next;
r->next = NULL;
delete temp;
}
}
}
void LinkList::PrintList()
{//遍历操作
Node* r = first;
if (r->next == NULL)
cout << "NULL" << endl;
else
{
while (r->next != NULL)
{
cout << r->next->data << " ";
r = r->next;
}
cout << endl;
}
}
int LinkList::Length()
{//求链表长度
int count=0;
Node* r = first;
while (r->next != NULL)
{
r = r->next;
count++;
}
return count;
}
int LinkList::Get(int i,int length)
{//按位查找
if (i<1 || i>length)
{
cout << "请输入正确位" << endl;
return 0;
}
else
{
Node* r = first;
for (int j = 1; j < i; j++)//i=2时,r移动一次指向第一个节点即可
{
r = r->next;
}
return r->next->data;
}
}
int LinkList::Locate(int x)
{//按值查找
Node* r = first;
int count = 0;
while (r->next != NULL&&r->data!=x)
{
r = r->next;
count++;
}
if (r->next == NULL)
{
cout << "未找到" << endl;
return 0;
}
else
return count;
}
int main()
{
LinkList l1;
l1.Insert(2, 666, l1.Length());
cout << "l1链表数据 "; l1.PrintList();
int length1 = l1.Length(); cout << "l1链表长度 " << length1 << endl;
cout << endl;
const int n1 = 10;
int a1[n1] = { 1,2,3,4,5,6,7,8,9,10 };
LinkList l2(a1, n1);
l2.Insert(11, 666,l2.Length());
l2.Delete(1, l2.Length());
cout << "l2链表数据 "; l2.PrintList();
int length2 = l2.Length(); cout << "l2链表长度 " << length2 << endl;
int h = l2.Get(12, l2.Length()); cout << "按位查找结果为 " << h << endl;
int w1 = l2.Locate(2); cout << w1 << endl;
int w = l2.Locate(343); cout << w << endl;
cout << endl;
const int n2 = 9;
int a2[n2] = { 1,2,3,4,5,6,7,8,9 };
LinkList l3(a2, n2, 0);
l3.Insert(1, 666,l3.Length());
l3.Delete(0, l3.Length());
l3.Delete(11, l3.Length());
cout << "l3链表数据 "; l3.PrintList();
int length3 = l3.Length(); cout << "l3链表长度 " << length3 << endl;
system("pause");
return 0;
}