线性表

线性表是最简单、也是最基本的一种线性数据结构。

它有两种存储表示法顺序表和链表,最基本的操作是插入、删除和查找等。

顺序存储结构就是从内存中取出一段连续地址的空间,将数据依次连续的存储在这段空间中。                                     顺序表

链式存储结构是指数据存储在内存中的地址是离散的,以数据节点为单位,每个节点包括数据域和指针域。               单链表

 

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

顺序表的基本操作如下:

#include <stdio.h> 
#include <iostream.h>

const int LIST_SIZE = 5; //顺序表长度

class List 
{ 
private:
    int *elem;    //顺序表
    int length; //顺序表的当前长度
    int listsize; //顺序表的长度
public:
    void InitList();    //构造一个空线性表 
    int GetElem(int i);    //返回线性表第i个元素的值
    int GetLocateElem(int value); //返回顺序表中第一个与element相等的元素的位序 
    int GetPreElem(int e);    //返回线性表中e的前驱pre_e
    int Length();    //返回线性表长度
    
    void Insert(int i, int e); //在线性表第i个元素前插入e 
    int Delete(int i); //删除线性表中第i个元素,并用e返回被删数的值 
    
    void InputList(); //输入元素到表中
    void OutputList(); //将顺序表中的元素输出
    void DestroyList();    //销毁线性表 
    void ClearList();    //清空线性表 
    void IsEmpty();    //判断线性表是否为空 
};


void List::InitList()
{ 
    if((elem = new int[LIST_SIZE])== NULL)
        //(ElemType*)malloc(sizeof(int)* LIST_SIZE)) == NULL) 
        //malloc动态分配内存空间,成功返回指针,失败返回NULL
        cout<<"出现错误"<<endl; 
    else 
    { 
        length = 0; 
        listsize = LIST_SIZE; 
        cout<<"初始化成功"<<endl; 
    } 
}

void List::DestroyList() 
{ 
    if(elem == NULL) 
        cout<<"出现错误"<<endl; 
    else 
    { 
        delete[] elem;
        //free(elem); 系统自带的C语言函数free()
        cout<<"销毁成功"<<endl; 
    } 
}

void List::ClearList() 
{ 
    if (elem == NULL) cout<<"出现错误"<<endl; 
    else 
    { 
        length = 0; 
        cout<<"清空成功"<<endl; 
    } 
}

void List::IsEmpty() 
{ 
    if (length == 0) cout<<"为空"<<endl; 
    else cout<<"不为空"<<endl; 
}

int List::Length() 
{ 
    return length; 
}

int List::GetElem(int i) 
{ 
    if ((i < 1)||(i > Length())) 
        cout<<"数据溢出"<<endl; 
    int j = 1,e;
    int *p; 
    p = elem; 
    while(j<i)
    {
        elem++; j++;
    }
    e = *elem; 
    elem = p; 
    return e;
}

int List::GetLocateElem(int value) 
{ 
    int *p; 
    p = elem; 
    for (int i = 1;i <= length; i++) 
    { 
        if (*elem == value) 
        { 
            elem = p; 
            return i; 
        } 
        elem++; 
    } 
    elem = p; 
    return 0;
}

int List::GetPreElem(int e) 
{ 
    int *p = elem ,*pre_e; 
    int i = GetLocateElem(e); //这里不用&L 因为这是按引用调用 
    for (int j = 0;j < i - 2; j++) 
    { 
        elem++; 
    } 
    *pre_e = *elem; 
    elem = p; 
    return *pre_e;
}

void List::Insert(int i, int e) 
{ 
    if (i < 1||i > (length)+1) 
        cout<<"数据溢出"<<endl; 
    if (length >= listsize)
    { 
        int *newList;
        newList = new int[listsize + 1];
        //(ElemType*)realloc(L.elem,L.listsize + sizeof(ElemType)) ; 
        
        for(int j=0;j<length;j++)
        {
            newList[j]=elem[j];
        }
        delete[] elem;
        elem = newList; 
        listsize++; 
    }
    int *q = &(elem[i - 1]); 
    int *p;
    for (p = &(elem[length - 1]);p >= q; p--) 
        *(p + 1) = *p; 
    *q = e; 
    length++; 
    cout<<"插入成功"<<endl; 
} 

int List::Delete(int i) 
{ 
    
    if ((i < 1)||(i > length)) 
        cout<<"数据溢出"<<endl; 
    int e = (elem[i - 1]); 
    int *q; 
    for (q = &(elem[i - 1]); q < &(elem[length - 1]); q++ ) 
    { 
        *q = *(q + 1); 
    } 
    length--; 
    return e;
}

void List::OutputList() 
{ 
    if ((elem == NULL)||(length==0)) 
        cout<<"出现错误"<<endl; 
    else 
    { 
        for (int i = 0; i < length; i++) 
        { 
            cout<<elem[i]<<" "; 
        } 
        cout<<endl; 
    } 
}

void List::InputList() 
{ 
    int a; 
    cout<<"enter numbers:"<<endl; 
    for (int i = 0; i < LIST_SIZE; i++) 
    { 
        cin>>a; 
        Insert(i+1, a); 
    } 
}

int main() 
{ 
    List La, Lb; 
    int e; 
    La.InitList(); 
    Lb.InitList(); 
    La.InputList(); 
    Lb.InputList(); 
    for (int i = 0; i < Lb.Length(); i++) 
    { 
        e = Lb.GetElem(i+1);
        printf("n%d",e); //将顺序表Lb的数据元素通过位置查询一个个输出
        if (!La.GetLocateElem(e)) 
            La.Insert(La.Length()+1, e); //判断Lb中的一个数据La中是否也有,如果没有,插入到La后
        // Lb.elem++; 
    } 
    printf("nLa = ");
    La.OutputList(); 
    La.Delete(5);
    La.OutputList();
    La.ClearList();
    return 0; 
}

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!