/*雙向鏈表的插入與刪除*/
#include<iostream>
using namespace std;
struct node //雙向鏈表的節點
{
int date;
node *next; //指向後一個節點
node *prior; //指向前一個節點
};
class list //創建鏈表類
{
node *head,*s,*p,*q; //head—頭結點 s—新節點 p—創建鏈表 q—打印鏈表/插入元素
public:
list(){head=NULL;} //創建一個空的頭結點
int InitList(); //初始化
void output(); //打印
int inser(int Length); //插入
int Delete(int Length); //刪除
};
int list::InitList()
{
int x=1; //x 記錄初始的表長
while (x<11) //創建一個長度爲10的鏈表
{
s=new node(); //創建一個新的節點
s->date=x;
if(head==NULL)
{s->next=s->prior=NULL;p=head=s;}
else
{ s->date=x;
s->next=head; //循環鏈表與非循環的區別
s->prior=p; //將節點p作爲新節點s的上一個節點
head->prior=s;
p->next=s; //將新節點s作爲節點p的下一個節點
p=p->next;}
//節點p後移
++x;
}
return x-1;
}
void list::output() //打印鏈表
{
q=head;
cout<<“linklist: “;
cout<<q->date<<” “;
q=q->next;
if(q!=NULL)
for (;q!=head;q=q->next)
cout<<q->date<<” “;
cout<<“. head is “<<head->date<<endl;
}
int list::inser(int Length)
{ int y=1; // y 記錄當前節點在鏈表中的排位
int place , elem;
node *temp; //創建一個臨時節點
cout<<“請輸入要插入的數據:”<<endl;
cin>>elem;
cout<<“請輸入要插入的位置:”<<endl;
cin>>place;
cout<<“數據:”<<elem<<” 位置:”<<place<<endl;
if(place>Length)
{cout<<“當前鏈表長度爲:”<<Length<<endl;return 0;}
s=new node();
s->date=elem;
for(q=head;y<Length+1; ++y)
{
if(y==place)
{
temp=q->prior; //臨時節點爲當前節點的前一個節點
temp->next=s;
s->prior=temp;
s->next=q;
q->prior=s;
if(place==1)
{ head=s; }
break;
}
q=q->next;
}//for
}
int list::Delete(int Length)
{
int y=1; // y 記錄當前節點在鏈表中的排位
int elem;
node *temp1,*temp2; //創建兩個臨時節點
cout<<“請輸入要刪除的數據:”<<endl;
cin>>elem;
for(q=head;y<Length+1;++y)
{
if(q->date==elem)
{
temp1=q->prior; //臨時節點1爲當前節點的前一個節點
temp2=q->next; //臨時節點2爲當前節點的後一個節點
temp1->next=temp2;
temp2->prior=temp1;
if(head->date==elem)
{ head=head->next; }
return 0;
}
q=q->next;
}//for
cout<<“鏈表中沒有你所輸入的數據,所以無法執行刪除”<<endl;
}
int main()
{
list A;
int Length=A.InitList();
cout<<Length;
A.output();
A.inser(Length);
++Length;
A.output();
A.Delete(Length);
A.output();
while(1){}
return 0;
}
————————————————————————————————————————————————————————
/*雙向鏈表的插入—算法2.18*/
int list::inser(int Length)
{ int y=1; // y 記錄當前節點在鏈表中的排位
int place , elem;
node *temp; //創建一個臨時節點
cout<<“請輸入要插入的數據:”<<endl;
cin>>elem;
cout<<“請輸入要插入的位置:”<<endl;
cin>>place;
cout<<“數據:”<<elem<<” 位置:”<<place<<endl;
if(place>Length)
{cout<<“當前鏈表長度爲:”<<Length<<endl;return 0;}
s=new node();
s->date=elem;
for(q=head;y<Length+1; ++y)
{
if(y==place)
{
temp=q->prior; //臨時節點爲當前節點的前一個節點
temp->next=s;
s->prior=temp;
s->next=q;
q->prior=s;
if(place==1)
{ head=s; }
break;
}
q=q->next;
}//for
}
/*雙向鏈表的刪除—算法2.19*/
int list::Delete(int Length)
{
int y=1; // y 記錄當前節點在鏈表中的排位
int elem;
node *temp1,*temp2; //創建兩個臨時節點
cout<<“請輸入要刪除的數據:”<<endl;
cin>>elem;
for(q=head;y<Length+1;++y)
{
if(q->date==elem)
{
temp1=q->prior; //臨時節點1爲當前節點的前一個節點
temp2=q->next; //臨時節點2爲當前節點的後一個節點
temp1->next=temp2;
temp2->prior=temp1;
if(head->date==elem)
{ head=head->next; }
return 0;
}
q=q->next;
}//for
cout<<“鏈表中沒有你所輸入的數據,所以無法執行刪除”<<endl;
}