【數據結構】線性表的鏈式存儲結構簡單實現及應用

        鏈表是指用一組任意的存儲單元來依次存放線性表的結點,這組存儲單元即可以是連續的,也可以是不連續的,甚至是零散分佈在內存中的任意位置上的。因此,鏈表中結點的邏輯次序和物理次序不一定相同。爲了能正確表示結點間的邏輯關係,在存儲每個結點值的同時,還必須存儲指示其後繼結點的地址(或位置)信息,這個信息稱爲指針(pointer)或鏈(link)。這兩部分組成了鏈表中的結點結構:

  1)存儲數據元素自身信息的部分,稱爲數據域;

  2)存儲與前驅或後繼結點的邏輯關係,稱爲指針域;

                                                            

其中:data域是數據域,用來存放結點的值。next是指針域(亦稱鏈域),用來存放結點的直接後繼的地址(或位置)。鏈表正是通過每個結點的鏈域將線性表的n個結點按其邏輯次序鏈接在一起的。由於上述鏈表的每一個結只有一個鏈域,故將這種鏈表稱爲單鏈表Single Linked)。

   顯然,單鏈表中每個結點的存儲地址是存放在其前趨結點next域中,而開始結點無前趨,故應設頭指針head指向開始結點。同時,由於最後一個結點無後繼,故結點的指針域爲空,即NULL(圖示中常用^表示)。

#include<iostream>//單鏈表基本操作插入 刪除 增加 獲得長度 打印
using namespace std;
typedef int ElemType;
typedef struct lnode
{
    int data;
    lnode *next;//lnode 類的啊啊啊
}lnode;
class LinkList
{
private:
    lnode *head;
    int length = 0 ;
public:
    void CreatList1(int n);//頭插法
    void CreatList2(int n);//尾插法
    void ListInsert(int i,int e);//插入i個位置某個數e
    int ListDelete(int i);//刪掉第i個數
    int GetElem(int i);//獲得第i個數
    int LocateElem(int e);//獲得數e的地址
    int Listlength();//獲得長度
    void printList();//打印鏈表;
    void reverse(lnode *& head);
};
void LinkList::CreatList1(int n)
{
    lnode *p;
    cout<<"輸入"<<n<<"個數據元素值"<<endl;
    for(int i=0;i<n;i++)
    {
        p=new lnode;
        cin>>p->data;
        p->next=head->next;
        head->next=p;
        length++;
    }
}
void LinkList::CreatList2(int n)
{
    lnode *p,*s=head;
    cout<<"輸入"<<n<<"個數據元素"<<endl;
    for(int i=0;i<n;i++)
    {
        p=new lnode;
        cin>>p->data;
        p->next=NULL;
        s->next=p;
        s=p;
        length++;
    }
}

int LinkList::LocateElem(int e)
{
    lnode *p=head->next;
    int j=1;
    while(p&&p->data!=e)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)
        return 0;
    else
        return j;
}
int LinkList::GetElem(int i)
{
    lnode *p=head->next;
    int j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return -1;
    else
        return p->data;
}
void LinkList::ListInsert(int i,int e)
 {
     int j=0;
     lnode*p=head;
     while (p&&j<i-1)
     {
         p=p->next;
         j++;
     }
     if(!p||j>i-1)
     {
         cout<<"failure"<<endl;
         return ;
     }
     else
     {
         lnode*s=new lnode;
         s->data=e;
         s->next=p->next;
         p->next=s;
         length++;
     }
 }
int LinkList::ListDelete(int i)
{
    int j=0;
    lnode*p=head;
    while (p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
    {
        cout<<"fail to delete"<<endl;
        return -1;
    }
    else
    {
        lnode*s=p->next;
        p->next=s->next;
        j=s->data;
        delete s;
        return j;
    }
}
int LinkList::Listlength()
{
    return length;
}
void LinkList::printList()
{
    int i = length;
    lnode* p = head;
    while(i --)
    {
        p = p -> next;
        cout<<p -> data <<" ";
    }
}
void LinkList::reverse(lnode *& head)
{
    lnode* p = head -> next;
    if(!p || ! p -> next)
    {
        cout<<" wrong"<<endl;
        return;
    }
    lnode * qr = p -> next, * q;
    p ->next = NULL;
}
int main()
{
    LinkList LinkLista;
    LinkLista.CreatList1(5);
    LinkLista.printList();
    cout << "length:"<<LinkLista.Listlength()<<endl;
    LinkLista.ListInsert(2,5);
    LinkLista.printList();

    return 0;
}

 

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