线性链表实现注意事项

来源:互联网 发布:一条sql删除 重复数据 编辑:程序博客网 时间:2024/06/02 18:58
使用单链表实现线性表时,应该特别注意插入和删除操作。

#define OK 0
#define ERROR 1
#define OVERFLOW 1

typedef int ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode *next;   
}LNode, *LinkList;

//在含头节点单链表list中第insertIndex个位置之前插入新的数据元素insertElement,list的长度加1
status linkListInsert(LinkList list, int insertIndex, ElemType insertElement)
{
    int index;
    LNode *p;
    LNode *q;

    //寻找第insertIndex个元素的前驱,p指向其前驱
    for(index=0, p=list; index<insertIndex-1 && p!=NULL; ++index, p=p->next)/*空语句*/;
    //p===NULL表示insertIndex>链表list的长度+1,index>insertIndex-1表示insertIndex<1
    if(p==NULL || index>insertIndex-1)
    {
        printf("Invalid index!/n");
        return ERROR;
    }

    q = (LNode *)malloc(sizeof(LNode));
    if(q == NULL)
    {
        printf("Overflow/n");
        exit(OVERFLOW);
    }
    //元素q为要添加的元素,元素p为要添加元素的前驱
    q->data = insertElement;
    q->next = p->next;
    p->next = q;
    return OK;
}

//删除线性表list中第deleteIndex个数据元素,并用deletedElement返回其值,list的长度减1
status linkListDelete(LinkList list, int deleteIndex, ElemType *deletedElement)
{
    int index;
    //p指向第deleteIndex个数据元素
    LNode *p;
    //q始终指向p的前驱
    LNode *q;

    //寻找第deleteIndex个元素,p指向该元素,q指向其前驱
    for(index=1, q=list, p=list->next; index<deleteIndex && p!=NULL; ++index, q=p, p=p->next)/*空语句*/;
    //p===NULL表示deleteIndex>链表list的长度,index>deleteIndex表示deleteIndex<1
    if(p==NULL || index>deleteIndex)
    {
        printf("Invalid index!/n");
        return ERROR;
    }

    //p指向要删除的元素,q指向其前驱
    q->next = p->next;
    //用deletedElement返回删除的元素
    *deletedElement = p->data;
    free(p);
    return OK;
}

插入,删除操作中都应该寻找插入或删除位置的前一个位置,因为插入或删除元素后要相应的修改其指针。但是删除操作有一点和插入操作不一样,删除位置的元素必须存在。
原创粉丝点击