#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
typedef struct DuLNode
{
ElemType data; //數據域
struct DuLNode *prior; //前驅指針域
struct DuLNode *next; //後繼指針域
}DuLNode,*DuLinkList;
//初始化雙向鏈表
Status InitList_L(DuLinkList &L){
L=new DuLNode;
L->next=NULL; //後繼指針爲NULL
L->prior=NULL; //前驅指針爲NULL
return OK;
}
//利用尾插法建立雙向鏈表
void CreateList_L(DuLinkList &L,int n){
//正位序輸入n個元素的值,建立帶表頭結點的雙向鏈表L
L=new DuLNode;
L->next=NULL;
L->prior=NULL;
DuLNode *p;
DuLNode *r=L;//尾指針r指向頭結點
for(int i=0;i<n;++i){
p=new DuLNode;//生成新結點
cin>>p->data;//輸入元素值
p->next=NULL;
p->prior=r;
r->next=p; //插入到表尾
r=p;//r指向新的尾結點
}
}//CreateList_L
//雙向鏈表元素輸出
void Out_LinkList(DuLNode *p){
printf("The Created LinkList Elem Is:");
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}//Out_LinkList
//求表長,返回L中數據元素個數
int ListLength_L(DuLinkList L){
int i=0;
DuLinkList p;
p=L->next; //p指向第一個結點
while(p){//遍歷單鏈表,統計結點數
i++;
p=p->next; }
return i;
}
//取值,獲取線性表L中的某個數據元素的內容
Status GetElem_L(DuLinkList L,int i,ElemType &e){
DuLNode *p=L->next;
int j=1; //初始化
while(p&&j<i){ //向後掃描,直到p指向第i個元素或p爲空
p=p->next; ++j;
}
if(!p || j>i)return ERROR; //第i個元素不存在
e=p->data; //取第i個元素
return OK;
}
//在線性表L中查找值爲e的數據元素
DuLNode *LocateELem_L(DuLinkList L,ElemType e) {
//返回L中值爲e的數據元素的地址,查找失敗返回NULL
DuLNode *p=L->next;
while(p &&p->data!=e)
p=p->next;
return p;
}
//在帶頭結點的雙向鏈表L中查找第i個元素,返回結點的地址
DuLNode *GetElemP_DuL(DuLinkList L, int i) {
//在帶頭結點的雙向鏈表L中查找第i個元素,返回結點的地址
int j;
DuLinkList p;
p = L->next;
j = 1; //初始化,p指向第一個結點,j爲計數器
while (j < i && p) { //順鏈域向後掃描,直到p指向第i個元素或p爲空
p = p->next;
++j;
}
if (!p || j > i)
return NULL; //第i個元素不存在
return p;
} //GetElemP_DuL
//雙向鏈表的插入
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){
DuLinkList p;
DuLNode *s;
if(!(p=GetElemP_DuL(L,i))) return ERROR;//在L中確定第i個元素的位置指針p
s=new DuLNode;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return OK;
}
//雙向鏈表的刪除
Status ListDelete_DuL(DuLinkList &L,int i)
{
DuLinkList p;
if(!(p=GetElemP_DuL(L,i)))
return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
return OK;
}
int main(){
//第一步 初始化雙向鏈表
DuLinkList L;
DuLNode *p,*q,*Locate_Address;
int Init_flag,GetElem_flag;
int n=5;//建立雙向鏈表時需要創建節點的個數
Init_flag=InitList_L(L);
if(Init_flag)
cout<<"Init OK!"<<endl;
else
cout<<"Init ERROR!"<<endl;
//第二步 利用尾插法建立雙向鏈表
cout<<"Please Input The DuLinkList Elem_Value( "<<n<<" values):"<<endl;
CreateList_L(L,n);
cout<<"Create DuLinkList OK!"<<endl;
Out_LinkList(L->next);//輸出現有雙向鏈表中元素
cout<<endl;
//第三步 雙向鏈表按照位置i取值
int GetElem_i;
ElemType GetElem_e;
cout<<"Please Input The GetElem_i: ";
cin>>GetElem_i;
GetElem_flag=GetElem_L(L,GetElem_i,GetElem_e);
if(GetElem_flag)
cout<<"GetElem Is OK:"<<GetElem_e<<endl;
else
cout<<"GetElem Is ERROR!"<<endl;
//第四步 雙向鏈表按值查找,如果找到返回地址,否則返回null
ElemType Locate_e;
cout<<"Please input LocateElem value:";
cin>>Locate_e;
Locate_Address=LocateELem_L(L,Locate_e);
if(Locate_Address!=NULL)
cout<<"LocateElem Is OK, The Address Is:"<<Locate_Address<<endl;
else
cout<<"LocateElem Is ERROR!"<<endl;
//第五步 雙向鏈表的插入操作
ElemType ListInsert_e;
int ListInsert_i,ListInsert_flag;
cout<<"Please Input The DuListInsert_i:";
cin>>ListInsert_i;
cout<<"Please Input The DuListInsert_e:";
cin>>ListInsert_e;
ListInsert_flag=ListInsert_DuL(L,ListInsert_i,ListInsert_e);
if(ListInsert_flag)
{
cout<<"DuListInsert Is OK!"<<endl;
cout<<"The DuLinkList of Length is: "<<ListLength_L(L)<<endl;
Out_LinkList(L->next);//輸出現有單鏈表中元素
}
else
cout<<"DuListInsert Is ERROR!"<<endl;
cout<<endl;
//第六步 雙向鏈表刪除操作
int delete_i,delete_flag;
cout<<"Please input The delete_i:";
cin>>delete_i;
delete_flag=ListDelete_DuL(L,delete_i);
if(delete_flag)
{
cout<<"DuListDelete is Ok!"<<endl;
cout<<"The DuLinkList of length is: "<<ListLength_L(L)<<endl;
Out_LinkList(L->next);//輸出現有單鏈表中元素
}
else
cout<<"DuListDelete Is ERROR!"<<endl;
return OK;
}
雙向鏈表各種操作(尾插法建表、初始化、求表長、查找、刪除、插入、取值)17計科班教學用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.