#include <iostream>
using namespace std;
struct LinkNode
{
LinkNode* prior;
int data;
LinkNode* next;//双链表结点的构造
};
void CreateLink(LinkNode *head) //创建链表
{
LinkNode *p,*q;
int a;
p=head;
q=p;
cout<<"请输入你将要放入链表的数:"<<endl;
while(cin>>a) //p作为链接作用,q辅助链接。
{
LinkNode* t=new LinkNode;
t->data=a;
p->next=t;
p=p->next;
p->prior=q;
q=p;
}
p->next=NULL;
}
void InsertLinkNode(LinkNode *head,int i) //在某个结点后插入结点,把头节点作为0结点,因而可以在0结点-尾节点后插入新的结点
{
LinkNode *p=head;
int count=0;
if(i==-1) //因而小于0的直接返回
return;
while(p!=NULL) //没有超出范围的
{
if(count<i)
{
p=p->next;
count++;
}
else
{
LinkNode *t=new LinkNode;
cout<<"请输入你要插入数的数据"<<endl; //插入的整个过程其实是一个数学表达式。0<=插入范围<=尾部,而当插入范围不在这个区间时,要分别处理。
cin>>t->data;
t->prior=p;
t->next=p->next;
p->next=t;
if(t->next!=NULL)
t->next->prior=t;
break;
}
}
while(p==NULL&&count<=i) //数值过大,超出结点个数
cout<<"输入数据有误"<<endl;
}
void LookforLink(LinkNode *head,int i) //查找某个结点,范围是1-尾结点
{
if(i<1)
return;
LinkNode *p=head->next;
int count=1;
while(p!=NULL)
{
if(count<i)
{
p=p->next;
count++;
}
else //若查找结点符合链表范围,则做相应处理。
{
cout<<"所要寻找结点的数据为:"<<p->data<<endl;
break;
}
}
if(p==NULL&&count<=i) //查找结点范围超出链表范围
cout<<"查找结点大于链表拥有结点."<<endl;
}
void UpdateLink(LinkNode *head,int i) //修改某个结点的数据,范围为1-尾节点
{
if(i<1)
return; //小于1结点的处理方式
LinkNode *p=head;
int count=0;
while(p!=NULL) //在结点范围内的处理方式
{
if(count<i)
{
p=p->next;
count++;
}
else
{
cout<<"请输入更新后的数据:"<<endl;
cin>>p->data;
break;
}
}
if(p==NULL&&count<=i) //超出范围的结点范围
{
cout<<"输入的结点大于链表实际结点"<<endl;
}
}
void DeleteLinkNode(LinkNode *head,int i) //删除某个结点,范围为1-尾结点
{
if(i<1) //小于1结点的处理方式
return;
LinkNode *p=head->next;
LinkNode *q=head;
int count=1;
while(p!=NULL) //处在范围1-尾节点的处理方式
{
if(count<i)
{
p=p->next;
q=q->next;
count++;
}
else if(p->next==NULL&&count==i)
{
q->next=NULL;
delete p;
break;
}
else
{
q->next=p->next;
p->next->prior=q;
delete p;
break;
}
}
if(p==NULL&&count<=i) //某个超出结点范围的处理方式
{
cout<<"输入结点大于输出结点"<<endl;
}
}
int main()
{
LinkNode *head=new LinkNode;
head->prior=NULL;
head->next=NULL;
LinkNode *p=head;
CreateLink(head); //调用构造结点函数
p=head->next;
while(p!=NULL) //输出现在链表结果
{
cout<<"此时数为:"<<p->data<<endl;
p=p->next;
}
cout<<"请输入你想在第几个结点后插入结点"<<endl;
int i;
cin.clear();
cin.sync(); //清除缓冲区内容
cin>>i;
InsertLinkNode(head,i); //在某个结点后插入新的结点
p=head->next;
while(p!=NULL) //输出现在链表结果
{
cout<<"此时数为:"<<p->data<<endl;
p=p->next;
}
cin.clear();
cin.sync(); //清空缓冲区内容
cout<<"请输入你要查找的结点"<<endl;
cin>>i;
LookforLink(head,i); //寻找某个结点
cin.clear();
cin.sync(); //清空缓冲区
cout<<"请输入你想要更新数据的结点:"<<endl;
cin>>i;
UpdateLink(head,i); //更新某个结点
p=head->next;
while(p!=NULL) //输出现在链表结果
{
cout<<"此时数为:"<<p->data<<endl;
p=p->next;
}
cin.clear();
cin.sync(); //清空缓冲区内容
cout<<"请输入你想要删除数据的结点:"<<endl;
cin>>i;
DeleteLinkNode(head,i); //删除某个结点
p=head->next;
while(p!=NULL)
{
cout<<"此时数为:"<<p->data<<endl;
p=p->next;
}
return 0;
}
你会发现代码的结构其实都是数学表达的形式。