雙向鏈表的操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章