数据结构与算法 | 线性表及链表

一、线性表

定义:线性表是 n (≥0)个元素构成的有序序列( a1,a2,a3,......)。

操作:

//ElementType 表示元素类型,i是指链表的位置
List MakeEmpty()//初始化一个空线性表L;
ElementType FindKth( int K, List L )//根据位序K,返回相应元素 ;
int Find( ElementType X, List L ) //在线性表L中查找X的第一次出现位置;
void Insert( ElementType X, int i, List L) //在位序i前插入一个新元素X;
void Delete( int i, List L ) // 删除指定位序i的元素;
int Length( List L ) //返回线性表L的长度n。

二、顺序储存实现

利用数组的连续存储空间顺序存放线性表的各元素。

特点:查找和求长度时间效率高O(1),插入和删除时间效率低O(n)。

表示:

const int MaxSize = 100; //链表最大容量为100
typedef struct LNode* List;
struct LNode{
    int Data[MaxSize]; 
    int Last;  //链表储存最后一个元素的位置
};
List PtrL; 

1、创建空链表

List MakeList(){
    List L = new LNode;
    L->Last = -1;
    return L;
}

2、查找位序K的元素

int FindKth(List L,int K){
    if(L==nullptr || K<0)
        throw new exception("Invalid Input");
    return L->Data[K];
}

3、查找元素值为X的链表位序

int Find(List L,int X){
    if(L == nullptr)
        return -1;
    int i = 0;
    while(i<=L->Last)
    {
        if(L->Data[i] == X)
            return i;
    }
    return -1;
}

4、在第i位置插入元素X

void Insert(List L,int i,int X){
    if(L == nullptr||L->Last==MaxSize)
        return;
    if(i<1||i>L->Last+2;
    for(int h=Last;h>=i;++h)
    {
        L->Data[h+1] = L->Data[h];
    }
    L->Data[i-1] = X;
    L->Last++;
    return;
}

5、删除表第i位置上的元素

void Delete(List L,int i){
    if(L==nullptr)
        return;
    if(i<0 || i>last+2)
        return;
    for(int h=i-1;h<Last;++h)
    {
        L->Data[h] = L->Data[h+1];
    }
    L->Last--;
}

6、求链表长度

int Length(List L){
    if(L==nullptr)
        return -1;
    return L->Last;
}

二、链表实现

储存地址可以不连续,但通过“链”形式可以逻辑上两个元素相邻。

特点:插入和删除时并不需要移动元素

表示:

typedef struct LNode* List;
struct LNode{
    int Data;
    LNode* Next;
}
List L;

1、创建空链表

List MakeList(){
    List L = new LNode();
    L->Next = nullptr;
    return L;
}

2、查找位序K的节点

List FindKth(List *L,int K){
    if(K<0)
        return nullptr;
    List p =*L;
    int count = 0;
    while(p!=nullptr &&count!=K){
        p=p->Next;
        count++;
    }
    if(count==K)
        return p;
    else
        return nullptr;
}

3、查找元素值为X的节点

List Find(List *L,int X){
    List p =*L;
    while(p!=nullptr&&p->Data!=X){
        p = p->Next;
    }
    if(p->Data == X)
        return p;
    else
        return nullptr;
}

4、在第i个节点前插入值为X的新节点

List Insert(List *L,int i,int X){
    if(i<0)
        return nullptr;
    if(i==1){
        List NewNode = new LNode ();
        NewNode->Data = X;
        NewNode->Next = *L;
        return NewNode;
    }
    List p =*L;
    int count =0;
    while(p!=nullptr&&count!=i-1){
        p = p->Next;
        ++count;
    }
    if(p==nullptr)
        return nullptr;
    else{
        List NewNode = new LNode;
        NewNode->Data = X;
        NewNode->Next = p->Next;
        p->Next = NewNode;
        return *L;
    }
}

5、删除表第i位置上的元素

List Delete(List *L,int i){
    if(i<0)
        return nullptr;
    if(i==1){
        List p = *L;
        if(p!=nullptr)
            p=p->Next;
        else
            return nullptr;
        delete *L;
        return p;
    }
    List p = *L;
    int count =0;
    while(p!=nullptr&&count!=i-1){
        p=p->Next;
        i++;
    }
    if(p==nullptr)
        return nullptr;
    else{
        List x = p->Next;
        p->Next = x->Next;
        delete x;
        x = nullptr;
        return L;
    }
}

三、面试题

1、从尾到头打印链表每个节点的值

//反转链表
void PrintListReversingly_Iteratively(List pHead){
    if(pHead==nullptr)
        return;
    if(pHead->Next==nullptr)
        cout<<pHead->Data<<endl;
    List p0 = pHead;
    List p1 = pHead->Next;
    List p2 = pHead->Next->Next;
    while(p2!=nullptr){
        p1->Next=p0;
        p0=p1;
        p1=p2;
        p2=p2->Next;
    }
    while(p1!=pHead){
        cout<<p1->Data<<" ";
        p1=p1->Next;
    }
    cout<<p1->Data<<endl;
    p0=p1=p2=nullptr;
}

//栈实现
void PrintListReversingly_Iteratively(List pHead){
    if(pHead==nullptr)
        return;
    stack<List>nodes;
    List p = pHead;
    while(p!=nullptr){
        nodes.push(p->Data);
        p=p->Next;
    }
    while(!nodes.empty()){
        cout<<nodes.top()<<" ";
        nodes.pop();
    }
}
    

猜你喜欢

转载自blog.csdn.net/qq_39930643/article/details/87942729