链表节点删除的方法
⑴ 按序号删除
删除单链表中的第i个结点。
为了删除第i个结点ai,必须找到结点的存储地址。该存储地址是在其直接前趋结点ai-1的next域中,因此,必须首先找到ai-1的存储位置p,然后令p–>next指向ai的直接后继结点,即把ai从链上摘下。最后释放结点ai的空间,将其归还给“存储池”。
设单链表长度为n,则删去第i个结点仅当1≦i≦n时是合法的。则当i=n+1时,虽然被删结点不存在,但其前趋结点却存在,是终端结点。故判断条件之一是p–>next!=NULL。显然此算法的时间复杂度也是O(n)。
void Delete_LinkList(LNode *L, int i)
/*删除以L为头结点的单链表中的第i个结点 */
{
int j=1;
LNode *p,*q;
p=L;
q=L->next;
while ( p->next!=NULL&& j<i)
{ p=q;
q=q–>next;
j++;
} //找到前置节点
if (j!=i)
printf(“i太大或i为0!!\n ”);
else
{ p–>next=q–>next;
free(q);
}
}
栈
Status Init_Stack(void)
//初始化
{ SqStack S ;
S.bottom=(ElemType *)malloc(STACK_SIZE *sizeof(ElemType));
if (! S.bottom) return ERROR;
S.top=S.bottom ; /* 栈空时栈顶和栈底指针相同 */
S. stacksize=STACK_SIZE;
return OK ;
}
压栈(元素进栈)
Status push(SqStack S , ElemType e)
{ if (S.top-S.bottom>=S. stacksize-1)
{ S.bottom=(ElemType *)realloc((S. STACKINCREMENT+STACK_SIZE) *sizeof(ElemType)); /* 栈满,追加存储空间 */
if (! S.bottom) return ERROR;
S.top=S.bottom+S. stacksize ;
S. stacksize+=STACKINCREMENT ;
}
*S.top=e; S.top++ ; /* 栈顶指针加1,e成为新的栈顶 */
return OK;