#include <iostream>
using namespace std;
//打印選項
void printTheSelect()
{
cout<<"\n1.初始化雙向鏈表\n2.打印雙向鏈表\n3.逆序打印雙向鏈表\n";
cout<<"4.求鏈表長度\n5.判斷鏈表是否爲空\n6.清空鏈表\n";
cout<<"7.插入元素\n8.刪除元素\n9.刪除鏈表\n0.退出\n";
}
typedef struct DuLnode
{
int data; //數據
struct DuLnode *prior; //前驅
struct DuLnode *next; //後繼
}DuLnode,*DuLinkList;
//初始化雙向鏈表
void initDlist(DuLinkList &L)
{
int x;
DuLinkList p,q;//p,q就是struct DuLnode *
//L = new DuLnode;
L = (DuLinkList)malloc(sizeof(DuLnode));
L->next = NULL;
L->prior = NULL;
p = L;
cout<<"輸入雙向鏈表的元素,每輸入一個元素後按回車,輸入0表示結束.\n";
cin>>x;
while(x != 0)//尾插法
{
q = (DuLinkList)malloc(sizeof(DuLnode));
q->data = x;
q->next = NULL;
q->prior = p;
p->next = q;
p = q;
cin>>x;
}
cout<<"雙向鏈表構造完畢!\n";
}
//打印雙向鏈表
void printDlist(DuLinkList &L)
{
DuLinkList p;
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else if(L->next == NULL)
{
cout<<"鏈表爲空!\n";
}
else
{
cout<<"鏈表的元素爲:\n";
p = L->next;//p指向第一個元素
while(p)
{
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
}
//逆序打印雙向鏈表
void printDlistFromLast(DuLinkList &L)
{
DuLinkList p;
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else if( L->next == NULL )
{
cout<<"鏈表爲空!\n";
}
else
{
p = L->next;//
while(p->next)
{
p = p->next;
}
//p指向了最後一個
while(p->prior)
{
cout<<p->data<<" ";
p = p->prior;
}
}
}
//求鏈表長度
int lengthDlist(DuLinkList &L)
{
int i = 0;
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else
{
DuLinkList p = L->next;
while(p)
{
i++;
p = p->next;
}
}
return i;
}
//判斷鏈表是否爲空
void isEmptyOrNotDlist(DuLinkList &L)
{
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else if( L->next == NULL )
{
cout<<"鏈表爲空!\n";
}
else
{
cout<<"鏈表非空!\n";
}
}
//把雙向鏈表置空(頭結點保留)
void clearTheDlist(DuLinkList &L)
{
if(L==NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else
{
DuLinkList p,q;
p = q = L->next; //是p、q指向第一個元素
L->next = NULL;
while(p) //逐個釋放元素所佔內存
{
p = p->next;
free(q);
q = p;
}
}
}
//刪除雙向鏈表
void delTheDlist(DuLinkList &L)
{
clearTheDlist(L);
free(L);
L = NULL;
}
//在雙向鏈表中第i個位置後面插入元素m
void insertElmToDlist(DuLinkList &L)
{
int i,m;
cout<<"輸入插入的元素:\n";
cin>>m;
cout<<"輸入插入的位置:\n";
cin>>i;
DuLinkList p,q;
p = L;
int j = 0;
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else if(L->next == NULL)
{
cout<<"鏈表爲空,請初始化後再進行插入數據操作!\n";
}
else if( i<1 || i>lengthDlist(L)+1 )
{
cout<<"插入位置錯誤!\n";
}
else
{
while( j<i-1 )//找到前一個元素
{
p = p->next;
j++;
}
if( j == lengthDlist(L) )
//如果在最後一個元素後面插入m
{
q = (DuLinkList)malloc(sizeof(DuLnode));
q->data = m;
q->next = NULL;
q->prior = p;
p->next = q;
}
else
{
q = (DuLinkList)malloc(sizeof(DuLnode));
q->data = m;
q->next = p->next;
p->next->prior = q;
q->prior = p;
p->next = q;
}
}
}
//刪除雙向鏈表中的第i個元素
void delElmFromDlist(DuLinkList &L)
{
int i;
cout<<"輸入要刪除的位置:";
cin>>i;
int j = 0;
DuLinkList p = L;
if(L == NULL)
{
cout<<"鏈表不存在,請先初始化!\n";
}
else if( i<1 || i>lengthDlist(L) )
{
cout<<"刪除的位置不存在!\n";
}
else
{
while( j<i )//找到第i個元素
{
p = p->next;
j++;
}
if( j == lengthDlist(L) )//如果是最後一個元素
{
p->prior->next = NULL;
free(p);
}
else
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
}
}
int main()
{
int i;
DuLinkList L = NULL;
printTheSelect();
cout<<"請輸入操作:";
cin>>i;
while( 0 != i)
{
switch(i)
{
case 1:initDlist(L);
break;
case 2:printDlist(L);
break;
case 3:printDlistFromLast(L);
break;
case 4:cout<<"鏈表長度爲:"<<lengthDlist(L)<<endl;
break;
case 5:isEmptyOrNotDlist(L);
break;
case 6:clearTheDlist(L);
break;
case 7:insertElmToDlist(L);
break;
case 8:delElmFromDlist(L);
break;
case 9:delTheDlist(L);
break;
default:cout<<"輸入錯誤,請重新輸入!\n";
break;
}
printTheSelect();
cout<<"請輸入操作:";
cin>>i;
}
if(0 == i)
{
cout<<"程序退出....\n";
}
return 0;
}
雙向鏈表的操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.