【数据结构】线性结构——插入

   前面几篇博客,小编以线性结构为例,对数据结构的定义进行了简单介绍,对数据结构常用算法中的初始化与判空也逐一进行了介绍,本篇博文,小编将和大家一起学习线性结构的插入操作。

链式存储

(一)单链表

这里写图片描述

//单链表插入结点
void InsertLinklist(LinkList head,DataType x,int i)
//在表head的第i个数据元素结点之前插入一个以x为值的新结点
{
    Node *p,*q;
    if(i==1)  q=head;
    else q=GetLinkList(head,i-1);   //读表元素,找第i个数据元素结点
    if(q==NULL)                     //第i-1个结点不存在
        exit("");
    else{
        p=malloc(sizeof(Node));p->data=x;//生成新结点
        p->next=q->next;                 //新结点链域指向*q的后继结点
        q->next=p;                       //修改*q的链域
    }   
}


(二)进栈

这里写图片描述

//进栈
void Push(LkStk *LS,DataType x)
{
    LkStk *temp;
    temp=(LkStk *)malloc(sizeof(LkStk));//temp指向申请的新结点
    temp->data=x;                       //新结点的data域赋值为x
    temp->next=LS->next;                //temp的next域指向原来的栈顶结点
    LS->next=temp;                      //指向新的栈顶结点
}


(三)入队

这里写图片描述

//入队
void Enqueue(LkQue *LQ,DataType x)
{
    LkQueNode *temp;
    temp=(LkQueNode *)malloc(sizeof(LkQueNode));
    temp->data=x;
    temp->next=NULL;
    (LQ->rear)->next=temp;  //新结点入队列
    LQ->rear=temp;          //置新的队列尾结点
}



异同点

(一)同

(1)总体思路:生成结点->修改指针
(2)新结点内容:数据域,指针域赋值
(3)指针变化顺序:先将新结点的指针域指向要插入位置的下一个结点,然后将插入位置上一个结点的指针域改为新插入的结点。顺序不可以变化,否则会丢失原结点位置的指针。

(二)异

(1)线性表可以在合法位置插入结点,栈只能在栈顶插入结点,队列只能在对尾插入结点。
(2)线性表需要找到插入位置的结点和前一个结点,栈和队列无需寻找的过程,可以直接使用栈顶元素结点/队列首结点。
(3)线性表和栈,新插入结点的指针域指向下一个结点;队列新插入的结点的指针域为空。



顺序存储

(一)顺序表

//顺序表插入元素
void InsertSeqlist(SeqList L,DataType x,int i)
//将元素x插入到顺序表L的第i个数据元素之前
{
    if(L.length==Maxsize)  exit("表已满");
    if(i<1||i>L.length+1)  exit("位置错");//检查插入位置是否合法
    for(j=L.length;j>=i;j--)              //初始j=L.length
        L.data[j]=L.data[j-1];            //依次后移
    L.data[i-1]=x;                        //元素x置入到下标为i-1的位置
    L.length++;                           //表长度+1
}


(二)进栈

//进栈
int push(SeqStk *stk,DataType x)
//若栈未满,元素x进栈stk中,否则提示出错信息
{
    if(stk->top==maxsize-1)          //判断栈是否满
        {error("栈已满");return 0;}
    else{
        stk->top++;                  //栈未满,top值加1
        stk->data[stk->top]=x;       //元素x进栈
        return 1;
    }
}


(三)入队

//入队
int Enqueue(CycQue CQ,DataType x)
{
    if((CQ.rear+1)%maxsize==CQ.front)   
        {error("队已满");return 0;}    //队列满,入队列失败
    else{
        CQ.rear=(CQ.rear+1)%maxsize;
        CQ.data[CQ.rear]=x;            //入队列成功
        return 1;
    }
}


异同点

(一)同

(1)总体思路:判满—>插入结点
(1)结果:结点插入之后,线性表/栈/队列长度加1

(二)异

(1)线性表可以在合法位置插入结点,栈只能在栈顶插入结点,队列只能在对尾插入结点。
(2)线性表还需要判断插入结点的位置是否正确,不能插入到第0(位置不存在)个结点,以及第i+1(线性表顺序存储过程中间任一结点的内容不能为空)个结点的位置。
(3)线性表插入会影响插入位置之后所有结点,栈和队列不会影响其他结点。



小结

   不同的存储结构对同一个逻辑结构有不同的操作,同一个存储结构对不同的逻辑结构也有不同的操作,因此,我们需要将其进行对比,发现他们的异同之处。

猜你喜欢

转载自blog.csdn.net/ljl55555/article/details/78420879