1. 程式人生 > >2順序表及連結串列基本運算實現

2順序表及連結串列基本運算實現

實驗目的

深入掌握線性表的兩種儲存方法,即順序表和連結串列。體會這兩種儲存結構之間的差異。

實驗內容

1. 編寫一個程式exp2-1.cpp,實現順序表的各種運算(假設順序表的元素型別為char)

並在此基礎上完成如下功能:
(1)初始化順序表L;
(2)採用尾插法依次插入元素a,b,c,d,e;
(3)輸出順序表L;
(4)輸出順序表L的長度;
(5)判斷順序表L是否為空;
(6)輸出順序表L的第3個元素;
(7)輸出元素a的位置;
(8)在第4個元素位置上插入元素f;
(9)輸出順序表L;
(10)刪除L的第3個元素;
(11)輸出順序表L;
(12)釋放順序表L
#include <iostream>
#include <malloc.h>
using namespace std;
typedef char
ElemType;
typedef class Sqlist{
    public:
    ElemType data[100];
    int length;
};
void CreateList(Sqlist *&L,ElemType a[],int n);
void InitList(Sqlist *&L);
void DisList(Sqlist *L);//輸出元素
void ListLength(Sqlist *L);//輸出長度
bool judge(Sqlist *L);   //判斷線性表是否為空
bool getElem(Sqlist *L,int i);     //輸出線性表第e個元素
int LocatElem(Sqlist *L,ElemType e);         //8.輸出指定元素位置
bool ListInsert(Sqlist *L,int i,ElemType e);    //9.在第i個元素位置上插入元素e
bool ListDle(Sqlist *L,int i,ElemType e);      //刪除元素
void DestroyList(Sqlist *&L);                //銷燬線性表
int main()
{
    Sqlist *L;
    char a[]={'a','b','c','d','e'};
    cout<<"(1)初始化線性表"<<endl;
    InitList(L);
    cout<<"(2)採用尾插法依次插入元素a,b,c,d,e"<<endl;
    CreateList(L,a,5);
    cout<<"(3)輸出順序表L:";
    DisList(L);
    cout<<"(4)順序表L的長度=";
    ListLength(L);
    cout<<"(5)順序表L為";
    if(judge(L))
        cout<<"空!"<<endl;
    else
        cout<<"非空!"<<endl;
    cout<<"(6)順序表的第三個元素=";
    if(getElem(L,3));
    cout<<"(7)元素a的位置:"<<LocatElem(L,'a');
    cout<<"(8)在第四個位置插入元素f";
    if(ListInsert(L,4,'f'))
        cout<<endl;
    cout<<"(9)輸出順序表:";
    DisList(L);
    cout<<"(10)刪除線性表L第三個元素";
    if(ListDle(L,3,'e'));
        cout<<endl;
    cout<<"(11)輸出順序表:";
    DisList(L);
    cout<<"(12)釋放線性表"<<endl;
    DestroyList(L);
    return 0;
}
void CreateList(Sqlist *&L,ElemType a[],int n)
{
    int i;
    L=(Sqlist * )malloc(sizeof(Sqlist));
    for(int i=0;i<n;++i)
    {
        L->data[i]=a[i];
    }
    L->length=n;
}
void InitList(Sqlist *&L)
{
    L=(Sqlist * )malloc(sizeof(Sqlist));
    L->length=0;
}
void DisList(Sqlist *L)   //輸出元素
{
    for(int i=0;i<L->length;++i)
    {
        cout<<L->data[i]<<" ";
    }
    cout<<endl;
}
void ListLength(Sqlist *L)   //輸出長度
{
    cout<<L->length<<endl;
}
bool judge(Sqlist *L)   //判斷線性表是否為空
{
    return(L->length==0);
}
bool getElem(Sqlist *L,int i)     //7.輸出線性表第e個元素
{
    if(i<1||i>L->length)
        return false;
    cout<<L->data[i-1]<<endl;
    return true;
}
int LocatElem(Sqlist *L,ElemType e)        //8.輸出指定元素位置
{
    int i=0;
    while(i<L->length&&L->data[i]!=e)
        i++;
    if(i>=L->length)
        return 0;
    else
        return i+1;
}
bool ListInsert(Sqlist *L,int i,ElemType e)    //9.在第i個元素位置上插入元素e
{
    int j;
    if(i<1||i>L->length+1)
        return false;
    i--;
    for(j=L->length;j>i;--j)
        L->data[j]=L->data[j-1];
    L->data[i]=e;
    L->length++;
    return true;
}
bool ListDle(Sqlist *L,int i,ElemType e)    //9.在第i個元素位置上插入元素e
{
    int j;
    if(i<1||i>L->length+1)
        return false;
    i--;
    e=L->data[i];
    for(j=i;j<L->length;++j)
        L->data[j]=L->data[j+1];
    L->length--;
    return true;
}
void DestroyList(Sqlist *&L)                //銷燬線性表
{
    free(L);
}

2. 編寫一個程式exp2-2.cpp,實現單鏈表的各種基本運算(假設單鏈表的元素型別為char)

並在此基礎上完成如下功能:

(1)初始化單鏈表h;
(2)採用尾插法依次插入元素a,b,c,d,e;
(3)輸出單鏈表h;
(4)輸出單鏈表h長度;
(5)判斷單鏈表h是否為空;
(6)輸出單鏈表h的第3個元素;
(7)輸出元素a的位置;
(8)在第4個元素位置上插入元素f;
(9)輸出單鏈表h;
(10)刪除h的第3個元素;
(11)輸出單鏈表h;
(12)釋放單鏈表h

#include <iostream>
#include <malloc.h>
using namespace std;
typedef char ElemType;
typedef class Linklist{
    public:
    ElemType data;
    Linklist *next;
};
void CreateList(Linklist *&L,ElemType a[],int n);
void InitList(Linklist *&L);
void DisList(Linklist *L);//輸出元素
void ListLength(Linklist *L);//輸出長度
bool judge(Linklist *L);   //判斷線性表是否為空
bool getElem(Linklist *L,int i);     //輸出線性表第e個元素
int LocatElem(Linklist *L,ElemType e);         //8.輸出指定元素位置
bool ListInsert(Linklist *L,int i,ElemType e);    //9.在第i個元素位置上插入元素e
bool ListDle(Linklist *L,int i,ElemType e);      //刪除元素
void DestroyList(Linklist *&L);                //銷燬線性表
int main()
{
    Linklist *L;
    char a[]={'a','b','c','d','e'};
    cout<<"(1)初始化單鏈表"<<endl;
    InitList(L);
    cout<<"(2)採用尾插法依次插入元素a,b,c,d,e"<<endl;
    //if(L->data=='x')
   //     cout<<'Y'<<endl;
    CreateList(L,a,5);
    cout<<"(3)輸出單鏈表h:";
    DisList(L);
    cout<<"(4)單鏈表h的長度=";
    ListLength(L);
    cout<<"(5)單鏈表h為";
    if(judge(L))
        cout<<"空!"<<endl;
    else
        cout<<"非空!"<<endl;
    cout<<"(6)單鏈表的第三個元素=";
    if(getElem(L,3));
    cout<<"(7)元素a的位置:"<<LocatElem(L,'a')<<endl;
    cout<<"(8)在第四個位置插入元素f";
    if(ListInsert(L,4,'f'))
        cout<<endl;
    cout<<"(9)輸出單鏈表h:";
    DisList(L);
    cout<<"(10)刪除單鏈表h第三個元素";
    if(ListDle(L,3,'e'));
        cout<<endl;
    cout<<"(11)輸出單鏈表:";
    DisList(L);
    cout<<"(12)釋放單鏈表"<<endl;
    DestroyList(L);
    return 0;
}
void CreateList(Linklist *&L,ElemType a[],int n)
{
    Linklist *s,*r;
    int i;
    L=(Linklist * )malloc(sizeof(Linklist));
    r=L;
    for(int i=0;i<n;++i)
    {
        s=(Linklist *)malloc(sizeof(Linklist));
        s->data=a[i];
        cout<<s->data<<endl;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void InitList(Linklist *&L)
{
    L=(Linklist * )malloc(sizeof(Linklist));
    L->next=NULL;
}
void DisList(Linklist *L)   //輸出元素
{
    Linklist *p=L;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
void ListLength(Linklist *L)   //輸出長度
{
    int n=0;
    Linklist *p=L;
    while(p->next!=NULL)
    {
        n++;
        p=p->next;
    }
    cout<<n<<endl;
}
bool judge(Linklist *L)   //判斷線性表是否為空
{
    return(L->next==NULL);
}
bool getElem(Linklist *L,int i)     //7.輸出線性表第e個元素
{
    int j=0;
    Linklist *p=L;
    while(j<i&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
        return false;
    else
    {
        cout<<p->data<<endl;
        return true;
    }
}
int LocatElem(Linklist *L,ElemType e)        //8.輸出指定元素位置
{
    int i=1;
    Linklist *p=L->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return 0;
    else
        return i;
}
bool ListInsert(Linklist *L,int i,ElemType e)    //9.在第i個元素位置上插入元素e
{
    int j=0;
    Linklist *p=L,*s;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
       return false;
    else
    {
        s=(Linklist *)malloc(sizeof(Linklist));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return true;
    }
}
bool ListDle(Linklist *L,int i,ElemType e)    //9.在第i個元素位置上s刪除元素e
{
    int j=0;
    Linklist *p=L,*q;
    while(j<i-1&&p!=NULL)
    {
        j++;
        p=p->next;
    }
    if(p==NULL)
       return false;
    else
    {
        q=p->next;
        if(q==NULL)
            return false;
        e=q->data;
        p->next=q->next;
        free(q);
        return true;
    }
}
void DestroyList(Linklist *&L)                //銷燬線性表
{
    free(L);
}

執行結果: