链表初级知识求助

下面是单链表的删除操作函数, p和q都是LinkList类型,也就是链表节点类型,为什么还有 q = p->next这种操作,将一个节点的指针域复制赋值给另一个节点?

typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(LinkList *L,int i,ElemType *e) 
{ 
    int j;
    LinkList p,q;
    p = *L;
    j = 1;
    while (p->next && j < i)    /* 遍历寻找第i个元素 */
    {
        p = p->next;
        ++j;
    }
    if (!(p->next) || j > i) 
        return ERROR;           /* 第i个元素不存在 */
    q = p->next;
    p->next = q->next;    /* 将q的后继赋值给p的后继 */
    *e = q->data;               /* 将q结点中的数据给e */
    free(q);                    /* 让系统回收此结点,释放内存 */
    return OK;
}
92 views
Comments
登录后评论
Sign In
·

按照我的理解,应该是q->next = p->next;

·

虽然你代码并没有放完整,但是好像还是能推断出来一些信息的,你p、q都用的是->操作,说明他们至少是一个指针,所以你的“p和q都是LinkList类型,也就是链表节点类型”这句话有错误的,并不是结点类型,而是结点指针类型,然后就和节点的指针域类型保持一致了,然后LinkList p,q;这句话类型是一样的,说明不是#define简单替换,应该是typedef struct Node* LinkList;,也就印证了是结点指针类型的猜想

·

->箭头运算符的左操作数必须是一个指针,它指向一个结构或联合类型,所以p和q都是指针

一般情况下,在你代码中的while循环结束时,指针p已经指向了单链表中将要删除的节点的前一个节点,所以p->next就是将要删除的节点

q=p->next,那么指针q就指向了将要删除的节点

接下来,让将要删除的节点的前一个节点的下一个节点不再是将要删除的节点,而是将要删除的节点的下一个节点,即p->next=q->next

这时删除操作已经完成,然后再通过指针q来找到已被删除的节点中的数据,即q->data