數據結構 P36-37 算法實現 雙向循環鏈表的插入與刪除

/*雙向鏈表的插入與刪除*/

#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;
}

点赞