前面几篇博客,小编以线性结构为例,对数据结构的定义进行了简单介绍,对数据结构常用算法中的初始化与判空也逐一进行了介绍,本篇博文,小编将和大家一起学习线性结构的插入操作。
链式存储
(一)单链表
//单链表插入结点
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)线性表插入会影响插入位置之后所有结点,栈和队列不会影响其他结点。
小结
不同的存储结构对同一个逻辑结构有不同的操作,同一个存储结构对不同的逻辑结构也有不同的操作,因此,我们需要将其进行对比,发现他们的异同之处。