线性表、栈、队列 相关问题

一. 简介

  • 线性结构:
    ①存在唯一一个被称为“第一个”的元素;也存在唯一一个被称为“最后一个”的元素。
    ②除第一个外,每一个元素只有一个前驱;除了最后一个外,每一个元素只有一个后驱。
  • 线性表的顺序表示:用一组地址连续的存储单元一次存储线性表的数据元素。
    如果满足LOC(ai)=LOC(a1)+(i-1)*l (l是每个元素的存储长度),则说明这个线性表是顺序表示的。
  • 顺序的线性表插入或删除元素时候,时间主要耗费在移动元素上。长度为n的线性表插入和删除操作的时间复杂度均为O(n)

二. 线性表的链式表示

1. 线性链表

  • 线性链式存储,是用一组任意的存储单元存储线性表的数据元素(可以是连续的,也可以是不连续的)。一个结点(node)分成两个部分:一个存储数据元素信息的数据域,一个存储后续存储位置的指针域

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
  • 整个链表的存储必须从头指针开始进行,头指针指向链表第一个结点的存储位置。

  • 单链表插入:插入元素x,p为x的前一元素的指针,s为指向x的指针

s->next=p->next;
p->next=s;
bool ListInsert(LinkList &L,int i,ElemType e){
    LinkList p=L;   int j=0;
    //寻找第i-1个结点
    while(p&&j<i-1){
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return false;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return true;
}
  • 删除一个结点:
bool ListDelete(LinkList &L,int i,ElemType &e){
    LinkList p=L;   int j=0;
    //寻找第i个结点
    while(p->next && j<i-1){
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)
        return false;
   LinkList *q=p->next;
   p->next=q->next;
   e=q->date;
   free(q);
    return true;
}

2. 循环链表

  • 循环链表:表中最后一个结点的指针域不为空,而是指向头结点。整个链表构成一个环。

3. 双向链表

  • 双向链表有两个指针域,一个指向后继,一个指向前趋。
  • 双向链表也可以有循环表。即表中有两个环。

三. 栈和队列

 

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81434317